【问题标题】:iOS Action Extension not opening my main appiOS 操作扩展未打开我的主应用程序
【发布时间】:2019-10-19 16:34:39
【问题描述】:

我希望能够在我的应用中打开 Safari 链接。为此,我创建了一个动作扩展。我尝试了以下代码的多种变体来测试,但它们都没有打开我的主应用程序:

第一次尝试:

func openContainerApp() {
        var responder: UIResponder? = self as UIResponder
        let selector = #selector(openURL(_:))
        while responder != nil {
            if responder!.responds(to: selector) && responder != self {
                responder!.perform(selector, with: URL(string: "awesome://item?id=20036169")!)
            }
            responder = responder?.next
        }
        self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
    }

第二次尝试:

func redirectToHostApp() {
        let url = URL(string: "awesome://item?id=20036169")
        let selectorOpenURL = sel_registerName("openURL:")
        let context = NSExtensionContext()
        context.open(url! as URL, completionHandler: nil)

        var responder = self as UIResponder?

        while (responder != nil){
            if responder?.responds(to: selectorOpenURL) == true{
                responder?.perform(selectorOpenURL, with: url)
            }
            responder = responder!.next
        }

    }

我在我的主应用程序中添加了“很棒”的 URL 方案。我还在我的应用委托中为所有可能的 openURL 委托方法返回“true”:

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        return true
    }

    func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
        return true
    }

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        return true
    }

我已将操作扩展中的 NSExtensionActivationSupportsWebURLWithMaxCount 设置为 1。

尽管如此,我的主应用还是打不开。在 Safari 中点击操作扩展没有任何作用。

我已经尝试了这些解决方案,但都没有奏效:

https://stackoverflow.com/a/28037297/1634905

https://forums.developer.apple.com/thread/65621

【问题讨论】:

    标签: ios swift uiviewcontroller ios-extensions uiresponder


    【解决方案1】:

    我自己想出来的,想分享一下,以防有人遇到同样的问题。

    我的问题是我从viwDidLoad() 调用openContainerAppredirectToHostApp 函数,而UIResponder 显然还没有准备好。

    我将函数调用移至 viewWillAppear() 并且它起作用了。

    override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            openContainerApp()
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多