【问题标题】:iOS 10 messages extension - implementing didRecieve() and selectedMessage in SimulatoriOS 10 消息扩展 - 在模拟器中实现 didRecieve() 和 selectedMessage
【发布时间】:2016-10-03 22:32:13
【问题描述】:

我正在尝试实现 didRecieve() 以触发 iOS 10 扩展中的故事板转场。使用情节提要,我可以在使用以下代码创建消息后触发转场:

    @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。

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

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

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

在此处参考 API 文档中的 selectedMessage:https://developer.apple.com/reference/messages/msconversation/1648186-selectedmessage

问题是这个实例属性是如何实现的?它是否在您的消息扩展的根视图控制器的 onViewDidLoad() 中实现? Apple 的文档对于如何实际实现实例属性以从消息扩展接收端的选定消息中提取接收到的消息数据非常模糊。有人实现了吗?

谢谢!!

【问题讨论】:

    标签: ios swift swift3 ios-messages-extension


    【解决方案1】:

    一旦接收者选择了消息,willBecomeActive 就会被调用并给你MSConversation,其中包含selectedMessage

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

    见:Helpful Apple sample

    【讨论】:

    • 感谢您的提示!看起来 didSelect 没有被接收消息的用户在选择消息时触发。在发件人脚本中选择消息时触发它。每当在您的扩展程序中的任何位置选择一条消息时,都应该触发此操作,对吗?
    • 看起来 xcode 无法识别该方法名称
    • 这必须在MSMessagesAppViewController 的子类中完成,如果您在创建项目时使用了MessagesApp模板,则会为您生成MessagesViewController。如果是这样,则该方法已存在于您的MessagesViewController 中。如果没有尽可能详细地描述问题。确切的错误...
    • 谢谢!这是超级有用且有效的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2021-01-27
    • 2010-09-19
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2018-12-23
    相关资源
    最近更新 更多