CFBundleURLName必须与CFBundleIdentifier匹配吗?

时间:2012-10-23 22:15:03

标签: ios iphone ipad

如果我希望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文档,但实际情况似乎如此。或者我错过了什么?

谢谢!

2 个答案:

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