ios 11 imessage 扩展 message.url 无法打开 safari
ios 11 imessage extension message.url does not open safari
我正在向我的应用添加一个 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)
}
}
现在,当我触摸消息时,它会打开我的主应用程序,但仍然不是我的浏览器。
我在 another post (where I cannot comment, thus I opened this post) that it is impossible to open in Safari
but I have a news app 上看到它在文章中插入 links 并允许在安装应用程序时单击消息在浏览器 window 中打开文章.
所以,有人可以告诉我如何继续在浏览器 window 中强制打开 link 吗?
非常感谢。
这是在消息中插入 link 的技巧。它不允许创建具有 url 属性的对象,而只是直接插入一个 link,它将在 Safari
.
中打开
activeConversation?.insertText("https://google.com", completionHandler: nil)
我发布了 sample on github 展示如何从 iMessage 扩展程序内部启动 URL。它只使用固定的 URL 但启动代码是您所需要的。
正在从我的 readme
复制
显而易见的尝试是 self.extensionContext.open
,即 documented,因为 要求系统代表当前 运行 打开一个 URL应用扩展。
那是行不通的。但是,您可以迭代返回响应者链以找到适合 open 方法的处理程序(实际上是 iMessage 实例)并使用该对象调用 open
。
此方法适用于 URLs,它将打开本地应用程序,例如相机设置,或网络 URLs。
主要code
@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
}
}
我正在向我的应用添加一个 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)
}
}
现在,当我触摸消息时,它会打开我的主应用程序,但仍然不是我的浏览器。
我在 another post (where I cannot comment, thus I opened this post) that it is impossible to open in Safari
but I have a news app 上看到它在文章中插入 links 并允许在安装应用程序时单击消息在浏览器 window 中打开文章.
所以,有人可以告诉我如何继续在浏览器 window 中强制打开 link 吗?
非常感谢。
这是在消息中插入 link 的技巧。它不允许创建具有 url 属性的对象,而只是直接插入一个 link,它将在 Safari
.
activeConversation?.insertText("https://google.com", completionHandler: nil)
我发布了 sample on github 展示如何从 iMessage 扩展程序内部启动 URL。它只使用固定的 URL 但启动代码是您所需要的。
正在从我的 readme
复制显而易见的尝试是 self.extensionContext.open
,即 documented,因为 要求系统代表当前 运行 打开一个 URL应用扩展。
那是行不通的。但是,您可以迭代返回响应者链以找到适合 open 方法的处理程序(实际上是 iMessage 实例)并使用该对象调用 open
。
此方法适用于 URLs,它将打开本地应用程序,例如相机设置,或网络 URLs。
主要code
@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
}
}