[英]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,它沒有用,這個限制似乎是設計的。
您可以嘗試其他情景來解決您的問題:
擴展消息擴展中的Webview
您可以在消息擴展中使用Webview,當您單擊消息時,可以打開Expanded模式並在Webview中打開Url。
用戶不在Safari中,但該頁面將嵌入到您的郵件擴展中。
在Companion App中打開Url
點擊該消息,您可以使用特殊參數打開您的Companion應用程序(通過Url Scheme with MyApp://?myParam = myValue); Companion應用程序應該對此參數做出反應,並可以通過OpenUrl重定向到Safari。
在這種情況下,您將在WebPage之前進行多次重定向,但它應該允許返回到對話。
我們還發現,如果要在消息中打開Apple Store並讓用戶購買項目,我們可以在消息擴展中實例化SKStoreProductViewController。
如果您只需要插入一個鏈接,那么您應該使用activeConversation.insertText
並插入鏈接。 觸摸該消息將打開Safari
。
didSelectMessage中的openURL:conversation:使用extensionContext
處理主機AppDelegate中的URL方案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.