如果我希望iOS App App1在设备上启动App2,那么CFBundleURLName是否需要匹配Info.plist中CFBundleURLTypes中的CFBundleIdentifier?
例如,如果我有App1
<key>CFBundleIdentifier</key>
<string>com.foo.App1</string>
...
<key>CFBundleURLTypes</key>
<array>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>fooscheme</string>
</array>
<key>CFBundleURLName</key>
<string>com.foo.App1</string>
</dict>
</array>
在上面的例子中,App2可以在App1中启动“fooscheme:”url。但是,如果我将App1的Info.plist更改为包含
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>fooscheme</string>
</array>
<key>CFBundleURLName</key>
<string>com.foo.xyz</string>
</dict>
</array>
即CFBundleURLName!= CFBundleIdentifier,然后App2再也无法在App1中启动“fooscheme:”网址。
任何想法为什么?
我没有看到CFBundleIdentifier必须与CFBundleURLName匹配的任何Apple文档,但实际情况似乎如此。或者我错过了什么?
谢谢!
答案 0 :(得分:7)
不,这两个属性不需要匹配,我没有像你那样有问题,我有我的应用标识符 - CFBundleIdentifier
- 设置为 com.djp.myapp 和设置的网址方案CFBundleURLName
设置为 nothing.like.the.identifier ,CFBundleURLSchemes
设置为 abcd 。
我可以致电:abcd://
我能想到的一件事可能会给你带来一个问题,如果你运行你的应用程序设置了url方案,并且在测试期间你改变了你的包标识符(CFBundleIdentifier
),从而实际上导致2个应用程序存在于系统中。
在这种情况下,您将遇到网址方案冲突,Apple声明没有任何流程可以确定哪个应用优先。
注意:如果有多个第三方应用注册处理相同的内容 URL方案,目前没有确定哪个应用程序的过程 将给予该计划。
另外,据我测试和体验过,如果你有2个冲突的应用程序,它似乎是第一个安装使用的应用程序,当这个应用程序被删除时,第二个应用程序,现在是唯一支持特定网址方案仍未使用。
这表明url方案在安装时已在系统中注册,并且需要安装此应用程序以使其按预期方式处理这些方案。
有关URL Schemes的更多信息,请查看Apple Advances App Tricks文档。
答案 1 :(得分:2)
我认为原因是你没有特别的CFBundleTypeRole键,表明你的应用程序是一个查看器,编辑器,shell或其他。 自定义URL方案中需要此密钥。
注意:当您将应用程序设置为“无”时,osx将不会启动您的应用程序。
您可以从此处获取信息Apple Developer Document