iOS 9 nie otwiera aplikacji Instagram z SCHEMATEM URL

138

Poniższy adres URL otwiera się w systemie iOS 8.3 i starszym, ale nie działa i iOS 9

let instagramURL = NSURL(string: "instagram://app")

Dlaczego adres URL się nie otwiera?

Sk.Azad
źródło
Co +canOpenURL:wraca?
thelaws
Jaki błąd otrzymujesz? To nie jest kwestia xcode .
JAL
Nie udaje się „jeśli UIApplication.sharedApplication (). CanOpenURL (instagramURL!)” Sprawdzanie
Sk.Azad
Zobacz artykuł tutaj: awkwardhare.com/post/121196006730/ ... W iOS 9 musisz określić, jakich schematów adresów URL szuka Twoja aplikacja (sam tego nie zrobiłem)
thelaws
3
Dodaj to do swojego pliku info.plist <key> LSApplicationQueriesSchemes </key> <array> <string> URLScma1 </string> <string> URLScma2 </string> <string> URLScma3 </string> </array>
Kamleshwar

Odpowiedzi:

210

iOS 9 dokonał niewielkiej zmiany w obsłudze schematu URL. Musisz umieścić na białej liście adresy URL, które aplikacja będzie wywoływać przy użyciu LSApplicationQueriesSchemesklucza z pliku Info.plist.

Zobacz post tutaj: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes

Główny wniosek jest taki, że:

Jeśli wywołasz metodę „canOpenURL” w przypadku adresu URL, którego nie ma na Twojej białej liście, zwróci ona wartość „NIE”, nawet jeśli jest zainstalowana aplikacja, która została zarejestrowana do obsługi tego schematu. Zostanie wyświetlony wpis syslog „Ta aplikacja nie może wysyłać zapytań o schemat xxx”.

Jeśli wywołasz metodę „openURL” w przypadku adresu URL, którego nie ma na Twojej białej liście, po cichu zakończy się niepowodzeniem. Zostanie wyświetlony wpis syslog „Ta aplikacja nie może wysyłać zapytań o schemat xxx”.

Autor spekuluje również, że jest to błąd w systemie operacyjnym i Apple naprawi to w kolejnej wersji.

prawa
źródło
23
Dla wyjaśnienia NIE umieszczaj „: //” w ciągu znaków określonej aplikacji, która ma zostać umieszczona na białej liście w tablicy LSApplicationQueriesSchemes, tj. „Comgooglemaps: //”. Jeśli dodasz „: //” canOpenUrl: zwróci NIE i dostarczy „Ta aplikacja nie może wysyłać zapytań o schemat xxx” syslog / error. Jednakże, kiedy faktycznie wywołujesz canOpenUrl: nadal musisz uwzględnić dwukropek, tj. CanOpenUrl: @ "comgooglemaps:".
EmphaticArmPump
5
W rzeczywistości Apple naprawił to w ostatniej aktualizacji. -openURL:zawsze działa, mimo że -canOpenURL:jest ograniczony.
Tim Johnsen
Jaki to ma sens? Gdzie jest bezpieczeństwo, jeśli mogę po prostu wymienić wszystko w plist i nadal o to pytać?
Maciej Swic
@MaciejSwic Jednym z powodów jest to, że nie możesz zmienić listy bez ponownego przesłania jej do Apple.
thelaws
Zauważ, że wszystko to dotyczy tylko aplikacji skompilowanych na iOS SDK 9. „Jeśli nie dokonujesz ponownej kompilacji z iOS SDK 9.0, Twoja aplikacja jest ograniczona do 50 różnych schematów (wywołania canOpenURL zwracają potem NIE)”, jak określono na developers.facebook.com/docs/ios/ios9
mkll
158

Jak wspomniano powyżej, chcesz dodać klucz do listy informacyjnej, oto lista większości sieci społecznościowych

<key>LSApplicationQueriesSchemes</key>
    <array>
     <string>fb</string>
     <string>fbapi</string>
     <string>fbauth2</string>
     <string>fbshareextension</string>
     <string>fb-messenger-api</string>
     <string>twitter</string>
     <string>viber</string>
     <string>whatsapp</string>
     <string>wechat</string>
     <string>line</string>
     <string>instagram</string>
     <string> instagram-stories</string>
     <string>kakaotalk</string>
     <string>mqq</string>
     <string>vk</string>
     <string>comgooglemaps</string>
     <string>googlephotos</string>
     <string>ha</string>
     <string>yammer</string>
    </array>

* Pierwsze 3 pasują do Facebooka (FBSDK 4.6): fbapi, fbauth2, fbshareextension. „Ha” oznacza snapchat

