Следующий URL открывается в iOS 8.3 и ниже, но не работает в iOS 9.
let instagramURL = NSURL(string: "instagram://app")
Почему не открывается URL-адрес?
Следующий URL открывается в iOS 8.3 и ниже, но не работает в iOS 9.
let instagramURL = NSURL(string: "instagram://app")
Почему не открывается URL-адрес?
Ответы:
iOS 9 внесла небольшое изменение в обработку схемы URL. Вы должны внести в белый список URL-адреса, которые ваше приложение будет вызывать с помощью LSApplicationQueriesSchemes
ключа в вашем Info.plist
.
См. Сообщение здесь: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes
Главный вывод таков:
Если вы вызовете метод canOpenURL для URL-адреса, которого нет в вашем белом списке, он вернет «NO», даже если установлено приложение, зарегистрированное для обработки этой схемы. Появится запись системного журнала «Это приложение не может запрашивать схему xxx».
Если вы вызовете метод openURL для URL-адреса, которого нет в вашем белом списке, он потерпит неудачу. Появится запись системного журнала «Это приложение не может запрашивать схему xxx».
Автор также предполагает, что это ошибка ОС, и Apple исправит ее в следующем выпуске.
-openURL:
всегда работает, хотя -canOpenURL:
и ограничен.
Как было сказано выше, вы хотите добавить ключ в информационный список, вот список для большинства социальных сетей.
<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>
* Первые 3 совпадения в Facebook (FBSDK 4.6): fbapi, fbauth2, fbshareextension. «Ха» для снэпчат
Ha://add/[username]
добавить друзей в снэпчат в Swift 3
Это новая функция безопасности iOS 9. Смотрите WWDC 2015 Session 703 для получения дополнительной информации.
Любое приложение, созданное с помощью SDK 9, должно предоставить LSApplicationQueriesSchemes
запись в своем файле plist, объявляющую, какие схемы оно пытается запрашивать.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>urlscheme</string>
<string>urlscheme2</string>
<string>urlscheme3</string>
<string>urlscheme4</string>
</array>
openURL:
. И он скажет вам, было ли открытие успешным или нет.
Предполагая, что два приложения TestA и TestB. TestB хочет запросить, установлен ли TestA. TestA определяет следующую схему URL в своем файле info.plist:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>testA</string>
</array>
</dict>
</array>
Второе приложение «TestB» пытается выяснить, установлен ли «TestA», позвонив:
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"TestA://"]];
Но это обычно возвращает NO в iOS9, потому что "TestA" необходимо добавить в запись LSApplicationQueriesSchemes в файле info.plist TestB. Это делается путем добавления следующего кода в файл info.plist TestB:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>TestA</string>
</array>
Рабочую реализацию можно найти здесь: https://github.com/gatzsche/LSApplicationQueriesSchemes-Working-Example
От, сессия 703 WWDC 2015:
Вы можете продолжать использовать схемы URL-адресов, когда создаете приложение для iOS 9 и хотите вызывать схемы URL-адресов, теперь вам нужно будет объявить их в Info.plist ваших приложений. Появился новый ключ,
LSApplicationQueriesSchemes
и здесь вам нужно будет добавить список схем, для которых вы хотите использовать canOpenURL.
Публикация в Facebook из диалогового окна общего доступа не выполняется даже при ответе @Matthieu (что на 100% верно для остальных URL-адресов социальных сетей). Мне пришлось добавить набор URL-адресов, которые я перевернул из 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>
В Swift 4.2 и Xcode 10.1
В info.plist нужно добавить CFBundleURLSchemes и LSApplicationQueriesSchemes.
-> Выберите info.plist в своем проекте,
-> щелкните правой кнопкой мыши,
-> Выбрать " Открыть как исходный код"
См. Снимок экрана ниже
-> xml файл будет открыт
-> копировать - вставьте код ниже и замените своим идентификатором
CFBundleURLSchemes и LSApplicationQueriesSchemes для gmail, fb, twitter и ссылки в.
<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>
См. Экран ниже, ваш окончательный файл info.plist
Что ж, вы можете открыть приложение, позвонив openURL:
или openURL:options:completionHandler:
(iOS 10 и выше) напрямую, не выполняя условную проверку canOpenURL:
. Прочтите раздел обсуждения метода canOpenURL: в документации Apple, в котором говорится:
метод openURL: не ограничен
LSApplicationQueriesSchemes
требованиями.
Кажется, никто не обращался к тому, как указать URL-адреса со встроенными параметрами. Любой URL-адрес, содержащий параметры, невозможно указать конкретный URL-адрес в LSApplicationsQueriesSchemes. Например, предположим, что у меня есть почтовое приложение, которое передает адрес электронной почты отправителя:
myemail://mailto?bob@gmail.com
Единственный способ заставить его работать в iOS9 - это удалить какие-либо параметры.
myemail
. Параметры здесь не играют роли.
Свифт 3.1, Свифт 3.2, Свифт 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)
}
}
}
Добавьте их в Info.plist:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>instagram</string>
</array>
Когда я сегодня попытался позвонить в Facebook из моего собственного приложения, я обнаружил, что нет LSApplicationQueriesSchemes
ключа, который я мог бы добавить в Info.plist
(Xcode Version 8.2.1 (8C1002)). Я открыл с Info.plist
помощью Sublime Text и вручную добавил его в файл, после чего все заработало. Просто чтобы вы знали, что если вы не можете найти ключ, просто добавьте его самостоятельно.
+canOpenURL:
возвращается?