CFBundleURLName是否必须与CFBundleIdentifier匹配?

7

如果我想要iOS应用程序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匹配,但实际上似乎是这样的。或者我错过了什么?

谢谢!

2个回答

8
不需要匹配这两个属性,我没有像你一样遇到这个问题,我的应用程序标识符 - CFBundleIdentifier - 设置为com.djp.myapp,而 url 方案设置为CFBundleURLName设置为nothing.like.the.identifierCFBundleURLSchemes设置为abcd
我可以通过调用abcd://来打开此应用程序。
我能想到唯一可能会给您带来问题的是,如果您在设置 url 方案时运行了应用程序,并且在测试期间更改了您的捆绑标识符(CFBundleIdentifier),那么实际上在系统中存在两个应用程序。 在这种情况下,您将拥有一个 url 方案冲突,并且苹果公司表示没有任何确定哪个应用程序将优先的过程。

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

此外,根据我的测试和经验,如果你有两个冲突的应用程序,似乎会使用第一个安装的应用程序,当删除该应用程序后,现在仅支持特定URL方案的第二个应用程序仍然不会被使用。
这表明URL方案是在安装时向系统注册的,需要重新安装该应用程序才能按预期在这些方案上工作。
有关URL方案的更多信息,请查看Apple Advances App Tricks文档。

2
我认为原因是你没有指定CFBundleTypeRole键,该键指示你的应用程序是查看器、编辑器、shell或其他类型。在自定义URL方案中,这个键是必需的。
注意:当你将它设置为“None”时,OSX不会启动你的应用程序。
你可以从这里获取信息 Apple开发者文档

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