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

139

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

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

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

Sk.Azad
источник
Что +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

Kaey
источник
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>
Elbuild
источник
Вы знаете, какое приложение я могу использовать для просмотра документа, и можете ли вы предоставить мне его код?
Нишат Джахан
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

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

iOS
источник
1

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

Баззрик
источник
1

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

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

iphondroid
источник
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

Для PayPal добавьте ниже схемы URL-адресов:

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

Обратитесь по этой ссылке

Навин Кумар М
источник
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>
Приложение Vini
источник
-1

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

число_x
источник