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

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


为什么无法打开该URL?

评论

+ canOpenURL:返回什么?

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

失败“如果UIApplication.sharedApplication()。canOpenURL(instagramURL!)”检查

请在此处查看文章:awkwardhare.com/post/121196006730/…在iOS 9中,您必须指定您的应用程序正在寻找的URL方案(我自己还没有做过)

将此添加到您的info.plist文件 LSApplicationQueriesSchemes URLScma1 URLScma2 URLScma3

#1 楼

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会在后续发行版中予以解决。 />

评论


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

– EmphaticArmPump
15年7月28日在18:05

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

–蒂姆·约翰森(Tim Johnsen)
15年8月12日在21:37

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

– Maciej Swic
15年8月17日在12:13

@MaciejSwic原因之一是您不能更改列表,除非重新提交给Apple。

–法律
15年8月17日在14:16

请注意,所有这些都仅与根据iOS SDK 9编译的应用程序有关。 “如果不使用iOS SDK 9.0重新编译,则您的应用程序将被限制为50个不同的方案(对canOpenURL的调用之后将返回NO)”,如developers.facebook.com/docs/ios/ios9上所指定

–mkll
2015年9月1日19:49在

#2 楼

如上所述,您想在信息列表中添加一个密钥,这是大多数社交网络的列表。

(FBSDK 4.6):fbapi,fbauth2,fbshareextension。 “ Ha”代表手套

评论


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

–siva krishna
2015年10月6日12:15



@sivakrishna fb在这里未提及developers.facebook.com/docs/ios/ios9

–马修·鲁伊夫(Matthieu Rouif)
2015年10月6日13:36

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

–siva krishna
2015年9月9日10:11

差不多了在2015年10月,我在Facebook分享对话框中使用了怪异的网址,但遇到了一些失败。我将它们添加为答案,请随时将其添加到您的确是正确的。

–elbuild
15年10月12日在11:05

和Ha:// add / [用户名]在swift 3中添加朋友们的snapchat

– EssamSoft
17年7月6日在3:11

#3 楼

这是iOS 9的新安全功能。有关更多信息,请观看WWDC 2015 Session 703。

使用SDK 9构建的任何应用都需要在其plist文件中提供LSApplicationQueriesSchemes条目,以声明其尝试查询的方案。

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


评论


弄清楚。这会否排除允许用户输入自己的URL方案并执行该方案的应用程序?

–珍妮
2015年9月17日下午1:10

@Jonny不,因为您仍然可以尝试使用openURL:打开任何URL。它会告诉您打开是否成功。

– Leo Natan
2015年9月17日下午1:29

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

–珍妮
2015年9月17日下午4:21

我想打开谷歌地图,我必须在URLscheme中放入什么?

–coding22
15 Sep 25'0:49



#4 楼

假设有两个应用程序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。 com / gatzsche / LSApplicationQueriesSchemes-Working-Example

评论


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

–尼克·耶基莫夫(Nik Yekimov)
16年4月28日在16:45

#5 楼

从Session 703 WWDC 2015开始:


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





评论


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

–拉杜
2015年11月12日23:02

您找到解决办法了吗?

– Salman Hasrat Khan
16年3月3日,12:50

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

–sean808080
17-2-3在17:21



#6 楼

即使使用@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
16年6月28日在7:07

#7 楼

在Swift 4.2和Xcode 10.1中

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

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

->右键单击

->选择“打开为源代码”

请参见以下屏幕截图



->将打开xml文件

->复制-粘贴以下代码,并用您ID的

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>


请参见下面的屏幕,您的最终信息。plist文件为



#8 楼

请务必注意,9.0.x上的越狱电话存在一个错误,该错误破坏了URL方案。如果您正在运行越狱设备,请确保在Cydia中更新Patcyh

#9 楼

好了,您可以直接调用openURL:openURL:options:completionHandler:(iOS 10及更高版本)来打开应用程序,而无需进行条件检查canOpenURL:。 >
openURL:方法不受LSApplicationQueriesSchemes要求的约束。


#10 楼

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

myemail://mailto?bob@gmail.com


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

评论


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

– Leo Natan
2015年10月3日,23:25

#11 楼

苹果在iOS 9上更改了canOpenURL方法。正在iOS 9和iOS 10上检查URL方案的应用程序必须在提交给Apple时声明这些方案。

#12 楼

对于PayPal,请在下面添加URL方案:



请参阅此链接

#13 楼

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>


#14 楼

今天,当我尝试通过自己的应用程序呼叫Facebook时,发现没有可以添加到LSApplicationQueriesSchemes(Xcode版本8.2.1(8C1002))的Info.plist密钥。我用Sublime Text打开了Info.plist并将其手动添加到文件中,然后它开始工作。只是告诉您,如果找不到密钥,只需自己添加即可。