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?
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?
Odpowiedzi:
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 LSApplicationQueriesSchemes
klucza 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.
-openURL:
zawsze działa, mimo że -canOpenURL:
jest ograniczony.
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
Ha://add/[username]
dodać znajomych snapchat w Swift 3
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ć LSApplicationQueriesSchemes
wpis 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>
openURL:
. I powie ci, czy otwarcie się udało, czy nie.
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
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
LSApplicationQueriesSchemes
którym musisz dodać listę schematów, na których chcesz, aby można było otworzyć adres URL.
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>
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
-> 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
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
LSApplicationQueriesSchemes
wymaganie.
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.
myemail
. Parametry nie odgrywają tutaj żadnej roli.
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>
Kiedy dzisiaj próbowałem zadzwonić do Facebooka z mojej własnej aplikacji, stwierdziłem, że nie ma LSApplicationQueriesSchemes
klucza, który mogę dodać do Info.plist
(Xcode wersja 8.2.1 (8C1002)). Otworzyłem za Info.plist
pomocą 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.
+canOpenURL:
wraca?