iOS10推送教程详解

 更新时间:2016年09月19日 15:48:27   作者:消逝彼得  
这篇文章主要为大家详细介绍了iOS10推送开发教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

上个月接到一个需求,做ios10的推送,意图冲击AppStore头条.瞬间抓狂,工具都还没有,于是赶紧安装xcodeBeta版,ios10Beta版,然后就开始无尽的查资料,毕竟新功能,毕竟没做过........不过还好,在发布会之前赶出来了,由于本人比较懒,拖到现在才写出来,接下来就是见证奇迹的时刻!

原理

图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider。

APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。

上图可以分为三个阶段。

第一阶段:.net应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。

第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。

第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。

从上图我们可以看到。

1、首先是应用程序注册消息推送。

2、IOS跟APNS Server要deviceToken。应用程序接受deviceToken。

3、应用程序将deviceToken发送给PUSH服务端程序。

4、 服务端程序向APNS服务发送消息。

5、APNS服务将消息发送给iPhone应用程序。

xcode8以后测试环境证书就可以自动生成了,所以就不再多说.

创建

很久以前写过ios9的today extension,与其类似,同样需要创建一个target,

如图,Notification Content负责自定义通知UI,Notification Service Extension负责接收并处理数据

正活
ios的拓展类是不能独立联网请求数据的,但是之前做today的时候查过一些别的app,下拉通知栏的时候有些app可以抓到包,估计是单独做了一个网络请求的封装,只是瞎猜,如有雷同,纯属巧合.但是通知就不用那么麻烦了.首先从网上随便挑选一张图片(限定https协议): https://homeba.s3.amazonaws.com/__sized__/scene/2c0f3bdb7715fed7190fd87e5e5340e4-1473387950-crop-c0-5__0-5-590x442-85.jpg ,推送格式和可以自选,详情可见: https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/TheNotificationPayload.html .

上图是我用的格式,"aps"内部的内容ios会自动获取归类.

alert是通知的文字内容,

sound是通知声音,在这取默认,

badge是否显示程序徽章,

重点是mutable-content,这个字段决定了调用自定义通知界面,也就是Notification Content控制器

category是和后台商量好的一个值,显示action,也就是通知下面的按钮,可以扩展一些操作而不必进入程序.

"aps"外部就可以添加一些需要的字段,这就看具体需求了.

推送工具方面的准备工作就已经完成了,下面开始代码干货.

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];

NSString * attchUrl = [request.content.userInfo objectForKey:@"image"];
//下载图片,放到本地
UIImage * imageFromUrl = [self getImageFromURL:attchUrl];

//获取documents目录
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * documentsDirectoryPath = [paths objectAtIndex:0];

NSString * localPath = [self saveImage:imageFromUrl withFileName:@"MyImage" ofType:@"png" inDirectory:documentsDirectoryPath];
if (localPath && ![localPath isEqualToString:@""]) {
 UNNotificationAttachment * attachment = [UNNotificationAttachment attachmentWithIdentifier:@"photo" URL:[NSURL URLWithString:[@"file://" stringByAppendingString:localPath]] options:nil error:nil];
 if (attachment) {
 self.bestAttemptContent.attachments = @[attachment];
 }
}
self.contentHandler(self.bestAttemptContent);
}

因为不能方便的使用SDImage框架,所以网络请求只能自己松手,丰衣足食,另外,ios10通知虽然可以加载图片,但是只能加载本地的图片,所以这里需要做一个处理,先把图片请求下来,再存到本地

- (UIImage *) getImageFromURL:(NSString *)fileURL {
NSLog(@"执行图片下载函数");
UIImage * result;
//dataWithContentsOfURL方法需要https连接
NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileURL]];
result = [UIImage imageWithData:data];

return result;
}

//将所下载的图片保存到本地
-(NSString *) saveImage:(UIImage *)image withFileName:(NSString *)imageName ofType:(NSString *)extension inDirectory:(NSString *)directoryPath {
NSString *urlStr = @"";
if ([[extension lowercaseString] isEqualToString:@"png"])
{
 urlStr = [directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"png"]];
 [UIImagePNGRepresentation(image) writeToFile:urlStr options:NSAtomicWrite error:nil];
} else if ([[extension lowercaseString] isEqualToString:@"jpg"] ||
  [[extension lowercaseString] isEqualToString:@"jpeg"])
{
 urlStr = [directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"jpg"]];
 [UIImageJPEGRepresentation(image, 1.0) writeToFile:urlStr options:NSAtomicWrite error:nil];
} else
{
 NSLog(@"extension error");
}
return urlStr;
}

