在用于iMessage的iOS10扩展中,当用户点击交互式消息气泡时:
您如何将自定义信息保存在发送的消息中,以便当被点击时,扩展能够获得该自定义信息并识别被窃听消息的类型以作出相应的响应?
谢谢!
发布于 2016-08-24 17:01:11
我只是通过看苹果冰淇淋样品代码就知道了。
解决方案
在创建要发送的NSURLComponents时,使用一个MSMessage对象将自定义信息保存在其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]];最终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时)。也许苹果应该在userInfo的MSMessage中创建一个属性。
接收消息
这就是从接收到的消息中提取信息的方法:
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];
}
}发布于 2016-08-24 18:35:39
由于这是一个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!)发布于 2017-10-14 17:45:27
MSMessage的url属性是您可以存储自定义数据的地方。
您还可以使用iMessageDataKit库。它使设置和获取数据变得非常容易,例如:
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__的作者)
https://stackoverflow.com/questions/39128776
复制相似问题