iOS 9 не открывает приложение Instagram с URL-схемой


139

Следующий URL открывается в iOS 8.3 и ниже, но не работает в iOS 9.

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

Почему не открывается URL-адрес?


Что +canOpenURL:возвращается?
thelaws

Какую ошибку вы получаете? Это не вопрос о xcode .
JAL

Не удается проверить "if UIApplication.sharedApplication (). CanOpenURL (instagramURL!)"
Sk.Azad

См. Статью здесь: awkwardhare.com/post/121196006730/… В iOS 9 вы должны указать, какие схемы URL- адресов ищет ваше приложение (я сам этого не делал)
thelaws

3
Добавьте это в свой файл info.plist <key> LSApplicationQueriesSchemes </key> <array> <string> URLScma1 </string> <string> URLScma2 </string> <string> URLScma3 </string> </array>
Камлешвар

Ответы:


212

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 исправит ее в следующем выпуске.


24
В качестве пояснения НЕ включайте «: //» в строку конкретного приложения, которое будет добавлено в белый список в массиве LSApplicationQueriesSchemes, то есть «comgooglemaps: //». Если вы включите ": //", canOpenUrl: вернет NO и предоставит системный журнал / ошибку «Этому приложению не разрешено запрашивать схему xxx». Однако, когда вы выполняете фактический вызов canOpenUrl: вы все равно должны включать двоеточие, то есть canOpenUrl: @ "comgooglemaps:".
EmphaticArmPump

5
Фактически, Apple исправила это в недавнем обновлении. -openURL:всегда работает, хотя -canOpenURL:и ограничен.
Тим Джонсен

какой в ​​этом смысл? Где безопасность, если я могу просто перечислить все в списке и по-прежнему запрашивать это?
Maciej Swic

@MaciejSwic Одна из причин заключается в том, что вы не можете изменить список без повторной отправки в Apple.
thelaws

Обратите внимание, что все это относится только к приложениям, скомпилированным с использованием iOS SDK 9. «Если вы не перекомпилируете с iOS SDK 9.0, ваше приложение ограничено 50 различными схемами (впоследствии вызовы canOpenURL возвращают НЕТ)», как указано на developers.facebook.com/docs/ios/ios9
mkll

162

Как было сказано выше, вы хотите добавить ключ в информационный список, вот список для большинства социальных сетей.

<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. «Ха» для снэпчат


Спасибо, я думаю, вам нужно добавить "fb" к списку
шива кришна

1
@sivakrishna fb здесь не упоминается developers.facebook.com/docs/ios/ios9
Матье Руиф

но если я хочу перенаправить на любую страницу фейсбука, например " facebook.com/ .... ", после добавления fb только его wrkng
krishna

Почти хорошо. В октябре 2015 года у меня возникли проблемы со странными URL-адресами в диалоговых окнах общего доступа Facebook. Я добавил их в качестве ответа, не стесняйтесь добавлять его к своему, что действительно правильно.
elbuild

1
и Ha://add/[username]добавить друзей в снэпчат в Swift 3
EssamSoft

87

Это новая функция безопасности 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> 

Чтобы прояснить ситуацию. Будет ли это исключать такие приложения, которые позволяют пользователю вводить свою собственную схему URL + выполнять ее?
Джонни

@Jonny Нет, потому что вы все равно можете попытаться открыть любой URL, используя openURL:. И он скажет вам, было ли открытие успешным или нет.
Лео Натан

Да, но canOpenURL нельзя использовать, поэтому мы не можем сказать пользователю, будет он работать или нет, он просто должен попробовать сам.
Джонни

Я хочу открыть карты Google, что мне добавить в схему URL?
coding22

25

Предполагая, что два приложения 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


подождите, не должно быть строковое значение ключа LSApplicationQueriesSchemes как "testA" в into.plist приложения TestB?
Ник Екимов

22

От, сессия 703 WWDC 2015:

Вы можете продолжать использовать схемы URL-адресов, когда создаете приложение для iOS 9 и хотите вызывать схемы URL-адресов, теперь вам нужно будет объявить их в Info.plist ваших приложений. Появился новый ключ, LSApplicationQueriesSchemesи здесь вам нужно будет добавить список схем, для которых вы хотите использовать canOpenURL.

Например, в случае FB


1
Да, это не так. Comgooglemaps по-прежнему не работает, даже с info.plist
Раду

ты нашел исправление для этого?
Салман Хасрат Хан

1
картинка стоит 1000 слов. спасибо за скриншот. это было все, что мне было нужно.
sean808080 03

3

Публикация в 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>

Вы знаете, какое приложение я могу использовать для просмотра документа, и можете ли вы предоставить мне его код?
Нишат Джахан

2

В 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

введите описание изображения здесь


1

Важно отметить, что в 9.0.x была ошибка с взломанными телефонами, которая нарушала схемы URL. Если вы используете взломанное устройство, обязательно обновите Patcyh в Cydia.


1

Что ж, вы можете открыть приложение, позвонив openURL:или openURL:options:completionHandler:(iOS 10 и выше) напрямую, не выполняя условную проверку canOpenURL:. Прочтите раздел обсуждения метода canOpenURL: в документации Apple, в котором говорится:

метод openURL: не ограничен LSApplicationQueriesSchemesтребованиями.


0

Кажется, никто не обращался к тому, как указать URL-адреса со встроенными параметрами. Любой URL-адрес, содержащий параметры, невозможно указать конкретный URL-адрес в LSApplicationsQueriesSchemes. Например, предположим, что у меня есть почтовое приложение, которое передает адрес электронной почты отправителя:

myemail://mailto?bob@gmail.com

Единственный способ заставить его работать в iOS9 - это удалить какие-либо параметры.


4
А? В список следует добавить myemail. Параметры здесь не играют роли.
Лео Натан,

0

Apple изменила метод canOpenURL в iOS 9. Приложения, которые проверяют схемы URL-адресов в iOS 9 и iOS 10, должны объявлять эти схемы в том виде, в каком они отправляются в Apple.



0

Свифт 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>

-1

Когда я сегодня попытался позвонить в Facebook из моего собственного приложения, я обнаружил, что нет LSApplicationQueriesSchemesключа, который я мог бы добавить в Info.plist(Xcode Version 8.2.1 (8C1002)). Я открыл с Info.plistпомощью Sublime Text и вручную добавил его в файл, после чего все заработало. Просто чтобы вы знали, что если вы не можете найти ключ, просто добавьте его самостоятельно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.