Matthieu Rouif
źródło
Dzięki, myślę, że muszę dodać „fb” do listy
siva krishna
1
@sivakrishna fb nie jest tutaj wymieniony developers.facebook.com/docs/ios/ios9
Matthieu Rouif
ale jeśli chcę przekierować na jakąkolwiek stronę książki na Facebooku, taką jak „ facebook.com/ .... ", Po dodaniu fb tylko jego wrkng
siva krishna
Prawie dobrze. W październiku 2015 dostałem kilka błędów z dziwnymi adresami URL z okien dialogowych udostępniania na Facebooku. Dodałem je jako odpowiedź, nie krępuj się, aby dodać ją do twojej, co jest rzeczywiście poprawne.
elbuild
1
i Ha://add/[username]dodać znajomych snapchat w Swift 3
EssamSoft
87

Jest to nowa funkcja zabezpieczeń systemu iOS 9. Obejrzyj sesję 703 WWDC 2015, aby uzyskać więcej informacji.

Każda aplikacja zbudowana za pomocą SDK 9 musi podać LSApplicationQueriesSchemeswpis w swoim pliku plist, deklarując, które schematy próbuje zapytać.

<key>LSApplicationQueriesSchemes</key>
<array>
 <string>urlscheme</string>
 <string>urlscheme2</string>
 <string>urlscheme3</string>
 <string>urlscheme4</string>
</array> 
Leo Natan
źródło
Aby wszystko było jasne. Czy to wykluczy takie aplikacje, które pozwalają użytkownikowi wprowadzić własny schemat adresu URL + wykonać to?
Jonny
@Jonny Nie, ponieważ nadal możesz spróbować otworzyć dowolny adres URL za pomocą openURL:. I powie ci, czy otwarcie się udało, czy nie.
Leo Natan,
Tak, ale nie można użyć canOpenURL, więc nie możemy powiedzieć użytkownikowi, czy zadziała, czy nie, po prostu musi spróbować sam.
Jonny
Chcę otworzyć mapy google, co mam umieścić w schemacie url?
kodowanie
25

Zakładając dwie aplikacje TestA i TestB. TestB chce zapytać, czy TestA jest zainstalowany. „TestA” definiuje następujący schemat adresu URL w swoim pliku info.plist:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>testA</string>
        </array>
    </dict>
</array>

Druga aplikacja „TestB” próbuje sprawdzić, czy „TestA” jest zainstalowana, wywołując:

[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"TestA://"]];

Ale to zwykle zwróci NIE w iOS9, ponieważ „TestA” musi zostać dodany do wpisu LSApplicationQueriesSchemes w pliku info.plist TestB. Odbywa się to poprzez dodanie następującego kodu do pliku info.plist TestB:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>TestA</string>
</array>

Działającą implementację można znaleźć tutaj: https://github.com/gatzsche/LSApplicationQueriesSchemes-Working-Example

Awsed
źródło
czekaj, czy nie powinno to być ciągiem wartości klucza LSApplicationQueriesSchemes jako „testA” w into.plist aplikacji TestB?
Nik Yekimov
22

Od, Sesja 703 WWDC 2015:

Możesz nadal używać schematów adresów URL podczas tworzenia aplikacji na iOS 9 i chcesz wywoływać schematy adresów URL, musisz teraz zadeklarować je w swoich aplikacjach Info.plist. Jest nowy klucz, w LSApplicationQueriesSchemesktórym musisz dodać listę schematów, na których chcesz, aby można było otworzyć adres URL.

Na przykład w przypadku FB

Kaey
źródło
1
Tak, to nie to. Comgooglemaps nadal nie będzie działać, nawet z info.plist
Radu
czy znalazłeś na to poprawkę?
Salman Hasrat Khan
1
obraz jest wart 1000 słów. dzięki za zrzut ekranu. to było wszystko, czego potrzebowałem.
sean808080
3

Udostępnianie na Facebooku z okna udostępniania kończy się niepowodzeniem nawet przy odpowiedzi @Matthieu (która jest w 100% poprawna w przypadku pozostałych adresów społecznościowych). Musiałem dodać zestaw adresów URL, które odwróciłem z Facebook SDK.

<array>
        <string>fbapi</string>
        <string>fbauth2</string>
        <string>fbshareextension</string>
        <string>fb-messenger-api</string>
        <string>twitter</string>
        <string>whatsapp</string>
        <string>wechat</string>
        <string>line</string>
        <string>instagram</string>
        <string>kakaotalk</string>
        <string>mqq</string>
        <string>vk</string>
        <string>comgooglemaps</string>
        <string>fbapi20130214</string>                                                    
        <string>fbapi20130410</string>                                                     
        <string>fbapi20130702</string>                                                    
        <string>fbapi20131010</string>                                                    
        <string>fbapi20131219</string>                                                    
        <string>fbapi20140410</string>                                                     
        <string>fbapi20140116</string>                                                     
        <string>fbapi20150313</string>                                                     
        <string>fbapi20150629</string>
    </array>
