iOS 9无法使用URL SCHEME打开Instagram应用


138

以下网址在iOS 8.3和更低版本上打开,但在iOS 9和更高版本上不起作用

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

为什么URL无法打开?


什么+canOpenURL:回报?
thelaws 2015年

你遇到了什么错误?这不是关于xcode的问题。
2015年

它无法通过“ 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>
Kamleshwar

Answers:


210

iOS 9对URL方案的处理进行了小的更改。您必须将您的应用程序调用的网址列入白名单,以使用中的LSApplicationQueriesSchemes密钥Info.plist

请在此处查看帖子:http : //awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes

主要结论是:

如果您对不在白名单中的URL调用“ canOpenURL”方法,则即使安装了已注册用于处理此方案的应用程序,该方法也会返回“ NO”。将会出现“此应用程序不允许查询方案xxx”的系统日志条目。

如果您对不在白名单中的URL调用“ openURL”方法,则该方法将自动失败。将会出现“此应用程序不允许查询方案xxx”的系统日志条目。

作者还推测这是操作系统的错误,Apple会在后续版本中修复此错误。


23
为了澄清起见,请勿在要在LSApplicationQueriesSchemes数组中列入白名单的特定应用程序的字符串中包括“://”,即“ comgooglemaps://”。如果您确实包含“://”,则canOpenUrl:将返回NO并提供“此应用程序不允许查询方案xxx” syslog /错误。但是,当您实际调用canOpenUrl:时,仍必须包含冒号,即canOpenUrl:@“ comgooglemaps:”。
EmphaticArmPump

5
实际上,苹果确实在最近的更新中对此进行了修复。-openURL:即使-canOpenURL:受到限制,也始终有效。
蒂姆·约翰森

这有什么意义?如果我可以只列出plist中的所有内容并仍然进行查询,那么安全性在哪里?
Maciej Swic

@MaciejSwic原因之一是您必须重新提交给Apple才能更改列表。
thelaws 2015年

请注意,所有这些都仅与根据iOS SDK 9编译的应用程序有关。“如果你不与iOS SDK 9.0重新编译,你的应用仅限于50个不同的方案(以canOpenURL调用之后返回NO)”,作为指定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>

*前三场比赛的Facebook(FBSDK 4.6):fbapi,fbauth2,fbshareextension。“ Ha”是指手套


Thx,我认为v需要在列表中添加“ fb”
siva krishna 2015年

1
@sivakrishna fb在此处未提及developers.facebook.com/docs/ios/ios9
Matthieu Rouif 2015年

但是,如果我想重定向到任何人脸书页面,例如“ facebook.com / .... ”,则在添加fb之后仅添加其wrkng
siva krishna

差不多了 在2015年10月,我收到了一些来自Facebook分享对话框的怪异URL的失败。我将它们添加为答案,请随时将其添加到您的确是正确的。
elbuild

1
Ha://add/[username]迅速添加朋友们的表情3
EssamSoft '17

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:。它会告诉您打开是否成功。
Leo Natan

是的,但是canOpenURL不能使用,因此我们不能告诉用户它是否可以工作,他只能自己尝试。
乔尼2015年

我想打开谷歌地图,我必须在urlscheme中放些什么?
编码

25

假设有两个应用程序TestA和TestB。TestB要查询是否已安装TestA。“ TestA”在其info.plist文件中定义以下URL方案:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>testA</string>
        </array>
    </dict>
</array>

第二个应用程序“ TestB”尝试通过调用以下命令来确定是否安装了“ TestA”:

[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"TestA://"]];

但这通常会在iOS9中返回NO,因为“ TestA”需要添加到TestB的info.plist文件中的LSApplicationQueriesSchemes条目中。这是通过将以下代码添加到TestB的info.plist文件中来完成的:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>TestA</string>
</array>

一个有效的实现可以在这里找到:https : //github.com/gatzsche/LSApplicationQueriesSchemes-Working-Example


等待,不是应该在TestB应用程序的into.plist中使用LSApplicationQueriesSchemes键的字符串值作为“ testA”吗?
Nik Yekimov '16

22

从2015年的703会议WWDC:

在为iOS 9构建应用程序时,您可以继续使用URL方案,并且要调用URL方案,现在需要在应用程序Info.plist中声明它们。有一个新密钥,LSApplicationQueriesSchemes在这里您将需要添加canOpenURL所在的方案列表。

例如,在FB的情况下


1
是的,不是。即使使用info.plist,它仍然无法使用comgooglemaps
Radu

您找到解决办法了吗?
Salman Hasrat Khan

1
一幅图片值一千个字。感谢您的截图。这就是我所需要的。
sean808080

3

即使使用@Matthieu答案,Facebook在共享对话框中的共享也会失败(对于其余社交URL而言100%正确)。我必须添加从Facebook SDK反向的一组URL。

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

您知道我可以使用哪个应用程序查看文档,可以为我提供代码吗?
Nishat Jahan

2

在Swift 4.2和Xcode 10.1中

在info.plist中需要添加CFBundleURLSchemes和LSApplicationQueriesSchemes。

->在您的项目中选择info.plist,

->右键单击,

->选择打开为 源代码

请参阅以下屏幕截图

在此处输入图片说明

-> xml文件将被打开

->复制-粘贴以下代码,并替换为您的ID

gmail,fb,twitter和已链接的CFBundleURLSchemes和LSApplicationQueriesSchemes。

<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方案。如果您正在运行越狱设备,请确保在Cydia中更新Patcyh


1

那么,您可以直接致电openURL:openURL:options:completionHandler:(从iOS 10开始)打开应用程序,而无需进行条件检查canOpenURL:。请阅读讨论部分苹果文档的canOpenURL:方法其中说:

openURL:方法不受LSApplicationQueriesSchemes要求的限制。


0

似乎没有人解决过如何使用嵌入式参数指定URL。任何包含参数的URL都无法在LSApplicationsQueriesSchemes中指定特定的URL。例如,假设我有一个通过发件人电子邮件地址的电子邮件应用程序:

myemail://mailto?bob@gmail.com

使其在iOS9中正常工作的唯一方法是删除所有参数。


4
??您应该在plist中添加的是myemail。参数在这里不起作用。
Leo Natan

0

Apple在iOS 9上更改了canOpenURL方法。正在iOS 9和iOS 10上检查URL方案的应用程序必须在提交给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版本8.2.1(8C1002))的密钥。我打开Info.plist崇高的文本,并手动将其添加到该文件,然后它的工作。只是告诉您,如果找不到密钥,只需自己添加即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.