4

我正在创建一个 iOS 应用程序 iMessage 扩展。

根据Apple 的示例,我根据提供的逻辑创建了一条消息

guard let url: URL = URL(string: "http://www.google.com") else { return }

let message = composeMessage(url: url)
activeConversation?.insert(message, completionHandler: { [weak self] (error: Error?) in
    guard let error = error else { return }
    self?.presentAlert(error: error)        
})

private func composeMessage(url: URL) -> MSMessage {
    let layout = MSMessageTemplateLayout()
    layout.caption = "caption"
    layout.subcaption = "subcaption"
    layout.trailingSubcaption = "trailing subcaption"

    let message = MSMessage()
    message.url = url
    message.layout = layout

    return message
}

private func presentAlert(error: Error) {
    let alertController: UIAlertController = UIAlertController(
        title: "Error",
        message: error.localizedDescription,
        preferredStyle: .alert
    )

    let cancelAction: UIAlertAction = UIAlertAction(
        title: "OK",
        style: .cancel,
        handler: nil
    )

    alertController.addAction(cancelAction)

    present(
        alertController,
        animated: true,
        completion: nil
    )
}

据我了解,发送消息后,单击时应打开 Safari 浏览器。

当我单击已发送的消息时,MessageViewController屏幕会出现在整个屏幕中,而无需打开 safari 或其他应用程序。

问题出在哪里?如何实现所需的功能?

4

6 回答 6

2

我认为 Safari 浏览器仅适用于 macOS。这对我有用:

override func didSelectMessage(message: MSMessage, conversation: MSConversation) {

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

            // Eg. open your app:
            let url = // your apps url
            self.extensionContext?.openURL(url, completionHandler: { (success: Bool) in

            })
        }
    }
于 2016-09-06T20:56:22.787 回答
2

这是我用来从 iMessage 扩展程序打开 URL 的代码。目前正在努力在 WATUU iMessage 应用程序中打开音乐应用程序。例如,使用 URL“ https://itunes.apple.com/us/album/as%C3%AD/1154300311?i=1154300401&uo=4&app=music

此功能目前适用于 iOS 10、11 和 12

func openInMessagingURL(urlString: String){
    if let url = NSURL(string:urlString){
        let context = NSExtensionContext()
        context.open(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
        }
    }
}

斯威夫特 4 的更新

func openInMessagingURL(urlString: String){
    if let url = URL(string:urlString){
        let context = NSExtensionContext()
        context.open(url, completionHandler: nil)
        var responder = self as UIResponder?

        while (responder != nil){
            if responder?.responds(to: #selector(UIApplication.open(_:options:completionHandler:))) == true{
                responder?.perform(#selector(UIApplication.open(_:options:completionHandler:)), with: url)
            }
            responder = responder!.next
        }
    }
}
于 2018-08-30T19:47:21.710 回答
2

使用Julio Bailon展示的技术

已为 Swift 4 修复并且openURL已被弃用。

请注意,该extensionContext?.openURL技术不适用于iMessage 扩展程序 - 它只会打开您当前的应用程序。

我在GitHub 上发布了一个完整的示例应用程序,展示了该技术,并在此处提供了相关代码段:

    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
    }
于 2019-03-07T23:29:11.253 回答
1

如果您只需要插入链接,那么您应该使用activeConversation.insertText并插入链接。触摸消息将打开Safari

于 2017-10-03T15:14:24.903 回答
1

似乎无法从消息扩展中打开应用程序,但工作区中包含的配套应用程序除外。我们试图从我们的消息扩展中打开 Safari,但它不起作用,这个限制似乎是设计使然。

您可以尝试其他方案来解决您的问题:

  1. 扩展消息扩展中的 Webview

    你可以在你的消息扩展中有一个 Webview,当你点击一个消息时,你可以打开 Expanded 模式并在 Webview 中打开你的 Url。

用户不会在 Safari 中,但该页面将嵌入到您的消息扩展中。

  1. 在配套应用程序中打开网址

    单击消息后,您可以使用特殊参数打开您的 Companion 应用程序(通过带有 MyApp://?myParam=myValue 的 Url Scheme);Companion 应用程序应该对此参数做出反应,并可以通过 OpenUrl 重定向到 Safari。

在这种情况下,您将在网页之前进行多次重定向,但它应该允许返回对话。

我们还发现,如果您想直接在 Messages 中打开 Apple Store 并让用户购买商品,我们可以在 Message Extension 中实例化 SKStoreProductViewController。

于 2016-10-10T08:59:26.323 回答
-1
  1. didSelectMessage:conversation: 中的 openURL 通过使用 extensionContext

  2. 在您的主机 AppDelegate 中处理 URL 方案

于 2016-10-06T14:13:35.140 回答