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?


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.


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


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> 

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


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


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>

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


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


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.


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://mailto?bob@gmail.com

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


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.



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>

-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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.