实现一个简单ios图文富文本推送,只说重点以及实现相关代码

以下功能需要基本推送的基础上实现,关于基本推送,后面我们专门出一篇文章介绍,并一步一步实现

一.新建Notification Service Extension
如图
在这里插入图片描述

Identity规则包名.xxx
系统生成NotificationService类,这是用来接收推送消息json的类,即服务器apns发送json原始数据可以这里拦截到,并进行处理

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {

    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];
    
    NSDictionary *dict =  self.bestAttemptContent.userInfo;
    NSDictionary *notiDict = dict[@"aps"];
    self.bestAttemptContent.subtitle = [notiDict objectForKey:@"body"];
    self.bestAttemptContent.sound = [UNNotificationSound soundNamed:@"default"];
    NSString *imagePath = dict[@"imageUrl"] ;
    UNNotificationAttachment * attachment = [UNNotificationAttachment attachmentWithIdentifier:@"imageMy" URL:[self downLoadImageWriteToFile:imagePath] options:nil error:nil];
    if (attachment)
    {
        self.bestAttemptContent.attachments = @[attachment];
    }
    self.contentHandler(self.bestAttemptContent);
}

二.新建Notification Content Extension
如图
在这里插入图片描述
Identity规则:包名.xxx
这个生成NotificationViewController类,主要是设置推送消息布局如下

- (void)didReceiveNotification:(UNNotification *)notification {
    if (notification.request.content.attachments && notification.request.content.attachments.count > 0) {
           UNNotificationAttachment *attachment = [notification.request.content.attachments firstObject];
           //通过使用安全作用域解析创建attachment数据创建的NSURL,使url引用资源可供进程访问
           //startAccessingSecurityScopedResourcestopAccessingSecurityScopedResource需成对出现
           //当不再需要访问此资源时,客户端必须调用stopAccessingSecurityScopedResource
           if ([attachment.URL startAccessingSecurityScopedResource]) {
               NSData *imageData = [NSData dataWithContentsOfURL:attachment.URL];
               self.imageView.image = [UIImage imageWithData:imageData];
               [attachment.URL stopAccessingSecurityScopedResource];
           }
       }
}

那么问题来了,怎么将NotificationService获取到的图片信息传递到NotificationViewController类中显示
我的做法是在NotificationService类中把图片下载到沙河,然后在NotificationViewController中加载沙盒图片(中间有很多细节,列如30s超时这里不赘述),特别要注意,不同target(即Notification Service Extension与UNotification Content Extension)获取沙盒文件会出现路径不一样导致获取不到文件,以上代码中提供了一种方式大家可以看看

apns json示例

{
	"aps":{
		"alert":"",
		"sound":"default",
		"badge":1,
		"mutable-content": 1,
		"category": "categoryMy",
		"imageUrl":"xxx"
	}

}

其中:imageUrl我们推送包含的图片URL,
mutable-content写固定值为1
category 必须与Notification Content Extension的plist文件一致,如果你有多个Notification Content Extension,也可以指定不同category实现不同布局如图在这里插入图片描述

代码写完后,我们可以使用推送工具模拟推送,app store上有很多第三方的推送工具大家可以试试
推送后,如果想在Notification Content Extension或者Notification Service Extension打断点,却一直打不上怎么办,有以下两个原因
1.ios版本设置比手机的高,导致无法调试
2.没有debug绑定pid,pid即为刚刚Notification Content Extension或者Notification Service Extension的Identity
在这里插入图片描述
今天简单介绍到这里,虽然说很多细节没有说明白,但是只要按照以上步骤,90%的人copy也能顺利跑起来,如果有问题或者想了解更多细节可以留言看到会回复

原文地址:https://blog.csdn.net/weixin_43386483/article/details/126613523

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_38668.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注