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