新建一个UNNotificationServiceExtension
在菜单栏下选择File-->New-->Target
image.png
然后分别选NotificationServiceExtension、UNNotificationContent创建Target;
image.png
然后写名字,点击Finish
image.png
点击Finish之后出来下面弹窗, 点击Activate。
image.png
此时我们的目录结构里面,已经多出了一个文件夹了。
image.png
到这一步,我们就新建了一个服务通知类的扩展。
下面开始实现自定义通知内容样式:
1、处理通知内容重写的方法:
- (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];
// self.contentHandler(self.bestAttemptContent);
// 重写一些东西
self.bestAttemptContent.title = @"我是标题";
self.bestAttemptContent.subtitle = @"我是子标题";
self.bestAttemptContent.body = @"我是body";
// 附件
NSDictionary *dict = self.bestAttemptContent.userInfo;
NSDictionary *notiDict = dict[@"aps"];
//重新获取后台推送的内容,再设置一遍。
NSDictionary *alertDict = notiDict[@"alert"];
self.bestAttemptContent.title = alertDict[@"title"];
NSString *imgUrl = [NSString stringWithFormat:@"%@",notiDict[@"imageAbsoluteString"]];
if (!imgUrl.length) {
self.contentHandler(self.bestAttemptContent);
}
[self loadAttachmentForUrlString:imgUrl withType:@"image" completionHandle:^(UNNotificationAttachment *attach) {
if (attach) {
self.bestAttemptContent.attachments = [NSArray arrayWithObject:attach];
}
self.contentHandler(self.bestAttemptContent);
}];
}
2、下载附件通知的方法:
- (void)loadAttachmentForUrlString:(NSString *)urlStr
withType:(NSString *)type
completionHandle:(void(^)(UNNotificationAttachment *attach))completionHandler{
__block UNNotificationAttachment *attachment = nil;
NSURL *attachmentURL = [NSURL URLWithString:urlStr];
NSString *fileExt = [self fileExtensionForMediaType:type];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
[[session downloadTaskWithURL:attachmentURL
completionHandler:^(NSURL *temporaryFileLocation, NSURLResponse *response, NSError *error) {
if (error != nil) {
NSLog(@"%@", error.localizedDescription);
} else {
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *localURL = [NSURL fileURLWithPath:[temporaryFileLocation.path stringByAppendingString:fileExt]];
[fileManager moveItemAtURL:temporaryFileLocation toURL:localURL error:&error];
NSError *attachmentError = nil;
attachment = [UNNotificationAttachment attachmentWithIdentifier:@"" URL:localURL options:nil error:&attachmentError];
if (attachmentError) {
NSLog(@"%@", attachmentError.localizedDescription);
}
}
completionHandler(attachment);
}] resume];
}
3、判断文件类型的方法
- (NSString *)fileExtensionForMediaType:(NSString *)type {
NSString *ext = type;
if ([type isEqualToString:@"image"]) {
ext = @"jpg";
}
if ([type isEqualToString:@"video"]) {
ext = @"mp4";
}
if ([type isEqualToString:@"audio"]) {
ext = @"mp3";
}
return [@"." stringByAppendingString:ext];
}
补充一些问题:
调试这个通知扩展类,为什么我跑程序的时候,打断点无反应?
答:这是因为你跑的target不对,正确的做法是,跑正确的target,具体如下图:
image.png
这个时候,再打断点,去测试发现还是不走方法。
查找资料之后发现可能是推送的内容格式不对。
推送内容格式如下:
{
"aps": {
"alert": "This is some fancy message.",
"badge": 1,
"sound": "default",
"mutable-content": "1",
"imageAbsoluteString": "http://upload.univs.cn/2012/0104/1325645511371.jpg"
}
}
这里我们要注意一定要有"mutable-content": "1",以及一定要有Alert的字段,否则可能会拦截通知失败。(苹果文档说的)。除此之外,我们还可以添加自定义字段,比如,图片地址,图片类型。
在极光后台设置如下图参数(必须选中下面的mutable-content,否则通知消息不会变化):
image.png
结果还是不走方法断点。
继续查找原因。
选中工程---> UNNotificationServiceExtension所对应的Target-->Deploy Target设置为iOS10,因为是从iOS10才支持推送多媒体文件,它默认是从当前Xocde支持的最高版本,比如测试的手机版本iOS10.0.2,它默认是iOS 10.2.0.刚开始没有修改,推送死活出不来图片,只有文字;后台检查才发现这里是从iOS 10.2.0支持的。
image.png
还是不行,最后把target改为了项目本身的target,终于成功了,修改了推送过来消息的样式。(断点还是没走)。
网友评论