2016-10-02 32 views
0

我试图实现didRecieve()来触发iOS 10扩展中的storyboard segue。用故事板,我可以使用下面的代码创建一个消息后触发赛格瑞:iOS 10消息扩展 - 在模拟器中实现didRecieve()和selectedMessage

@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消息发送消息,并且由iPhone模拟器接收,以便为发送消息的人员触发延迟。

当我想在其他人线程中选择消息时会遇到麻烦。 Apple在模拟器中包含两个互连的消息线程,用于测试用户与您的扩展之间的发送和接收消息。

当我在收到的线程中选择消息时,不会触发segue。它只是加载一个新的根视图控制器副本。

我想要的行为是获取特定消息实例的接收信息,并使用此数据触发segue。 Apple提供以下实例属性来实现此目的。

参考selectedMessage在这里API文档:https://developer.apple.com/reference/messages/msconversation/1648186-selectedmessage

的问题是如何在这种情况下财产实施?它是否在您的消息扩展的根视图控制器的onViewDidLoad()中实现? Apple的文档在如何实际实现实例属性上非常模糊,以便在收到的消息扩展的末尾从所选消息中获取收到的消息数据。有没有人执行过这个?

谢谢!

回答

0

一旦接收器选择的消息,willBecomeActive被调用,并为您提供了MSConversation,其持有selectedMessage

override func willBecomeActive(with conversation: MSConversation) { 
    super.willBecomeActive(with: conversation) 
    let message = conversation.selectedMessage 
    ... 
} 

参见:Helpful Apple sample

+0

谢谢你的提示!看起来didSelect没有被接收消息用户在选择消息时触发。在发件人抄本中选择邮件时触发。无论何时在您的扩展程序中任何地方选择一条消息,都应该触发它,对吗 – thexande

+0

我错了方法。抱歉。答案已更新。 – shallowThought

+0

看起来像xcode不认识的方法名称 – thexande