elbuild
źródło
Czy wiesz, której aplikacji mogę użyć do przeglądania dokumentu i czy możesz podać mi do tego kod?
Nishat Jahan
2

W Swift 4.2 i Xcode 10.1

W info.plist trzeba dodać CFBundleURLSchemes i LSApplicationQueriesSchemes.

-> Wybierz info.plist w swoim projekcie,

-> prawy przycisk myszy,

-> Wybierz opcję Otwórz jako kod źródłowy

Zobacz poniższy zrzut ekranu

wprowadź opis obrazu tutaj

-> plik xml zostanie otwarty

-> kopiuj - wklej poniższy kod i zamień na swoje ID

CFBundleURLSchemes i LSApplicationQueriesSchemes dla Gmaila, Fb, Twittera i połączonych.

<key>CFBundleURLTypes</key>
    <array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>li5****5</string>
            <string>com.googleusercontent.apps.8***************5f</string>
            <string>fb8***********3</string>
            <string>twitterkit-s***************w</string>
        </array>
    </dict>
</array>
<key>FacebookAppID</key>
<string>8*********3</string>
<key>FacebookDisplayName</key>
<string>K************ app</string>
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>fbapi</string>
    <string>fb-messenger-share-api</string>
    <string>fbauth2</string>
    <string>fbshareextension</string>

    <string>twitter</string>
    <string>twitterauth</string>

    <string>linkedin</string>
    <string>linkedin-sdk2</string>
    <string>linkedin-sdk</string>

</array>

Zobacz poniższy ekran, w którym znajduje się Twój ostateczny plik info.plist

wprowadź opis obrazu tutaj

iOS
źródło
1

Należy zauważyć, że w telefonach 9.0.x był błąd związany z telefonami po jailbreaku, który zepsuł schematy adresów URL. Jeśli używasz urządzenia z jailbreakiem, upewnij się, że zaktualizowałeś Patcyh w Cydii

Buzzrick
źródło
1

Cóż, możesz otworzyć aplikację, dzwoniąc openURL:lub openURL:options:completionHandler:(od iOS 10) bezpośrednio, bez wykonywania kontroli warunkowej canOpenURL:. Przeczytaj sekcję dyskusji w dokumencie Apple dla metody canOpenURL:, która mówi:

metoda openURL: nie jest ograniczona przez LSApplicationQueriesSchemeswymaganie.

iphondroid
źródło
0

Wygląda na to, że nikt nie zajął się określaniem adresów URL z osadzonymi parametrami. Dowolny adres URL zawierający parametry, których nie będzie można określić w LSApplicationsQueriesSchemes. Załóżmy na przykład, że mam aplikację pocztową, która przekazuje adres e-mail nadawcy:

myemail://[email protected]

Jedynym sposobem, w jaki wydaje się, aby działał w iOS9, jest usunięcie jakichkolwiek parametrów.

Dave
źródło
4
Co? Na liście należy dodać myemail. Parametry nie odgrywają tutaj żadnej roli.
Leo Natan
0

Firma Apple zmieniła metodę canOpenURL w systemie iOS 9. Aplikacje, które sprawdzają schematy adresów URL w systemach iOS 9 i iOS 10, muszą zadeklarować te schematy w momencie przesyłania do Apple.

Nish
źródło
0

W przypadku PayPal dodaj poniższe schematy adresów URL:

wprowadź opis obrazu tutaj

Skorzystaj z tego łącza

Naveen Kumar M
źródło
0

Swift 3.1, Swift 3.2, Swift 4

if let urlFromStr = URL(string: "instagram://app") {
    if UIApplication.shared.canOpenURL(urlFromStr) {
        if #available(iOS 10.0, *) {
            UIApplication.shared.open(urlFromStr, options: [:], completionHandler: nil)
        } else {
            UIApplication.shared.openURL(urlFromStr)
        }
    }
}

Dodaj te w Info.plist:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>instagram</string>
</array>
Vini App
źródło
-1

Kiedy dzisiaj próbowałem zadzwonić do Facebooka z mojej własnej aplikacji, stwierdziłem, że nie ma LSApplicationQueriesSchemesklucza, który mogę dodać do Info.plist(Xcode wersja 8.2.1 (8C1002)). Otworzyłem za Info.plistpomocą Sublime Text i ręcznie dodałem go do pliku, a potem zadziałało. Tylko po to, abyś wiedział, że jeśli nie możesz znaleźć klucza, po prostu dodaj go samodzielnie.

liczba_x
źródło