example/ios/notiservice/NotificationService.m (48 lines of code) (raw):
//
// NotificationService.m
// notiservice
//
// Created by 王贇 on 2023/3/9.
//
#import "NotificationService.h"
@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];
// Modify the notification content here...
self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title];
// 获取通知中自定义KV字段,此处取key为`attachment`的value,为阿里云logo图片的Url地址
// 控制台 or OpenAPI推送时需要设定iOSExtParameters,其中携带`attachment`KV
NSString *picUrlString = self.bestAttemptContent.userInfo[@"attachment"];
if (picUrlString) {
NSString *picPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"notice_media.png"];
// 下载图片到本地
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithURL:[NSURL URLWithString:picUrlString] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
self.bestAttemptContent.body = [error description];
} else {
NSFileManager *fm = [NSFileManager defaultManager];
// 图片存储到指定picPath位置
[fm moveItemAtPath:location.path toPath:picPath error:nil];
// 创建通知附件
UNNotificationAttachment *attachment = [UNNotificationAttachment attachmentWithIdentifier:@"pic" URL:[NSURL URLWithString:[@"file://" stringByAppendingString:picPath]] options:nil error:&error];
if (error) {
self.bestAttemptContent.body = [error description];
} else if (attachment) {
// 添加通知附件到通知
self.bestAttemptContent.attachments = @[attachment];
}
// 弹出修改后的通知
self.contentHandler(self.bestAttemptContent);
}
}];
[downloadTask resume];
} else {
// 若没有指定资源Url,从本地获取资源添加到通知中
NSString *picLocalPath = [[NSBundle mainBundle] pathForResource:@"aliyun-logo-local" ofType:@"png"];
if (picLocalPath) {
NSError *error;
UNNotificationAttachment *attachment = [UNNotificationAttachment attachmentWithIdentifier:@"pic" URL:[NSURL URLWithString:[@"file://" stringByAppendingString:picLocalPath]] options:nil error:&error];
if (error) {
self.bestAttemptContent.body = [error description];
} else if (attachment) {
// 添加附件到通知
self.bestAttemptContent.attachments = @[attachment];
}
}
// 弹出修改后的通知
self.contentHandler(self.bestAttemptContent);
}
}
- (void)serviceExtensionTimeWillExpire {
// Called just before the extension will be terminated by the system.
// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
self.contentHandler(self.bestAttemptContent);
}
@end