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

jmo*_*kel 6 ios imessage ios10

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

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

谢谢!

aks*_*h1t 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!)
Run Code Online (Sandbox Code Playgroud)


jmo*_*kel 4

我只是通过查看Apple 的 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]];
Run Code Online (Sandbox Code Playgroud)

最终网址

添加到 MSMessage 的最终 URL 将是:

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

URL 中的这些额外查询项将被忽略。我的意思是,如果您的网站不打算处理这些查询项目,那么当用户点击该消息气泡并从 iOS 版本低于 10(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];
    }
}
Run Code Online (Sandbox Code Playgroud)