Swift 3 iMessage Extension无法打开URL

问题描述 投票:4回答:6

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

根据Example by 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或其他应用程序。

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

ios swift swift3 imessage ios-messages-extension
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

            })
        }
    }

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
    }

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
        }
    }
}

SWIFT更新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
        }
    }
}

1
投票

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

您可以尝试其他情景来解决您的问题:

  1. 扩展消息扩展中的Webview 您可以在消息扩展中使用Webview,当您单击消息时,可以打开Expanded模式并在Webview中打开Url。

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

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

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

我们还发现,如果要在消息中打开Apple Store并让用户购买项目,我们可以在消息扩展中实例化SKStoreProductViewController。


0
投票

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


-1
投票
  1. didSelectMessage中的openURL:conversation:使用extensionContext
  2. 处理主机AppDelegate中的URL方案
© www.soinside.com 2019 - 2024. All rights reserved.