美文网首页iOS开发技巧
系统推送的集成(十六) —— 自定义远程通知(一)

系统推送的集成(十六) —— 自定义远程通知(一)

作者: 刀客传奇 | 来源:发表于2020-05-03 13:58 被阅读0次

版本记录

版本号 时间
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 <UIKit/UIKit.h>

@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();
}

其他就是一些需要处理的细节了。

后记

本篇主要讲述了自定义远程通知的使用,感兴趣的给个赞或者关注~~~

相关文章

  • 系统推送的集成(十六) —— 自定义远程通知(一)

    版本记录 版本号时间V1.02020.05.03 星期日 前言 我们做APP很多时候都需要推送功能,以直播为例,如...

  • iOS推送消息处理

    注册远程推送 极光推送跟着极光推送官方的文档集成就行,使用控制台测试是否收到通知,如果收不到,可以先检查远程通知是...

  • 本地推送通知、远程推送通知、激光推送

    title : 本地推送通知、远程推送通知、激光推送category : UI 本地推送通知、远程推送通知、激光...

  • 一些项目中可能只需要配置一次的东西吧

    本地推送&远程推送 1.远程推送 推送通知的分类远程推送通知本地推送通知 推送通知作用可以让不在前台运行的App告...

  • 远程通知推送教程

    远程通知推送教程 远程通知推送教程

  • iOS开发之远程推送

    远程推送通知 什么是远程推送通知 顾名思义,就是从远程服务器推送给客户端的通知(需要联网)远程推送服务,又称为AP...

  • 集成华为推送那些坑

    近期集成华为推送,谈谈我遇到的那些坑 1、华为推送中通知类型为通知,通知音乐不能自定义 以上是华为官方文档常见问题...

  • iOS 远程通知

    iOS推送通知分为两种: 远程推送通知(Remote Notification) 苹果的远程通知服务 APNs(A...

  • iOS 远程推送通知

    iOS 远程推送通知 分分钟搞定IOS远程消息推送 iOS推送通知的实现步骤 推送通知iOS客户端编写实现及推送服...

  • 推送、套接字 Socket

    1.推送 iOS 中的通知包括本地推送通知和远程推送通知,两者在 iOS 系统中都可以通过弹出横幅的形式来提醒用户...

网友评论

    本文标题:系统推送的集成(十六) —— 自定义远程通知(一)

    本文链接:https://www.haomeiwen.com/subject/oqsnwhtx.html