【问题标题】:Open My application from my keyboard extension in swift 3.0在 swift 3.0 中从我的键盘扩展程序打开我的应用程序
【发布时间】:2017-02-22 11:46:05
【问题描述】:

我正在尝试从我的键盘扩展程序打开。我有自定义键盘,我已经从设置中添加了该键盘。在我的自定义键盘上,有一个“显示更多”按钮,我想在单击此按钮时打开我的应用程序。

所以我尝试了以下代码:

let context = NSExtensionContext()
 context.open(url! as URL, completionHandler: nil)

 var responder = self as UIResponder?

 while (responder != nil) {

      if responder?.responds(to: Selector("openURL:")) == true {

           responder?.perform(Selector("openURL:"), with: url)
      }
      responder = responder!.next
 }

它工作成功,但正如我们所知,Selector("method_name:") 已被弃用,而是使用#selector(classname.methodname(_:)),因此它会发出警告。我想解决这个警告。所以我尝试了 Xcode 自动建议的方法:

 if responder?.responds(to: #selector(UIApplication.openURL(_:))) == true {

      responder?.perform(#selector(UIApplication.openURL(_:)), with: url)
 }

也试过了:

 if responder?.responds(to: #selector(NSExtensionContext.open(_:))) == true {

      responder?.perform(#selector(NSExtensionContext.open(_:)), with: url)
 }

我也尝试了其他可能的方法,但没有运气。如果有人知道怎么做,请告诉我。

我参考了这个链接,Julio Bailon 的回答:

openURL not work in Action Extension

【问题讨论】:

  • 找到解决方案了吗?
  • 还没有……@Danny182
  • 一些应用程序可以做到这一点。很奇怪 ???? @VRAwesome
  • 你解决了这个问题吗?
  • 那些是什么应用程序?你能说出一些吗?

标签: ios selector swift3 ios-app-extension custom-keyboard


【解决方案1】:

以下代码适用于 Xcode 8.3.3、iOS10、Swift3,没有任何编译器警告:

func openUrl(url: URL?) {
    let selector = sel_registerName("openURL:")
    var responder = self as UIResponder?
    while let r = responder, !r.responds(to: selector) {
        responder = r.next
    }
    _ = responder?.perform(selector, with: url)
}

【讨论】:

  • 知道怎么回去吗?
【解决方案2】:
 guard let url = URL(string: UIApplicationOpenSettingsURLString) else { return }
        extensionContext?.open(url, completionHandler: { (success) in
            if !success {
                var responder = self as UIResponder?
                while (responder != nil){
                    let selectorOpenURL = NSSelectorFromString("openURL:")
                    if responder?.responds(to: selectorOpenURL) == true {
                        _ = responder?.perform(selectorOpenURL, with: url)
                    }
                    responder = responder?.next
                }
            }
        })

【讨论】:

  • 或许解释一下也会有帮助。
【解决方案3】:

斯威夫特 5.0:

打开托管应用程序的 Info.plist。

  1. 添加网址类型 -> 项目 0 -> 网址方案 -> 项目 0 : "yourappname"
  2. 添加 Url Types -> Item 0 -> Url Schemes -> URL Identifier: "your bundle 身份证”

转到键盘应用程序:

正确添加以下代码:

@objc func openURL(_ url: URL) {
       return
    }

    func openApp(_ urlstring:String) {

       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: urlstring)!)
             return
          }
          responder = responder?.next
        }
     }

调用:openApp ("yourappname://your bundle id")

【讨论】:

  • 嗨,穆格,我正在照你说的做。但它不起作用。我确定 AppName 和 Bundle Id 是正确的。我可能忘记了什么?
  • 啊。好的,我删除了派生数据并重置了模拟器。它对我有用。谢谢@Muge Cevik
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 2019-10-19
  • 1970-01-01
相关资源
最近更新 更多