ios 11 расширение imessage message.url не открывает сафари

Я добавляю 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)
        }
}

И теперь, когда я касаюсь сообщения, оно открывает мое основное приложение, но все еще не мой браузер.

Я видел в другом посте (где я не могу комментировать, поэтому я открыл этот пост), что невозможно открыть в Safari но у меня есть новостное приложение, которое вставляет ссылки на статьи и позволяет одним щелчком мыши открыть сообщение в окне браузера, пока приложение установлено.

Итак, может кто-нибудь сказать, как я могу перейти к принудительному открытию ссылки в окне браузера?

Большое спасибо.

1 ответ

Решение

Вот хитрость, чтобы вставить ссылку в сообщение. Он не позволяет создать объект с атрибутом url, а просто вставить ссылку, которая откроется в Safari,

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

Я опубликовал на github образец, показывающий, как запустить URL-адрес из расширения iMessage. Он просто использует фиксированный URL, но код запуска - это то, что вам нужно.

Копирование из моего файла readme

Очевидно, что стоит попробовать self.extensionContext.openкоторый задокументирован как Запрашивает систему открыть URL-адрес от имени текущего расширения приложения.

Это не работает. Однако вы можете выполнить итерацию по цепочке респондентов, чтобы найти подходящий обработчик для открытого метода (на самом деле экземпляр iMessage) и вызватьopen с этим объектом.

Этот подход работает для URL-адресов, которые открывают локальное приложение, например настроек камеры, или для веб-URL.

Основной код

@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
    }
}
Другие вопросы по тегам