6

如果我希望 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:”url。

任何想法为什么?

我没有看到任何 CFBundleIdentifier 必须匹配 CFBundleURLName 的 Apple 文档,但在实践中似乎就是这种情况。还是我错过了什么?

谢谢!

4

2 回答 2

7

不,这两个属性不需要匹配,我没有像你那样遇到问题,我的应用标识符 -CFBundleIdentifier设置为com.djp.myapp并且 url 方案设置CFBundleURLName为nothing.like 。 the.identifier和一CFBundleURLSchemesabcd

我可以通过调用打开这个应用程序:abcd://

我认为可能会给您带来问题的一件事是,如果您在设置 url 方案的情况下运行您的应用程序,并且在测试期间您更改了捆绑标识符 ( CFBundleIdentifier),因此实际上导致系统中存在 2 个应用程序。在这种情况下,您将遇到 url 方案冲突,并且 Apple 声明没有任何流程可以确定哪个应用程序优先。

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

同样据我测试和体验,如果您有 2 个相互冲突的应用程序,它似乎是第一个安装的应用程序,当这个应用程序被删除时,第二个应用程序现在是唯一支持特定 url 方案的应用程序仍然没有使用。

这表明 url 方案在安装时已在系统中注册,并且需要重新安装此应用程序才能使其按预期在这些方案上工作。

有关 URL 方案的更多信息,请查看Apple Advances App Tricks文档。

于 2013-01-31T13:37:22.837 回答
2

我认为原因是您没有特别指定 CFBundleTypeRole 键,它表明您的应用程序是查看器、编辑器、shell 或其他。自定义 URL 方案中需要此密钥。

注意:当您将其设置为无时,osx 将不会启动您的应用程序。

您可以从这里获取信息Apple Developer Document

于 2013-04-09T14:43:32.100 回答