【问题标题】:How to send MSMessage in Messages Extension?如何在消息扩展中发送 MSMessage?
【发布时间】:2017-01-28 17:33:41
【问题描述】:

我想实现一个 imessage 应用程序,但是对于消息框架和 iMessage 应用程序是新手来说,资源并不多。所以我关注WWDC video 并使用苹果提供sample app 作为指南。

我有三个视图,MessageViewController 处理几乎所有功能,然后是 CreateViewControllerDetailsViewController

我只是想从CreateViewController 创建一个MSMessage 并显示在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())
}

}

创建视图控制器

/**
 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 吗?如果我能够发送消息,那么我应该能够接收和重新发送。

【问题讨论】:

  • 可能的问题是在函数func composeMessage(for data: dataItem) 中传递结构dataItem 我已经成功地发送了一个字符串值,而无需使用本视频教程youtube.com/watch?v=pe-J7OsQHhI 中的结构。
  • @RileyDev - youtube 视频帮了大忙!

标签: ios swift swift3 ios10 msmessage


【解决方案1】:

我看到一个问题,但无法自己调试: 您正在将 components.queryItems 设置为字典 var 转换为 [String:String],但从 data.dictionary 返回的字典不是 [String:String],而是 [String:Any]

特别是,dictionary["Array1"] 是一个字符串数组,而不是单个字符串。字典 ["Array2"] 相同。 URLQueryItem 期望在它的 init() 中给出两个字符串,但是您试图在其中放入一个字符串和一个字符串数组(尽管我不确定您是否真的在 queryItems(dictionary: ) 方法。

当然,您的 dataItem.dictionary 会返回一个包含 4 个空值的字典。我不确定这就是你想要的。

【讨论】:

  • 我实际上已经注释掉了QueryItems函数和字典,只是手动设置了消息但仍然出现运行时崩溃
  • 崩溃时控制台中的文本是什么?它停在哪一行?
  • 您问题中的代码是否与您的项目保持同步?我在 CreateViewController 上没有看到 createList() 方法
  • 对不起,你的行:self.delegate?.createViewControllerDidSelectAdd(self as!CreateListViewControllerDelegate) 应该读为 self.delegate?.createViewControllerDidSelectAdd(self as!CreateListViewController) 因为 CreateListViewController 不是它自己的委托
  • 实际上,你根本不需要演员,只需要 self.delegate?.createViewControllerDidSelectAdd(self)
猜你喜欢
  • 1970-01-01
  • 2021-04-09
  • 2017-06-29
  • 2017-05-09
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多