Как я могу обновить URL-адрес MSMessage при использовании MSMessageLiveLayout? - PullRequest
0 голосов
/ 27 мая 2019

Обычно при настройке объекта MSMessage я бы использовал MSMessageTemplateLayout в качестве базовой настройки для отправки объектов MSMessage. В API iMessage есть интересный фрагмент кода, который позволяет интерактивную MSMessage под названием MSMessageLiveLayout, где пользователи могут взаимодействовать с объектом MSMessage, не открывая полностью объект MSMessage.

Для демонстрации я попытался создать простой счетчик. Для объектов MSMessage единственный известный мне способ правильного сохранения изменений значений - через схемы URL.

Проблема в том, что я не уверен, как правильно обновить текущий URL-адрес MSMessage, чтобы он соответствовал значению новых изменений. Кроме того, как мне обновить пользовательский интерфейс / данные получателя на стороне объекта MSMessage, чтобы они соответствовали изменениям отправителя?

Я пытался получить доступ к текущему URL-адресу MSMessage, обновляя текущий URL-адрес activeConversation новым значением URL-адреса каждый раз, когда нажимал кнопку счетчика. Оператор печати показывает, что URL обновляется. Но когда я прокручиваю вверх и вниз объект MSMessage, вызывается функция willBecomeActive, которая отбрасывает все изменения и продолжает использовать старое значение URL.



class Demo: MSMessagesAppViewController {

var session: MSSession?
var count = 1
@IBOutlet var label: UILabel!

   func createURL() -> URL {
        var urlComponents = URLComponents()
        urlComponents.scheme = "https";
        urlComponents.host = "www.democounter.com";

        let item = URLQueryItem(name: "counter", value: "\(count)")
        urlComponents.queryItems?.append(item)

        return urlComponents.url!
    }


    func createMessage(_ url: URL) {

        if session == nil {
            session = MSSession()
        }

        let message = MSMessage(session: session!)

        let layout = MSMessageTemplateLayout()
        layout.caption = "Sending counter"
        let liveLayout = MSMessageLiveLayout(alternateLayout: layout)

        message.layout = liveLayout
        message.url = url


        let conversation = self.activeConversation

        conversation?.insert(message, completionHandler: {(error) in
            if let error = error {
                print(error)
            }
        })

        self.dismiss()
    }

// this is the blue box in the example attached that create and sends 
   the MSMessage object

    @IBAction func sendMessage(_ sender: UIButton) {
          let url = createURL()
          createMessage(url)
    }

// counter button, this is where I try to update the current MSMessage URL

    @IBAction func PressMe(_ sender: UIButton) {

        count += 1
        print(count)
        label.text = String(count)

        let conversation = self.activeConversation
        print(conversation?.selectedMessage?.url)

      // It prints the changes, but does not save the updated url to 
      the current MSMessage Object

        conversation?.selectedMessage?.url = createURL()
        print(conversation?.selectedMessage?.url)

    }

    func decodeURL(_ url: URL) {

        let components = URLComponents(url: url,
                                       resolvingAgainstBaseURL: false)

        for (index, queryItem) in (components?.queryItems?.enumerated())! {

            if queryItem.name == "counter"  {
                count = Int(queryItem.value!)!
            }
        }
    }

    override func willBecomeActive(with conversation: MSConversation) {
        if let messageURL = conversation.selectedMessage?.url {
            decodeURL(messageURL)
            caption = "It's your turn to counter"
            session = conversation.selectedMessage?.session
        }
        label.text = String(count)   
    }
}


[Пример объекта сообщения] (https://imgur.com/MVQipca)

...