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;

    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)
    
    }
    
    }
    

    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.