Обычно при настройке объекта 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)