Расширение сообщений iOS 10 - реализация didRecieve() и selectedMessage в симуляторе

Я пытаюсь реализовать 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, после того как я его создаю, и оно получено с помощью симулятора IPhone, вызывающего переход для отправителя сообщения.

Проблема возникает, когда я хочу выбрать сообщение в ветке других лиц. Apple включает две взаимосвязанные цепочки сообщений в симуляторе для тестирования отправки и получения сообщений между пользователями с вашим добавочным номером.

Когда я выбираю сообщение в полученной ветке, переход не запускается. Он просто загружает свежую копию контроллера корневого представления.

Мне нужно получить информацию, полученную для конкретного экземпляра сообщения, и запустить переход, используя эти данные. Apple предоставляет следующее свойство экземпляра для достижения этой цели.

Обратитесь к selectedMessage в API документации здесь: https://developer.apple.com/reference/messages/msconversation/1648186-selectedmessage

Вопрос в том, как реализовано это свойство экземпляра? Это реализовано в onViewDidLoad() корневого контроллера представления для вашего расширения сообщения? Документы Apple довольно расплывчаты в отношении того, как на самом деле реализовать свойство экземпляра для извлечения данных полученного сообщения из выбранного сообщения на полученном конце вашего расширения сообщения. Кто-нибудь реализовал это?

СПАСИБО!!

1 ответ

Решение

Как только получатель выбирает сообщение, willBecomeActive называется и дает вам MSConversation, который содержит selectedMessage:

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

Смотрите: Полезный пример Apple

Другие вопросы по тегам