我的问题可能不好,但我无法在任何地方找到答案,我迷失了......
所以我想在iOS 10 +中显示一个带有漂亮图像的丰富通知。
为此,我使用FCM和UNNotificationServiceExtension,如果我理解正确的话,应该获取数据有效负载,找到图像URL并在修改UNNotificationContent之前加载它。
我遇到的问题是我无法掌握这个"数据"。
我发送给FCM的内容如下:
{
"to": "device_token",
"content_available": true,
"mutable_content": true,
"badge" : 9,
"notification": {
"title": "You still need the iPhone ?",
"body": "Give it back if you finished you tests !"
},
"data": {
"message": "test !",
"mediaUrl": "http://usr.audioasylum.com/images/2/20352/Cat_and_rose.jpg"
},
"priority": "high"
}
我在手机中收到的是:
{
aps = {
alert = {
body = "Give it back if you finished you tests !";
title = "You still need the iPhone ?";
};
"content-available" = 1;
"mutable-content" = 1;
};
"gcm.message_id" = "0:1489054783357873%1ee659bb1ee659bb";
mediaUrl = "http://usr.audioasylum.com/images/2/20352/Cat_and_rose.jpg";
message = "Offer!";
}
据我了解,mediaURL和消息最终应该在" aps"而不是在外面,这就是我无法在扩展中找到它们的原因。
在扩展程序中,我得到:(我将它拆分为昏迷状态以提高可读性)
<UNNotificationRequest: 0x117d3c170;
identifier: FDC13B60-FE5A-40C6-896D-06D422043CCE
content: <UNNotificationContent: 0x117d3a650; title: You still need the iPhone ?
subtitle: (null)
body: Give it back if you finished you tests !
categoryIdentifier:
launchImageName:
peopleIdentifiers: ()
threadIdentifier:
attachments: ()
badge: (null)
sound: (null)
hasDefaultAction: YES
shouldAddToNotificationsList: YES
shouldAlwaysAlertWhileAppIsForeground: NO
shouldLockDevice: NO
shouldPauseMedia: NO
isSnoozeable: NO
fromSnooze: NO
darwinNotificationName: (null)
darwinSnoozedNotificationName: (null)
trigger: <UNPushNotificationTrigger: 0x117d3fe90; contentAvailable: YES
mutableContent: YES>>
问题是我如何使用FCM发送信息,或者我检索它们的方式?也许这就是我对待他们的方式?
一如既往,感谢您的帮助!
编辑:添加了接收器的代码(只是扩展中的打印件)
@interface NotificationService ()
@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;
@end
@implementation NotificationService
- (void) didReceiveNotificationRequest: (UNNotificationRequest *) request
withContentHandler: (void (^)(UNNotificationContent *_Nonnull))contentHandler
{
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
NSLog(@"------------------- %@ -------------------", request);
// Modify the notification content here...
self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title];
self.bestAttemptContent.body = [NSString stringWithFormat:@"%@", request.content];
self.contentHandler(self.bestAttemptContent);
}
答案 0 :(得分:1)
我在这里看到两个主要问题:
我遇到的问题是我无法掌握这些&#34;数据&#34;。
您提到您希望mediaUrl
参数应位于aps
内。
看到您在mediaUrl
有效负载中包含data
,行为就像预期的那样(mediaUrl
在aps
之外)。要获取详细信息,您必须实施documentation中所述的内容:
在iOS 10上接收数据讯息
要在应用程序处于前台时接收数据消息,在iOS 10设备上,您需要处理applicationReceivedRemoteMessage:。您的应用可以在没有此回调的情况下仍然在后台接收数据消息,但对于前台情况,您需要在应用代理中使用以下逻辑:
#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 // Receive data message on iOS 10 devices while app is in the foreground. - (void)applicationReceivedRemoteMessage:(FIRMessagingRemoteMessage *)remoteMessage { // Print full message NSLog(@"%@", remoteMessage.appData); } #endif
P.S。:我不完全确定你是否已经尝试过,但你的帖子中没有任何类似的代码,所以我认为应该尝试这个。 子>
根据我的理解,mediaURL和消息最终应该在&#34; aps&#34;而不是在外面,这就是为什么我无法在扩展中找到它们。
问题是,aps
内只有specific parameters的预期内容:
Apple会忽略
aps
词典中的任何其他键。
与此同时,只有一些corresponding parameters可以在FCM中用于aps
有效负载中。有了它,您应该只希望您包含的任何自定义键值对都在aps
参数之外。从上面的Apple文档(强调我的):
除
aps
词典外, JSON词典还可以包含自定义键和值以及特定于应用内容的。
关于你在评论中链接的blog,我还没有深入研究过它,因为它并没有真正使用FCM,最好假设这种行为是不同的。
答案 1 :(得分:1)
我认为您应该self.bestAttemptContent?.userInfo
检查mediaUrl
数据。