首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MSMessage中保存自定义信息?

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

Stack Overflow用户
提问于 2016-08-24 16:39:09
回答 3查看 830关注 0票数 6

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

您如何将自定义信息保存在发送的消息中,以便当被点击时,扩展能够获得该自定义信息并识别被窃听消息的类型以作出相应的响应?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-24 17:01:11

我只是通过看苹果冰淇淋样品代码就知道了。

解决方案

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

示例

代码语言:javascript
复制
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]];

最终URL

添加到MSMessage的最终URL将是:

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

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

我在这里看到的唯一缺点是向用户公开自定义信息(打开URL时)。也许苹果应该在userInfoMSMessage中创建一个属性。

接收消息

这就是从接收到的消息中提取信息的方法:

代码语言:javascript
复制
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];
    }
}
票数 4
EN

Stack Overflow用户

发布于 2016-08-24 18:35:39

由于这是一个iOS 10问题,我希望以下Swift的回答将对其他人有所帮助。(原来的答案是@jmoukel,我刚把它改成了Swift )。

代码语言:javascript
复制
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!)
票数 6
EN

Stack Overflow用户

发布于 2017-10-14 17:45:27

MSMessageurl属性是您可以存储自定义数据的地方。

您还可以使用iMessageDataKit库。它使设置和获取数据变得非常容易,例如:

代码语言:javascript
复制
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")!)

它还支持存储数组。

(免责声明:我是iMessageDataKit__的作者)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39128776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档