在 swift 3.0 中从我的键盘扩展打开我的应用程序

VRA*_*ome 6 selector ios ios-app-extension custom-keyboard swift3

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

所以我尝试了以下代码:

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
 }
Run Code Online (Sandbox Code Playgroud)

它运行成功,但正如我们所知,swiftSelector("method_name:")已被弃用并#selector(classname.methodname(_:))改为使用,因此它发出警告。我想解决这个警告。所以我尝试过 Xcode 自动建议:

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

      responder?.perform(#selector(UIApplication.openURL(_:)), with: url)
 }
Run Code Online (Sandbox Code Playgroud)

也试过:

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

      responder?.perform(#selector(NSExtensionContext.open(_:)), with: url)
 }
Run Code Online (Sandbox Code Playgroud)

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

我提到了这个链接,Julio Bailon 的回答:

openURL 在操作扩展中不起作用

小智 9

斯威夫特 5.0:

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

  1. 添加 Url 类型 -> 项目 0 -> Url 方案 -> 项目 0:“yourappname”
  2. 添加 Url 类型 -> 项目 0 -> Url 方案 -> URL 标识符:“您的捆绑包 id”

转到键盘应用程序:

正确添加以下代码:

@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
        }
     }
Run Code Online (Sandbox Code Playgroud)

调用:openApp(“yourappname://您的包ID”)


Den*_*ovs 4

以下代码适用于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)
}
Run Code Online (Sandbox Code Playgroud)