然后数据方便就已经完成了,最后一步,自定义UI并获取图片.自带的storyboard还是很好用的.

做好约束就可以加图片啦!

- (void)didReceiveNotification:(UNNotification *)notification {
NSLog(@"嘿嘿");
self.label.text = notification.request.content.body;
UNNotificationContent * content = notification.request.content;
UNNotificationAttachment * attachment = content.attachments.firstObject;
if (attachment.URL.startAccessingSecurityScopedResource) {
 self.imageView.image = [UIImage imageWithContentsOfFile:attachment.URL.path];
}
}

就是这么简单,大功告成!!!(松一大口气.....)

来一个效果图,哈哈

本文已被整理到了《iOS推送教程》,欢迎大家学习阅读。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • IOS UIWebView获取404、504等错误问题解决方案

    IOS UIWebView获取404、504等错误问题解决方案

    这篇文章主要介绍了IOS UIWebView获取404、504等错误问题的相关资料,并对相应的错误问题提出相应的解决方案,需要的朋友可以参考下
    2016-11-11
  • 详解iOS的深浅拷贝

    详解iOS的深浅拷贝

    本文详细介绍了IOS中的三种拷贝方式,对iOS的深浅拷贝有疑问的朋友们可以参考下本文。
    2016-08-08
  • IOS 创建并发线程的实例详解

    IOS 创建并发线程的实例详解

    这篇文章主要介绍了IOS 创建并发线程的实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • IOS 网络请求中设置cookie

    IOS 网络请求中设置cookie

    这篇文章主要介绍了IOS 网络请求中设置cookie的相关资料,需要的朋友可以参考下
    2017-06-06
  • iOS UITextField最大字符数和字节数的限制详解

    iOS UITextField最大字符数和字节数的限制详解

    在开发中我们经常遇到这样的需求:在UITextField或者UITextView中限制用户可以输入的最大字符数。但在UITextView , UITextfield 中有很多坑,网上的方法也很多。但是并不是很全面吧,这里全面进行了总结,有需要的朋友们可以参考借鉴,下面跟着小编一起来学习学习吧。
    2016-11-11
  • iOS-GCD详解及简单使用

    iOS-GCD详解及简单使用

    这篇文章主要介绍了iOS-GCD详解的相关资料,并附简单的实例代码,帮助大家学习理解此部分的知识,需要的朋友可以参考下
    2016-11-11
  • iOS表视图之下拉刷新控件功能的实现方法

    iOS表视图之下拉刷新控件功能的实现方法

    下拉刷新是重新刷新表视图或列表,以便重新加载数据,这种模式广泛用于移动平台,相信大家对于此也是非常熟悉的,那么iOS是如何做到的下拉刷新呢?下面小编给大家分享iOS表视图之下拉刷新控件的实现方法,一起看看吧
    2017-01-01
  • iOS应用开发中对UIImage进行截取和缩放的方法详解

    iOS应用开发中对UIImage进行截取和缩放的方法详解

    这篇文章主要介绍了iOS应用开发中对UIImage进行截取和缩放的方法,分别讲解了如何截取指定区域大小的UIImage以及缩放到指定大小和等比缩放的具体操作过程,需要的朋友可以参考下
    2016-04-04
  • iOS中监听UITextField值改变事件的方法实例

    iOS中监听UITextField值改变事件的方法实例

    UITextField 是一个用来处理文本输入和现实的控件,在我们的开发当中也是经常被用到。下面这篇文章主要给大家介绍了关于iOS中监听UITextField值改变事件的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-07-07
  • iOS自定义字体设置和系统自带的字体详解

    iOS自定义字体设置和系统自带的字体详解

    这篇文章主要给大家介绍了关于iOS自定义字体设置和系统自带的字体的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01

最新评论