55

iOS 10 引入了推送通知框架更新,

UserNotificationsUI.framework

正如苹果文档中所写,当本地和远程通知出现在用户设备上时,它可以让我们自定义它们的外观。

因此,如果有人知道如何在锁定屏幕时在推送通知中显示图像。就像 andorid 推送通知一样。

谢谢,

4

4 回答 4

86

如果要自定义本地和远程通知的外观,请执行以下步骤:

  1. 创建一个UNNotificationCategory并添加到UNUserNotificationCenter类别:

    let newCategory = UNNotificationCategory(identifier: "newCategory",
                                             actions: [ action ],
                                             minimalActions: [ action ],
                                             intentIdentifiers: [],
                                             options: [])
    
    let center = UNUserNotificationCenter.current()
    
    center.setNotificationCategories([newCategory])
    
  2. 创建一个 UNNotificationContentExtension:

在此处输入图像描述

然后使用代码或情节提要来自定义您的UIViewController.

  1. 将类别添加到UNNotificationContentExtension的 plist:

在此处输入图像描述

4.推送通知

本地通知

创建一个UNMutableNotificationContent并将其设置categoryIdentifier为“newCategory”,其中包括UNUserNotificationCenter's categories 和UNNotificationContentExtension's plist:

let content = UNMutableNotificationContent()
content.title = ...
content.body = ...
content.categoryIdentifier = "newCategory"

let request = UNNotificationRequest.init(identifier: "newNotificationRequest", content: content, trigger: nil)

let center = UNUserNotificationCenter.current()
center.add(request)

远程通知

设置"mutable-content : 1""category : newCategory"。请注意,类别值设置为“newCategory”,它与您之前添加到的内容UNUserNotificationCenterUNNotificationContentExtensions plist 相匹配。

例子:

 {
    "aps" : {
        "alert" : {
        "title" : "title",
        "body" : "Your message Here"
        },
        "mutable-content" : "1",
        "category" : "newCategory"
    },
    "otherCustomURL" : "http://www.xxx.jpg"
 }
  1. 注意:需要支持3DTouch的设备或模拟器,否则无法显示自定义UNNotificationContentExtensionviewcontroller。(iOS10 Beta1不支持。但是现在这个作品没有3d touch)</li>

而且...如果您只想在锁定屏幕上显示的推送通知上显示图像,则需要添加 UNNotificationAttachment

let content = UNMutableNotificationContent()
content.title = ...
content.body = ...
content.categoryIdentifier = "newCategory"

let fileURL: URL = ... //  your disk file url, support image, audio, movie

let attachement = try? UNNotificationAttachment(identifier: "attachment", url: fileURL, options: nil)
content.attachments = [attachement!]

let request = UNNotificationRequest.init(identifier: "newNotificationRequest", content: content, trigger: nil)

let center = UNUserNotificationCenter.current()
center.add(request)

在此处输入图像描述

有关更多详细功能,演示

于 2016-06-28T03:30:08.140 回答
12

实际上,如果您正在设置本地通知并且您只是对在通知本身中显示图像感兴趣,那么您根本不必为 NotificationsUI.framework 或 UNNotificationContentExtensions 烦恼。仅当用户 3D 触摸或展开通知时需要自定义 UI 时,这才有用。

要添加设备上已经存在的图像(应用程序附带,或者在创建通知之前的某个时间由应用程序生成/存储),那么您只需添加一个带有文件 URL 的 UNNotificationAttachment 路径结束在 .png (或 .jpg 也可能工作?)。像这样的东西:

UNMutableNotificationContent *content = [UNMutableNotificationContent new];
content.title = @"Title";
content.body = @"Body";
content.sound = [UNNotificationSound defaultSound];
NSURL *imageURL = [NSURL URLWithString:@"file:/some/path/in/app/image.png"];
NSError *error;
UNNotificationAttachment *icon = [UNNotificationAttachment attachmentWithIdentifier:@"image" URL:imageURL options:nil error:&error];
if (error)
{
    NSLog(@"error while storing image attachment in notification: %@", error);
}
if (icon)
{
    content.attachments = @[icon];
}

然后,当通知出现时,图像将显示在通知横幅的右侧,就像消息通知一样。而且您不必跳过使用 categoryIdentifier 等设置内容扩展的所有麻烦。

编辑:更新添加这只是本地通知的有效解决方案。

于 2017-04-13T21:28:36.910 回答
5

您必须在创建推送通知以及处理时做一些工作。

  1. 创建有效负载时,您需要添加额外的属性附件,如下所示:

    {        
        aps : {
            alert: { },
            mutable-content:1
        }
        my-attachment = "url to resource"
    }
    
  2. 当您收到通知时,系统将调用didReceive服务扩展的方法,didReceive像这样覆盖通知扩展方法

    public func didReceive(_ request:UNNotificationRequest, withContentHandler contentHandler:(UNNotificatinContent) -> Void) {
        let fileUrl = //
        let attachment = UNNotificationAttachment(identifier : "image", url: fileUrl, options: nil)
        let content = request.content.mutableCopy as! UNMutableNotificationContent
        content.attachment = [attachment]
        contentHandler(content)
    }
    

是关于这个主题的 WWDC 视频谈话。

于 2016-06-16T21:57:35.893 回答
-1

使用符合 UNNotificationContentExtension 的 UIViewController 实现通知的自定义视图。

请参阅https://developer.apple.com/reference/usernotificationsui/unnotificationcontentextension

于 2016-06-15T15:43:27.797 回答