Следующий 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-адресу, который не находится в вашем белом списке, он вернет "НЕТ", даже если установлено приложение, зарегистрированное для обработки этой схемы. "Это приложение не разрешено запрашивать для схемы xxx" появится запись syslog.
Если вы вызываете метод "openURL" по URL-адресу, который не находится в вашем "белом списке", он будет терпеть неудачу. "Это приложение не разрешено запрашивать для схемы xxx" появится запись syslog.
Автор также предполагает, что это ошибка с ОС, и Apple исправит это в следующей версии.
Как сказано выше, вы хотите добавить ключ в информационный список, вот список для большинства социальных сетей
<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. "Ха" для Snapchat
Это новая функция безопасности 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>
Предполагая два приложения 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 в файле test.plist. Это делается путем добавления следующего кода в файл TestB info.plist:
<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 on.
Обмен 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>
Важно отметить, что была ошибка с jailbroken телефонами на 9.0.x, которые нарушили схемы URL. Если вы используете джейлбрейк-устройство, убедитесь, что вы обновили Patcyh в Cydia
Хорошо, вы можете открыть приложение, вызвав openURL:
или openURL:options:completionHandler:
(iOS 10 onwards) напрямую, не выполняя условную проверку canOpenURL:
.
Пожалуйста, прочитайте раздел обсуждения в Apple doc для canOpenURL: метод, который гласит:
метод openURL: не ограничивается требованием
LSApplicationQueriesSchemes
.
В 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
Кажется, кто-то не обращался к тому, как указывать URL-адреса со встроенными параметрами. Любой URL-адрес, содержащий параметры, не может указать конкретный URL-адрес в LSApplicationsQueriesSchemes. Например, предположим, что у меня есть приложение электронной почты, которое передает адрес электронной почты отправителей:
myemail://[email protected]
Единственный способ заставить его работать в iOS9 - удалить любые параметры.
Apple изменила метод canOpenURL на iOS 9. Приложения, проверяющие URL-схемы на iOS 9 и iOS 10, должны объявить эти Схемы, поскольку они отправлены в Apple.
Для PayPal добавьте схемы URL ниже:
Отправьте ссылку
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)
}
}
}
Добавьте их в Info.plist:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>instagram</string>
</array>
Когда я попытался позвонить Facebook из своего собственного приложения сегодня, я обнаружил, что нет ключа LSApplicationQueriesSchemes
, который я могу добавить в Info.plist
(Xcode Version 8.2.1 (8C1002)). Я открыл Info.plist
с Sublime Text и добавил его вручную в файл, затем он сработал. Просто чтобы вы знали, что если вы не можете найти ключ, просто добавьте его самостоятельно.