Расширение Swift 3 iMessage не открывает URL
Я создаю расширение iMessage для iOS.
В соответствии с примером 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
Экран происходит на весь экран, без открытия сафари или другого приложения.
В чем проблема? Как я могу достичь желаемой функциональности?
5 ответов
Вот код, который я использую для открытия URL-адреса из расширения iMessage. В настоящее время он работает над тем, чтобы открыть приложение Музыка в приложении 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
}
}
}
Я думаю, что браузер 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
})
}
}
Используя технику, показанную Хулио Байлоном
Исправлено для 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
}
Если вам нужно только вставить ссылку, то вы должны использовать activeConversation.insertText
и вставьте ссылку. Прикосновение к сообщению откроет Safari
,
Кажется, невозможно открыть приложение из расширения сообщения, кроме сопутствующего приложения, содержащегося в рабочей области. Мы попытались открыть Safari из нашего расширения сообщений, оно не сработало, это ограничение кажется умышленным.
Вы можете попробовать другие сценарии, чтобы решить вашу проблему:
Веб-просмотр в расширенном расширении сообщения
У вас может быть веб-представление в вашем расширении сообщения, и когда вы нажимаете на сообщение, вы можете открыть расширенный режим и открыть свой URL в веб-представлении.
Пользователь не будет в Safari, но страница будет встроена в ваше расширение сообщения.
Откройте URL в приложении Companion
Нажав на сообщение, вы можете открыть свое приложение Companion (через схему URL с MyApp://? MyParam=myValue) со специальным параметром; приложение-компаньон должно реагировать на этот параметр и может перенаправлять в Safari через OpenUrl.
В этом случае вы будете перенаправлять несколько страниц перед веб-страницей, но это должно позволить вернуться к разговору.
Мы также обнаружили, что мы можем создать экземпляр SKStoreProductViewController в расширении сообщения, если вы хотите открыть Apple Store прямо в сообщениях и позволить пользователю покупать товары.
openURL в didSelectMessage: разговор: с использованием extensionContext
обрабатывать схему URL в вашем хосте AppDelegate