iOS 9 не відкриває додаток Instagram із схемою URL


138

Наступна URL-адреса відкривається на iOS 8.3 та новіших версіях, але вона не працює та iOS 9

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

Чому URL не відкриється?


Що +canOpenURL:повертає?
thelaws

Яку помилку ви отримуєте? Це не питання про xcode .
JAL

Він не вдається "якщо 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>
Kamleshwar

Відповіді:


210

iOS 9 внесла невеликі зміни в обробку схеми URL-адрес. Ви повинні додати білий список URL-адрес, на який ваш додаток закликає використовувати LSApplicationQueriesSchemesключ у вашому Info.plist.

Будь ласка, дивіться повідомлення тут: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes

Основний висновок:

Якщо ви зателефонуєте методу "canOpenURL" за URL-адресою, яка не є у вашому дозволеному списку, вона поверне "НІ", навіть якщо встановлено додаток, який зареєстровано для обробки цієї схеми. З'явиться запис системного журналу "Цей додаток не має права запитувати схему xxx".

Якщо ви зателефонуєте до методу «openURL» за URL-адресою, яка не є у вашому дозволеному списку, вона вийде з ладу. З'явиться запис системного журналу "Цей додаток не має права запитувати схему xxx".

Автор також припускає, що це помилка з ОС, і Apple виправить це в наступному випуску.


23
Як уточнення, НЕ включайте ": //" у рядок певного додатка, який має бути включений у білий список у масиві LSApplicationQueriesSchemes, тобто "comgooglemaps: //". Якщо ви включите ": //" canOpenUrl: поверне "НІ" та надасть "цьому додатку заборонено запитувати систему xxx" syslog / error. Однак, коли ви робите фактичний виклик 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

158

Як було сказано вище, ви хочете додати ключ до інформаційного списку, ось список для більшості соціальних мереж

<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


Thx, я думаю, що вам потрібно додати "fb" до списку
siva krishna

1
@sivakrishna fb тут не згадується developers.facebook.com/docs/ios/ios9
Matthieu Rouif

але якщо я хочу , щоб перенаправити на будь-яку сторінку книги особи , як " facebook.com/....",After додавання ФБА тільки його wrkng
Шива Крішна

Майже добре. У жовтні 2015 року я отримав деякі збої із дивними URL-адресами з діалогів обміну Facebook. Я додав їх як відповідь, сміливо додайте їх до своїх, що справді правильно.
elbuild

1
і Ha://add/[username]додати друзів snapchat у швидкій 3
EssamSoft

87

Це нова функція безпеки iOS 9. Дивіться WWDC 2015 Session 703 для отримання додаткової інформації.

Будь-який додаток, побудований за допомогою SDK 9, повинен передбачати LSApplicationQueriesSchemesзапис у своєму пліст-файлі, декларуючи, які схеми він намагається запитувати.

<key>LSApplicationQueriesSchemes</key>
<array>
 <string>urlscheme</string>
 <string>urlscheme2</string>
 <string>urlscheme3</string>
 <string>urlscheme4</string>
</array> 

Щоб все було зрозуміло. Чи виключає це такі програми, які дозволяють користувачеві ввести власну схему URL-адрес + виконати це?
Джоні

@Jonny Ні, тому що ви можете спробувати відкрити будь-яку URL-адресу, використовуючи openURL:. І це скаже вам, чи відкриття було успішним чи ні.
Лев Натан

Так, але canOpenURL не можна використовувати, тому ми не можемо сказати користувачеві, спрацює чи ні, він просто повинен спробувати сам.
Джоні

Я хочу відкрити google карти, що я маю помістити в urlscheme?
кодування22,

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://"]];

Але це нормально повертає НІ у 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" у .plist програми TestB?
Нік Єкимов

22

Від, сесія 703 WWDC 2015:

Ви можете продовжувати використовувати схеми URL-адрес, коли ви створюєте додаток для iOS 9 і хочете викликати схеми URL-адрес, тепер вам потрібно буде оголосити їх у своїх додатках Info.plist. Існує новий ключ, LSApplicationQueriesSchemesі тут вам потрібно буде додати список схем, на яких ви хочете бути canOpenURL.

Наприклад, випадок FB


1
Так, це не все. Це все ще не буде працювати з comgooglemaps, навіть із інформаційним списком
Radu

ти знайшов виправлення на це?
Салман Хасрат Хан

1
малюнок вартує 1000 слів. спасибі за скріншот. це було все, що мені було потрібно.
sean808080

3

Обмін Facebook у діалоговому вікні спільного доступу не вдається навіть з відповіддю @Matthieu (що на 100% правильно для інших соціальних URL-адрес). Мені довелося додати набір URL-адрес, які я повернув від SDK Facebook.

<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:. Прочитайте розділ обговорення в Apple doc для методу canOpenURL: :

метод 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

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>

-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.