Как отправить MSMessage в расширении сообщения?
Я хочу реализовать приложение imessage, однако, будучи новичком в структуре сообщений и приложениями iMessage, являющимися такими новыми, ресурсов не так много. Поэтому я слежу за видео WWDC и использую пример приложения Apple для руководства.
У меня есть три мнения, MessageViewController
который обрабатывает почти все функциональные возможности, а затем CreateViewController
и DetailsViewController
,
Я просто пытаюсь создать MSMessage
от CreateViewController
и отображать в DetailsViewController
.. затем добавьте к данным.
Однако я получаю сбой при попытке создать данные.
@IBAction func createAction(_ sender: AnyObject) {
//present full screen for create list
self.delegate?.createViewControllerDidSelectAdd(self as! CreateViewControllerDelegate)
}
Тип данных, который я пытаюсь передать - это словарь из структуры:
struct data {
var title: String!
var date: Date!
var dictionary = ["title" : String(), "Array1" : [String](), "Array2" : [String]() ] as [String : Any]
}
Итак, вот как все устроено;
MessagesViewController
class MessagesViewController: MSMessagesAppViewController, {
// MARK: Responsible for create list button
func composeMessage(for data: dataItem) {
let messageCaption = NSLocalizedString("Let's make", comment: "")
let dictionary = data.dictionary
func queryItems(dictionary: [String:String]) -> [URLQueryItem] {
return dictionary.map {
URLQueryItem(name: $0, value: $1)
}
}
var components = URLComponents()
components.queryItems = queryItems(dictionary: dictionary as! [String : String])
let layout = MSMessageTemplateLayout()
layout.image = UIImage(named: "messages-layout-1.png")!
layout.caption = messageCaption
let message = MSMessage()
message.url = components.url!
message.layout = layout
message.accessibilityLabel = messageCaption
guard let conversation = activeConversation else { fatalError("Expected Convo") }
conversation.insert(message) { error in
if let error = error {
print(error)
}
}
}
}
extension MessagesViewController: CreateViewControllerDelegate {
func createViewControllerDidSelectAdd(_ controller: CreateViewControllerDelegate) {
//CreatesNewDataItem
composeMessage(for: dataItem())
}
}
CreateViewController
/**
A delegate protocol for the `CreateViewController` class.
*/
protocol CreateViewControllerDelegate : class {
func createViewControllerDidSelectAdd(_ controller: CreateViewControllerDelegate)
}
class CreateViewController: UIViewController {
static let storyboardIdentifier = "CreateViewController"
weak var delegate: CreateViewControllerDelegate?
@IBAction func create(_ sender: AnyObject) {
//present full screen for create list
self.delegate?.createViewControllerDidSelectAdd(self as! CreateListViewControllerDelegate)
}
}
Будет ли кто-то показать, где я иду не так и как я могу отправить MSMessage
? Если я смогу отправить сообщение, я должен быть в состоянии получить и повторно отправить.
1 ответ
Одна проблема, которую я вижу, не имея возможности отлаживать это самостоятельно: вы устанавливаете свои компоненты.queryItems в свой словарь, переменный тип как [String:String], но словарь, возвращаемый из data.dictionary, не является [String:String], но [Строка: любая]
В частности, dictionary["Array1"] - это массив строк, а не одна строка. То же самое для словаря ["Array2"]. Ожидается, что URLQueryItem получит две строки в своем init(), но вы пытаетесь вставить строку и массив строк (хотя я не уверен, что вы на самом деле получаете эту строку в свой queryItems(словарь:) метод.
Конечно, ваш dataItem.dictionary возвращает словарь с 4 пустыми значениями. Я не уверен, что это то, что вы хотите.