版本记录
版本号 | 时间 |
---|---|
V1.0 | 2020.05.03 星期日 |
前言
我们做APP很多时候都需要推送功能,以直播为例,如果你关注的主播开播了,那么就需要向关注这个主播的人发送开播通知,提醒用户去看播,这个只是一个小的方面,具体应用根据公司的业务逻辑而定。前面已经花了很多篇幅介绍了极光推送,其实极光推送无非就是将我们客户端和服务端做的很多东西封装了一下,节省了我们很多处理逻辑和流程,这一篇开始,我们就利用系统的原生推送类结合工程实践说一下系统推送的集成,希望我的讲解能让大家很清楚的理解它。感兴趣的可以看上面几篇。
1. 系统推送的集成(一) —— 基本集成流程(一)
2. 系统推送的集成(二) —— 推送遇到的几个坑之BadDeviceToken问题(一)
3. 系统推送的集成(三) —— 本地和远程通知编程指南之你的App的通知 - 本地和远程通知概览(一)
4. 系统推送的集成(四) —— 本地和远程通知编程指南之你的App的通知 - 管理您的应用程序的通知支持(二)
5. 系统推送的集成(五) —— 本地和远程通知编程指南之你的App的通知 - 调度和处理本地通知(三)
6. 系统推送的集成(六) —— 本地和远程通知编程指南之你的App的通知 - 配置远程通知支持(四)
7. 系统推送的集成(七) —— 本地和远程通知编程指南之你的App的通知 - 修改和显示通知(五)
8. 系统推送的集成(八) —— 本地和远程通知编程指南之苹果推送通知服务APNs - APNs概览(一)
9. 系统推送的集成(九) —— 本地和远程通知编程指南之苹果推送通知服务APNs - 创建远程通知Payload(二)
10. 系统推送的集成(十) —— 本地和远程通知编程指南之苹果推送通知服务APNs - 与APNs通信(三)
11. 系统推送的集成(十一) —— 本地和远程通知编程指南之苹果推送通知服务APNs - Payload Key参考(四)
12. 系统推送的集成(十二) —— 本地和远程通知编程指南之Legacy信息 - 二进制Provider API(一)
13. 系统推送的集成(十三) —— 本地和远程通知编程指南之Legacy信息 - Legacy通知格式(二)
14. 系统推送的集成(十四) —— 发送和处理推送通知流程详解(一)
15. 系统推送的集成(十五) —— 发送和处理推送通知流程详解(二)
为什么要自定义通知
这里其实我们可以不用自定义通知,因为系统有个默认模式的自定义通知,但是由于业务场景越来越复杂和不同,所以很多时候我们需要自定义通知。
这样可以自定义显示通知界面,具有更好的定制化。
步骤
这里说一下具体步骤
- 新建一个target,并且命名
"XXXX"
,配置下info.plist
,如下所示:
可以看见,这里UNNotificationExtensionCategory
就是个分类标识符,这里就是一个唯一的字符串,NSExtensionPrincipalClass
这个key就是用来定制化界面UI的VC。需要我们去实现。
#import
@interface NotificationViewController : UIViewController
@end
在该VC里实现
- (void)didReceiveNotification:(UNNotification *)notification {
// @{@"aps": @{@"category": @"xxx_live_category",
// @"alert": @{@"title": @"正在直播(使劲按我预览)",
// @"body": @"某某某 在x中:xx这是一个长长的直播标题啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊,大概省略998个字"},
// @"mutable-content": @1},
// @"type": @2,
// @"extends": @{@"relateid": @"187212393"},
// @"image": @"https://i.xxx.net/2017/12/13/5a31017b67a82.png"
// }
if (notification.request.content.attachments.count > 0) {
UNNotificationAttachment *attachment = notification.request.content.attachments.firstObject;
if (attachment.URL) {
self.coverUrl = attachment.URL;
if ([self.coverUrl startAccessingSecurityScopedResource]) {
UIImage *coverImage = [UIImage imageWithContentsOfFile:self.coverUrl.path];
self.coverImgView.image = coverImage;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.coverUrl stopAccessingSecurityScopedResource];
});
}
}
}
NSDictionary *userInfo = notification.request.content.userInfo;
if (userInfo[@"image"] && !self.coverImgView.image) {
self.cover = userInfo[@"image"];
}
if ([userInfo[@"extends"] isKindOfClass:[NSDictionary class]]) {
if (self.cover == nil && userInfo[@"extends"][@"avatar"]) {
self.cover = userInfo[@"extends"][@"avatar"];
}
if (userInfo[@"extends"][@"liveid"]) {
_liveId = userInfo[@"extends"][@"liveid"];
[self getLiveDetailInfoWithLiveid:userInfo[@"extends"][@"liveid"] proomid:userInfo[@"extends"][@"proomid"]];
}
else {
[self failAction:NO];
}
if (userInfo[@"extends"][@"userid"]) {
_authorId = userInfo[@"extends"][@"userid"];
}
}
else {
[self failAction:NO];
}
}
- 同时该target里面,也需要添加网络请求(封装下AFN)和其他辅助类。
下面就是在AppDelegate.m
中进行调用
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler
{
if ([response.actionIdentifier isEqualToString:UNNotificationDismissActionIdentifier]) {
// The user dismissed the notification without taking action
return;
}
else if ([response.actionIdentifier isEqualToString:UNNotificationDefaultActionIdentifier]) {
// The user launched the app
if ([response.notification.request.content.categoryIdentifier isEqualToString:@"xxx_live_category"]) {
NSDictionary *userInfo = response.notification.request.content.userInfo;
}
else if ([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]] || [response.notification.request.trigger isKindOfClass:[UNTimeIntervalNotificationTrigger class]]) {
NSDictionary *userInfo = response.notification.request.content.userInfo;
//处理推送
}
}
completionHandler();
}
其他就是一些需要处理的细节了。
后记
本篇主要讲述了自定义远程通知的使用,感兴趣的给个赞或者关注~~~