How to send MSMessage in Messages Extension?

I want to implement an imessage app, however being new to the messages framework and iMessage apps being such a new thing there aren’t many resources. So I am following the WWDC video and using Apples providing sample app for a guide.

I have three views, the MessageViewController which handles pretty much all the functionality and then a CreateViewController and a DetailsViewController.

  • TestFlight alert while testing update: You already have this app installed
  • Sort NSArray using sortedArrayUsingFunction
  • How to implement a physical effect in SimCity 5, that a building swings when it is being moved?
  • Get ping latency from host
  • crash while removing objects from NSMutableArray
  • Create csv file from array of data in iOS
  • I am simply trying to create an MSMessage from the CreateViewController and display in the DetailsViewController.. then add to the data.

    However I get a crash when trying to create the data.

    @IBAction func createAction(_ sender: AnyObject) {
        //present full screen for create list
        self.delegate?.createViewControllerDidSelectAdd(self as! CreateViewControllerDelegate)        

    The data type I am trying to pass is the dictionary from a struct:

    struct data {
    var title: String!
    var date: Date!
    var dictionary = ["title" : String(), "Array1" : [String](), "Array2" : [String]() ] as [String : Any]

    So here’s how things are set up;


    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 {
                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 {
    extension MessagesViewController: CreateViewControllerDelegate {
    func createViewControllerDidSelectAdd(_ controller: CreateViewControllerDelegate) {
        composeMessage(for: dataItem())


     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)

    Would someone show where I am going wrong and how I can send a MSMessage? If I am able to send the message I should then be able to receive and resend.

    Solutions Collect From Internet About “How to send MSMessage in Messages Extension?”

    One issue I see, without being able to debug this myself:
    you are setting your components.queryItems to your dictionary var cast as [String:String], but the dictionary returned from data.dictionary is not a [String:String], but a [String:Any]

    In particular, dictionary[“Array1”] is an array of Strings, not a single string. Same for dictionary[“Array2”]. URLQueryItem expects to be given two strings in its init(), but you’re trying to put a string and an array of strings in (though I’m not sure that you’re actually getting to that line in your queryItems(dictionary:) method.

    Of course, your dataItem.dictionary is returning a dictionary with 4 empty values. I’m not sure that’s what you want.