如何在MSMessage中保存自定义信息?

时间:2016-08-24 16:39:09

标签: ios ios10 imessage

在iOS10的iMessage Extensions中,当用户点击交互式消息气泡时:

如何在发送的邮件中保存自定义信息,以便在点按时,扩展程序能够获取该自定义信息并识别所点击的邮件类型以进行相应的响应?

谢谢!

3 个答案:

答案 0 :(得分:6)

由于这是一个 iOS 10 问题,我希望Swift中的以下答案对其他人有所帮助。 (@jmoukel的原始答案,我刚刚转换为Swift)。

let message = MSMessage()
guard let url = NSURL(string: "http://yourwebsite.com") else { return }
guard let urlComponents = NSURLComponents(URL: url, resolvingAgainstBaseURL: false) else { return }
urlComponents.setQueryItems([
    "messageType": "1",
    "username":"Jorge",
    "userId":"99999",
    "userPhoto":"http://yourwebsite.com/9999.jpg"
])
message.setURL(urlComponents.URL!)

答案 1 :(得分:4)

我只是通过查看Apple's Ice Cream Sample Code来了解它。

解决方案

创建您要发送的MSMessage时,请使用 NSURLComponents 对象将自定义信息保存在 QueryItems 属性中。

<强> 实施例

MSMessage* message;
NSURLComponents* urlComponents;

// init
message       = [[MSMessage alloc] init];
urlComponents = [NSURLComponents componentsWithURL:[NSURL URLWithString:@"http://yourwebsite.com"] resolvingAgainstBaseURL:NO];

// Saving Custom Information as query items.
[urlComponents setQueryItems:@[[NSURLQueryItem queryItemWithName:@"messageType" value:@"1"],
                               [NSURLQueryItem queryItemWithName:@"username"    value:@"Jorge"],
                               [NSURLQueryItem queryItemWithName:@"userId"      value:@"99999"],
                               [NSURLQueryItem queryItemWithName:@"userPhoto"   value:@"http://yourwebsite.com/9999.jpg"]]];

// Setting message's URL
[message setURL:[urlComponents URL]];

最终网址

添加到MSMessage的最终URL将最终成为:

http://yourwebsite.com?messageType=1&username=Jorge&userId=99999&userPhoto=http://yourwebsite.com/99999.jpg

网址中的这些额外查询项将忽略。我的意思是,如果您的网站不打算处理这些查询项,当用户点击该消息气泡并在浏览器中从iOS版本低于10的设备打开URL时,它将忽略它们(iOS9,iOS8, ...)。

我在这里看到的唯一缺点是将自定义信息暴露给用户(打开URL时)。也许Apple应该在 MSMessage 中创建 userInfo 属性。

接收消息

这就是您从收到的消息中提取信息的方式:

MSMessage* message;
NSString* messageType, *username, *userId, *userPhoto;

// init
message = [self.activeConversation selectedMessage];

if (message)
{
    NSURLComponents *urlComponents;
    NSArray* queryItems;  

    // Extracting message URL's coponents. With this URL we'll able to figure out the type of the message.
    urlComponents = [NSURLComponents componentsWithURL:[message URL]
                           resolvingAgainstBaseURL:NO];
    queryItems    = [urlComponents queryItems];

    // Extracting info from the query items.
    for (NSURLQueryItem* item in queryItems)
    {
        if ([[item name] isEqualToString:@"messageType"])
            messageType = [item value];
        else if ([[item name] isEqualToString:@"username"])
            username = [item value];
        else if ([[item name] isEqualToString:@"userId"])
            userId = [item value];
        else if ([[item name] isEqualToString:@"userPhoto"])
            userPhoto = [item value];
    }
}

答案 2 :(得分:0)

MSMessage的{​​{1}}属性是您存储自定义数据的地方。

您也可以使用iMessageDataKit库。它使设置和获取数据变得非常简单:

url

它还支持存储数组。

(免责声明:我是let message: MSMessage = MSMessage() message.md.set(value: 7, forKey: "user_id") message.md.set(value: "john", forKey: "username") message.md.set(values: ["joy", "smile"], forKey: "tags") print(message.md.integer(forKey: "user_id")!) print(message.md.string(forKey: "username")!) print(message.md.values(forKey: "tags")!) 的作者)