4

我的问题可能很糟糕,但我在任何地方都找不到任何答案,我迷路了......


所以我想在 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);
}
4

2 回答 2

2

我认为你应该检查self.bestAttemptContent?.userInfo数据mediaUrl

于 2017-04-25T03:22:52.870 回答
1

我在这里看到两个主要问题:

我遇到的问题是我无法掌握这些“数据”。

您提到您期望mediaUrl参数应该在 inside aps

看到您mediaUrldata有效负载中包含 ,行为与预期的一样(mediaUrl在外部aps)。要获取详细信息,您必须实施文档中所述的内容

在 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

PS:我不完全确定您是否已经尝试过,但是您的帖子中没有任何类似的代码,所以我认为应该尝试一下。

据我了解,mediaURL 和消息应该以“aps”而不是外部结束,这就是为什么我在扩展中找不到它们的原因。

问题是,内部只有特定的参数aps

apsApple 会忽略字典中的任何其他键。

同时,只有一些你可以在FCM中使用的对应参数aps才会出现在payload中。有了这个,您应该只期望您包含的任何自定义键值对都将在aps参数之外。从上面的苹果文档(强调我的):

除了aps字典之外,JSON 字典还可以在您的应用程序特定内容中包含自定义键和值

关于您在评论中链接的博客,我没有深入研究它,因为它并没有真正使用 FCM,最好假设行为不同。

于 2017-03-31T06:39:32.397 回答