相同 URL Scheme 的多个应用 - iOS

59

为了我的新应用程序,我正在使用URL方案,以便人们可以从其他应用程序或网站启动我的应用程序...“myapp://”...那么,如果AppStore中有另一个应用程序具有相同的URL方案作为我的怎么办?或者如果有人试图窃取我的URL方案会发生什么?

4个回答

48
如果两个应用程序都注册了相同的自定义URL方案,则不确定哪个应用程序将被启动。其中一个应用程序将被启动,但无法知道是哪一个。
这里有一个真正的难题。如果您的设备上有两个具有相同URL方案的应用程序,并且您删除实际启动的应用程序,则另一个应用程序在不重新启动iOS设备的情况下无法通过URL启动。
最好的解决方案是确保您的自定义URL方案不是平凡的,这样其他应用程序就很少有可能有相同的方案。

7
但是对于恶意开发者怎么办?比如说,如果我把我的URL方案设置为“Facebook://”或他们使用的其他方案,那怎么办呢?也许每次有人点击“赞”,我的应用程序就会启动,用户会看到一两个广告,我就能赚一些钱 :o (当然我不会这样做,但有些可悲的人可能会) - Albert Renshaw
22
苹果应该允许开发者在线创建URL方案,并在一开始就告知他们是否已被占用。 - Amogh Talpallikar
6
我曾有同样的疑问,也在这个帖子上找到了答案。如果苹果提供一个URL注册框架,人们就会简单地注册许多URL schemes,但它们却没有被使用。也许应该有一种方式将URL schemes与应用程序的预配文件相关联,或者像推送通知那样与开发者/临时预配文件等相关联。不管当前设置的系统如何,显然它不是安全的,正如这篇文章的提问者所指出的那样。 - Raj Pawan Gumdal
6
请注意,至少从iOS8开始,处理URL时删除应用程序的错误已经修复。 - Rog
问题:如果您有2个应用程序目标共享URL方案怎么办?在生产中,用户永远不会安装两者,但测试人员可能会。苹果不会阻止这个,对吗? - Lytic
显示剩余4条评论

16

根据苹果文档:

如果多个第三方应用程序注册以处理相同的URL方案,则无法确定选取哪个应用程序来处理该类型的URL。

引用苹果文档中的确切语句,已经连续8年:

注意: 如果有多个第三方应用程序注册以处理相同的URL方案,则目前没有确定哪个应用程序将获得该方案的过程。

来源:

截至2019年9月,苹果网站上的此部分文档已被删除。最相关的文档可能是注册您的URL方案

4

2016年更新

自2012年以来,苹果公司的政策已经发生了变化。今天他们表明不允许多个应用程序注册同一个方案。相比运行时出现冲突而言,注册时间更容易解决争议,因为它可以避免其他答案中讨论的安全问题。

注意:如果有超过一个第三方应用程序注册处理相同的URL方案,目前没有确定哪个应用程序将获得该方案的过程。

来源:https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW1


12
我有点困惑。你好像在说一个 URL scheme 不能被多个应用程序使用,但是你又加了一句“注意”说它们可以重复使用且未定义,这恰好就是2012年的回答所说的。 - Albert Renshaw
6
@Bosh,我不明白你的评论如何澄清你的答案。你所说的“registration time”是什么意思?到目前为止,我在你的答案中看不到与2012年有任何不同的地方。 - rmaddy
1
@Bosh 我想澄清一下关于注册的问题。据我所见,有两种可能的方式。1. 如果苹果看到您试图提交一个已经被另一个应用程序获取的URL的应用程序,他们将拒绝该应用程序。2. 苹果完全允许上传具有相同URL方案的应用程序到AppStore,但是当您下载一个具有已经由手机上的另一个应用程序支持的URL的应用程序时,它将简单地忽略您的应用程序作为该URL的支持应用程序? - Bagrat Kirakosian
2
@Bosh,我认为您误解了文档。“如果有多个第三方应用程序注册处理相同的URL方案”-->这意味着2个应用程序可以注册相同的方案,这意味着您的答案是错误的。 - Vincent
5
@Vincent 我认为你是对的,现在的文档似乎说的是2012年最初的内容(不确定是否有过更改),两个应用程序仍然可能存在URL方案冲突问题。我在Bosh的回答中搜索了斜体引用,并没有找到除了这篇文章和这篇文章的存档网站之外带有这些单词的URL。 - Albert Renshaw
显示剩余7条评论

2
如其他答案所述,在此线程中,多个应用程序注册为能够处理特定自定义URL方案是完全可以接受的。如果设备上安装了两个或更多已注册为能够处理特定自定义URL方案的应用程序,则无法确定系统在运行时将选择哪个应用程序。
如果对于您的特定用例而言,重要的是仅有您的应用程序被注册为能够处理特定URL,则应优先使用通用链接而不是自定义URL方案。通用链接是标准的HTTP或HTTPS链接。通用链接的大致想法是,在安装您的应用程序时,系统会检查存储在您的Web服务器上的文件,以验证您的网站允许您的应用程序代表其打开URL。如果在打开此类URL时设备上未安装您的应用程序,则系统会像平常一样在Safari中打开URL,使您的网站来处理它。
有关通用链接和自定义URL schemes的更多信息,请参阅允许应用程序和网站链接到您的内容文档页面。

根据当前的苹果文档,URL方案也由应用程序标识字符串支持:您使用的标识符可以将您的应用程序与声明支持相同方案的其他应用程序区分开来。为确保唯一性,请指定一个反向DNS字符串,其中包含您公司的域和应用程序名称。虽然使用反向DNS字符串是最佳实践,但它不能防止其他应用程序注册相同的方案并处理相关链接。请改用通用链接而不是自定义URL方案来定义与您的网站唯一关联的链接。 - Sorin Dolha
@SorinDolha,从您分享的引用和文档页面(即this页面)中并不清楚系统如何使用标识符来区分声明支持相同方案的多个应用程序。如果您能提供解释,那就太好了。 - Adil Hussain
1
抱歉,评论中没有足够的字符来包含链接。这是链接:https://developer.apple.com/documentation/xcode/allowing_apps_and_websites_to_link_to_your_content/defining_a_custom_url_scheme_for_your_app#2928963。但不幸的是,我没有找到任何关于系统如何使用标识符来决定启动哪个应用程序或是否将其用于任何内容的信息。然而,在其他几个关于此主题的线程中,一些人通过实验得出结论,建议第一个安装了使用相同方案的应用程序将被调用。 - Sorin Dolha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接