【问题标题】:iOS AppDelegate not getting called from custom URL [duplicate]没有从自定义 URL 调用 iOS AppDelegate [重复]
【发布时间】:2020-01-08 22:45:40
【问题描述】:

让我的自定义 URL 在我的 iOS 应用中正常工作时遇到问题。
当我在 Safari 中打开此 url bdat://hello 时,它会转换回我的应用程序,但不会调用 AppDelegate 方法。

这是方法和相关的Info.plist 数据。我将其分解为这个简单的案例,因为我在 Spotify API 上看到了同样的问题。
我还缺少其他设置吗?

// AppDelegate.swift
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    print(url)
    return true
}
// Info.plist
<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLName</key>
        <string>com.bdat.test</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>bdat</string>
        </array>
    </dict>
</array>

【问题讨论】:

  • 您确定您的应用正在运行吗?也许application(_:didFinishLaunchingWithOptions:) 会被调用。
  • ...如果它正在运行,请检查应用程序是否已连接到 Xcode。您需要更改应用程序的启动方式(不是自动启动,而是在 url 触发时),然后点击运行,然后打开 url。
  • "如果您的实现从 application(:willFinishLaunchingWithOptions:) 和 application(:didFinishLaunchingWithOptions:) 方法返回 false,则不会调用此方法。"
  • 感谢您的建议。应用程序启动时会调用 didFinishLaunchingWithOptions 并且我返回 true。我将方案更改为“等待启动可执行文件”。我仍然看到相同的行为。如果我理解正确,CFBundleURLName 并没有太大区别,但它与我的捆绑 ID 相同。
  • @Hethcox 我检查了您的 plist 代码和设置,一切正常(func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -&gt; Bool 方法有效)。很奇怪。

标签: ios swift


【解决方案1】:

此问题中的应用是在 XCode 11.x 中创建的,用于确定我的真实应用为何无法运行的测试。当 XCode 生成应用程序时,它创建了一个 SceneDelegate 和 Info.plist 中的条目来激活它。 Apple 的文档 (https://developer.apple.com/documentation/uikit/app_and_environment/scenes/specifying_the_scenes_your_app_supports_) 说您必须明确选择加入,但显然不是。即使未选中“支持多个窗口”,它也会在它生成的 SceneDelegate 中调用scene(_ scene: UIScene, openURLContexts URLContexts: Set&lt;UIOpenURLContext&gt;)。我不确定这是故意的还是 iOS/XCode 中的错误。

【讨论】:

  • 很高兴你醒悟了自去年 6 月以来发生的一切。 :) 但是,如果在点击链接时您的应用程序没有运行,那么这将不起作用。你也必须实现willConnectTo
  • 至于“故意或错误”,完全是故意的。您可能不会选择加入多个窗口,但如果您在 Info.plist 中有一个场景委托条目,那么您已经选择加入场景委托架构。它们是两个不同(尽管相关)的东西。同样,这已经是 8 个月的事情了。
  • 谢谢@matt。我要更新的应用程序没有调用 AppDelegate 方法,也没有 SceneDelegate。它根本不通知我的应用程序。这就是我认为有点错误的地方。
  • 嗨@Hethcox。 — 你说你在 Xcode 11 中创建了应用程序。好的,所以当你这样做时,它有一个场景委托。这是怎么回事?还是我完全误解了????
  • 嗨@matt。我正在努力恢复四年前编写的旧版应用程序。我不得不升级 Swift 和一堆 API 的东西,但是当第 3 方授权窗口重定向回我的应用程序时,没有调用 URL 回调时卡住了。这太旧了,以至于它没有 SceneDelegate。由于它的大小,我在 XCode 11 中创建了一个较小的测试应用程序,这就是导致这个问题的原因。新的测试应用程序有一个 SceneDelegate,但我注意到的只是 AppDelegate 方法没有在任何一个应用程序中被调用。这里的帮助最终帮助我在测试应用中找到了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 2013-11-17
相关资源
最近更新 更多