iOS 10 条消息扩展 - 在模拟器中实现 didRecieve() 和 selectedMessage
iOS 10 messages extension - implementing didRecieve() and selectedMessage in Simulator
我正在尝试实施 didRecieve() 以触发 iOS 10 扩展中的故事板转场。使用故事板,我可以在使用以下代码创建消息后触发 segue:
@IBAction func createThing(_ sender: AnyObject) {
self.createMessage()
}
func composeMessage(customMessage: String, caption: String) -> MSMessage {
var components = URLComponents()
// create a query item from our custom message
let item = URLQueryItem(name: "New Thing", value: customMessage)
// put it into an array of query items
var items = [URLQueryItem]()
items.append(item)
components.queryItems = items
// tell messages to use the default message template layout
let layout = MSMessageTemplateLayout()
layout.caption = caption
// create a message and tell it the content and layout
let message = MSMessage()
message.url = components.url!
message.layout = layout
// return it for sending
return message
}
override func didReceive(_ message: MSMessage, conversation: MSConversation) {
print("message recieved!!")
self.pollRecieved = true
guard let messageURL = message.url else { return }
guard let urlComponents = NSURLComponents(url: messageURL, resolvingAgainstBaseURL: false), let queryItems = urlComponents.queryItems else { return }
print("URL Components", urlComponents)
print("queryItems", queryItems)
for item in queryItems {
print("Received \(item.name) with value \(item.value)")
}
print("attempting segue!")
self.performSegue(withIdentifier: "showPollSegue", sender: self)
}
func createMessage() {
let message = composeMessage(customMessage: "This is really important.", caption: "User-facing caption here")
self.activeConversation?.insert(message)
print("message here!!", message)
}
// segue override
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if(segue.identifier == "showThingSegue") {
let vc = segue.destination as! MessagesViewController
vc.messageID = "1234567"
}
}
效果很好。我可以在创建后使用 i message 发送消息,IPhone 模拟器会收到它,从而为发送消息的人触发 segue。
当我想 select 其他人的线程中的消息时,麻烦就来了。 Apple 在模拟器中包含两个互连的消息线程,用于测试使用您的扩展程序在用户之间发送和接收消息。
当我select接收线程中的消息时,不会触发segue。它只是加载根视图控制器的一个新副本。
我想要的行为是获取特定消息实例的接收信息,并使用此数据触发 segue。 Apple 提供了以下实例 属性 来实现这一点。
请参阅此处 API 文档中的 selectedMessage:https://developer.apple.com/reference/messages/msconversation/1648186-selectedmessage
问题是这个实例属性是如何实现的?它是否在消息扩展的根视图控制器的 onViewDidLoad() 中实现? Apple 的文档对于如何实际实施 属性 实例以从消息扩展接收端的 selected 消息中获取接收到的消息数据非常模糊。有人实现了吗?
谢谢!!
一旦接收者选择了消息,willBecomeActive
就会被调用并给你 MSConversation
,其中包含 selectedMessage
:
override func willBecomeActive(with conversation: MSConversation) {
super.willBecomeActive(with: conversation)
let message = conversation.selectedMessage
...
}
我正在尝试实施 didRecieve() 以触发 iOS 10 扩展中的故事板转场。使用故事板,我可以在使用以下代码创建消息后触发 segue:
@IBAction func createThing(_ sender: AnyObject) {
self.createMessage()
}
func composeMessage(customMessage: String, caption: String) -> MSMessage {
var components = URLComponents()
// create a query item from our custom message
let item = URLQueryItem(name: "New Thing", value: customMessage)
// put it into an array of query items
var items = [URLQueryItem]()
items.append(item)
components.queryItems = items
// tell messages to use the default message template layout
let layout = MSMessageTemplateLayout()
layout.caption = caption
// create a message and tell it the content and layout
let message = MSMessage()
message.url = components.url!
message.layout = layout
// return it for sending
return message
}
override func didReceive(_ message: MSMessage, conversation: MSConversation) {
print("message recieved!!")
self.pollRecieved = true
guard let messageURL = message.url else { return }
guard let urlComponents = NSURLComponents(url: messageURL, resolvingAgainstBaseURL: false), let queryItems = urlComponents.queryItems else { return }
print("URL Components", urlComponents)
print("queryItems", queryItems)
for item in queryItems {
print("Received \(item.name) with value \(item.value)")
}
print("attempting segue!")
self.performSegue(withIdentifier: "showPollSegue", sender: self)
}
func createMessage() {
let message = composeMessage(customMessage: "This is really important.", caption: "User-facing caption here")
self.activeConversation?.insert(message)
print("message here!!", message)
}
// segue override
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if(segue.identifier == "showThingSegue") {
let vc = segue.destination as! MessagesViewController
vc.messageID = "1234567"
}
}
效果很好。我可以在创建后使用 i message 发送消息,IPhone 模拟器会收到它,从而为发送消息的人触发 segue。
当我想 select 其他人的线程中的消息时,麻烦就来了。 Apple 在模拟器中包含两个互连的消息线程,用于测试使用您的扩展程序在用户之间发送和接收消息。
当我select接收线程中的消息时,不会触发segue。它只是加载根视图控制器的一个新副本。
我想要的行为是获取特定消息实例的接收信息,并使用此数据触发 segue。 Apple 提供了以下实例 属性 来实现这一点。
请参阅此处 API 文档中的 selectedMessage:https://developer.apple.com/reference/messages/msconversation/1648186-selectedmessage
问题是这个实例属性是如何实现的?它是否在消息扩展的根视图控制器的 onViewDidLoad() 中实现? Apple 的文档对于如何实际实施 属性 实例以从消息扩展接收端的 selected 消息中获取接收到的消息数据非常模糊。有人实现了吗?
谢谢!!
一旦接收者选择了消息,willBecomeActive
就会被调用并给你 MSConversation
,其中包含 selectedMessage
:
override func willBecomeActive(with conversation: MSConversation) {
super.willBecomeActive(with: conversation)
let message = conversation.selectedMessage
...
}