Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift 3 iMessage Extension doesn't open URL

I am creating an iOS Application iMessage Extension.

According to Example by Apple, I creating a message according to provided logic

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

also

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
}

and

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

As far as I understand, after message is sent, on a click, Safari browser should be opened.

When I click on a sent message, MessageViewController screen takes place in whole screen, without opening safari or another app.

Where is the problem? How can I achieve desired functionality?

like image 224
Daumantas Versockas Avatar asked Mar 11 '23 05:03

Daumantas Versockas


2 Answers

I think safari Browser only opens for macOS. This worked for me:

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

            })
        }
    }
like image 40
benaneesh Avatar answered Mar 20 '23 13:03

benaneesh


Here is the code I use to open a URL from a iMessage extension. It is currently working to open the Music app in the WATUU iMessage application. For instance with the URL "https://itunes.apple.com/us/album/as%C3%AD/1154300311?i=1154300401&uo=4&app=music"

This functionality currently works in iOS 10, 11 and 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
        }
    }
}

UPDATE FOR 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
        }
    }
}
like image 55
Julio Bailon Avatar answered Mar 20 '23 14:03

Julio Bailon