如何在 iOS 10 应用程序中将媒体附件添加到我的推送通知?

Posted

技术标签:

【中文标题】如何在 iOS 10 应用程序中将媒体附件添加到我的推送通知?【英文标题】:How can I add media attachments to my push notifications in an iOS 10 app? 【发布时间】:2017-02-10 20:28:30 【问题描述】:

有多个示例如何设置项目以添加使用“媒体附件”技术显示图像的丰富通知。我已经阅读了其中的大部分内容,但我错过了一些内容,因为我的项目没有显示任何带有此有效负载的丰富通知(使用 APNS-Tool 和 Boodle 测试):


    "aps":
        "alert":
            "title": "Rich test",
            "body": "Dancing Banana"
        ,
        "mutable-content": 1
    

通知是可见的,但在 3D Touch 上,没有显示其他信息(如图像或修改后的标题)。通知扩展断点和NSLog 消息也不起作用。

这是我的演示项目:https://github.com/gklka/RichTest

我做了什么:

    创建了一个新项目 实现了 ios 风格的授权:
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [中心 requestAuthorizationWithOptions:UNAuthorizationOptionAlert completionHandler:^(BOOL 已授予, NSError * _Nullable 错误) 如果(授予) NSLog(@"授予"); [[UIApplication sharedApplication] registerForRemoteNotifications]; 别的 NSLog(@"注册错误:%@", error); ];
    为 AppDelegate 添加了调试:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NSLog(@"Token: %@", deviceToken); - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error NSLog(@"错误:%@", 错误);
    为项目添加了一个新目标:通知服务扩展:

    在项目中添加了banana.gif

    添加了将香蕉附件添加到NotificationService.m的代码

self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title]; // 添加图片附件 NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"banana" withExtension:@"gif"]; NSError *错误; UNNotificationAttachment *attachment = [UNNotificationAttachment attachmentWithIdentifier:@"banana" URL:fileURL options:nil error:&error]; self.bestAttemptContent.attachments = @[附件];

我错过了什么?

附加信息:当我使用本地通知而不是远程通知时,同样的效果。

【问题讨论】:

【参考方案1】:

您已经完成了大部分任务。您发送附件的方式通常是作为有效负载中的 URL。但是,如果您想对附件进行硬编码,就像您的代码一样,我认为它会起作用,但我认为您错过了一个关键组件。我认为服务扩展无法访问主包或其资源。如果您将资源添加到服务扩展并尝试加载它(使用类似 [NSBundle bundleForClass:[NotificationService class]] 的东西),我怀疑它会起作用。

但是,如果您将 URL 作为负载的一部分发送,那么您将要从该 URL 加载图像,而不是从包中加载。在这种情况下,我很确定您还必须在 NSURL 上使用 startAccessingSecurityScopedResource(以及 stopAccessingSecurityScopedResource)。

希望有帮助!

【讨论】:

好主意,我试过了,有两个问题:1.为什么“[modified]”标题修改不起作用? 2.我修改了工程的URL,支持文件下载,发送如下推送:gist.github.com/gklka/9802bb56340c38a7a481cde2c4fcaa70 好像也不行。 serviceExtensionTimeWillExpire() 被调用了吗?如果您从 Xcode(而不是应用程序)运行扩展,您可以在任一方法中打断点吗? NSLog 和在NotificationService.m 中设置断点似乎都不起作用。也许我错过了什么?你能检查一下我在 GitHub 上的项目吗? github.com/gklka/RichTest 使用您的确切项目,以及本教程中的推送脚本:raywenderlich.com/123862/push-notifications-tutorial 修改了这个问题的答案:***.com/questions/28221224/…,我得到了修改后的标题。 您仍然需要修复 URL 处理的代码: 1. 您正在调用 moveItemAtURL 将数据从 Web URL(从原始附件)移动到文件 URL(对于修改后的附件)。我怀疑你的意思是第一个参数是location 而不是url,但我不知道你是否需要在创建附件之前移动它。 2.您需要使用我在原始答案中提到的安全范围资源方法。

以上是关于如何在 iOS 10 应用程序中将媒体附件添加到我的推送通知?的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C 中的 iOS 10 富媒体推送通知(媒体附件)

ios 10推送通知媒体附件随机不起作用

IOS如何在目标c中将AFNetworking添加到我的xcode项目中

如何在 Swift 中将数组添加到我的 JSON 字典

如何在一行代码中将多个子视图添加到我的 iOS 视图中? (也许通过“monkeypatching”一个 `addSubviews` 实例方法到 UIView?)

如何在 ActionMailer 中将云文件添加为电子邮件附件