簡體   English   中英

Swift 3 iMessage Extension無法打開URL

[英]Swift 3 iMessage Extension doesn't open URL

我正在創建一個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或其他應用程序。

問題出在哪兒? 如何實現所需的功能?

我認為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

            })
        }
    }

這是我用來從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
        }
    }
}

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

除了工作區中包含的配套應用程序外,似乎無法從消息擴展中打開應用程序。 我們試圖從我們的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。

如果您只需要插入一個鏈接,那么您應該使用activeConversation.insertText並插入鏈接。 觸摸該消息將打開Safari

  1. didSelectMessage中的openURL:conversation:使用extensionContext

  2. 處理主機AppDelegate中的URL方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM