ios 11 imessage 扩展 message.url 无法打开 safari

ios 11 imessage extension message.url does not open safari

我正在向我的应用添加一个 iMessage extension 目标。该扩展应该发送一条具有 url 属性的消息。当用户触摸消息时,我期望的行为是使用消息的 url 属性打开浏览器。

我的 messageView 中有一个按钮可执行此代码:

@IBAction func labelButton(_ sender: Any) {
        let layout = MSMessageTemplateLayout()
        layout.imageTitle = "iMessage Extension"
        layout.caption = "Hello world!"
        layout.subcaption = "Test sub"
        guard let url: URL = URL(string: "https://google.com") else { return }

        let message = MSMessage()
        message.layout = layout
        message.summaryText = "Sent Hello World message"
        message.url = url

        activeConversation?.insert(message, completionHandler: nil)
    }

如果我触摸消息,它会扩展 MessageViewController

然后我添加了这个:

override func didSelect(_ message: MSMessage, conversation: MSConversation) {

        if let message = conversation.selectedMessage {
            // message selected

            // Eg. open your app:
            self.extensionContext?.open(message.url!, completionHandler: nil)
        }
}

现在,当我触摸消息时,它会打开我的主应用程序,但仍然不是我的浏览器。

我在 another post (where I cannot comment, thus I opened this post) that it is impossible to open in Safari but I have a news app 上看到它在文章中插入 links 并允许在安装应用程序时单击消息在浏览器 window 中打开文章.

所以,有人可以告诉我如何继续在浏览器 window 中强制打开 link 吗?

非常感谢。

这是在消息中插入 link 的技巧。它不允许创建具有 url 属性的对象,而只是直接插入一个 link,它将在 Safari.

中打开
activeConversation?.insertText("https://google.com", completionHandler: nil)

我发布了 sample on github 展示如何从 iMessage 扩展程序内部启动 URL。它只使用固定的 URL 但启动代码是您所需要的。

正在从我的 readme

复制

显而易见的尝试是 self.extensionContext.open,即 documented,因为 要求系统代表当前 运行 打开一个 URL应用扩展。

那是行不通的。但是,您可以迭代返回响应者链以找到适合 open 方法的处理程序(实际上是 iMessage 实例)并使用该对象调用 open

此方法适用于 URLs,它将打开本地应用程序,例如相机设置,或网络 URLs。

主要code

@IBAction public func onOpenWeb(_ sender: UIButton)  {
    guard let url = testUrl else {return}

    // technique that works rather than self.extensionContext.open
    var responder = self as UIResponder?
    let handler = { (success:Bool) -> () in
        if success {
            os_log("Finished opening URL")
        } else {
            os_log("Failed to open URL")
        }
    }

    let openSel = #selector(UIApplication.open(_:options:completionHandler:))
    while (responder != nil){
        if responder?.responds(to: openSel ) == true{
            // cannot package up multiple args to openSel so we explicitly call it on the iMessage application instance
            // found by iterating up the chain
            (responder as? UIApplication)?.open(url, completionHandler:handler)  // perform(openSel, with: url)
            return
        }
        responder = responder!.next
    }
}