一、iOS推送通知简介

众所周知苹果的推送通知从iOS3开始出现, 每一年都会更新一些新的用法. 譬如iOS7出现的Silent remote notifications(远程静默推送), iOS8出现的Category(分类, 也可称之为快捷回复), iOS9出现的Text Input action(文本框快捷回复).

而在iOS10, 苹果可谓是大刀阔斧般的, 对远程通知和本地通知进行了大范围的更新. iOS10推出了全新的UserNotifications框架(iOS10之前从属于UIKit框架).

新的推送通知框架, 整合了本地推送和远程推送的点击处理方法, 使得以前专门处理推送点击的方法只能处理静默推送了.

二、远程推送通知介绍

1、什么是远程推送

在联网的情况下,由远程服务器推送给客户端的通知,又称APNs(Apple Push Notification Services)不管应用是打开还是关闭的情况下,都能接收到服务器推送的远程通知在联网状态下,所有苹果设备都会与苹果服务器建立长连接

2、远程推送的实现原理:

      1.打开App时: 发送UDIDBundleIDAPNs加密后返回deviceToken

      2.获取Token后,App调用接口,将用户身份信息和deviceToken发给服务器,服务器记录

      3.当推送消息时, 服务器按照用户身份信息找到存储的deviceToken,将消息和deviToken发送给APNs

      4.苹果的APNs通过deviceToken, 找到指定设备的指定程序, 并将消息推送给用户

3、实现远程推送功能的前提

      1.真机

      2.调试阶段的证书

         iOS_development.cer 用于真机调试的证书

         aps_development.cer 用于真机推送调试能的证书

         xxx.mobileprovision 描述文件,记录了能够调试的手机、电脑和程序

      3.发布阶段的证书

          iOS_distribution.cer 用于发布app的证书

          aps.cer 用于发布时,让app有推送功能的证书

          xxx.mobileprovision 描述文件,记录了能够发布app的电脑

如何配置证书, 不在本教程内, 请读者自行处理, 或者参考视频教程

三、iOS10 全新远程通知教程

一、 注册远程推送并获取DeviceToken

1.创建iOS的项目,并输入项目名字

2.在AppDelegate中导入头文件:

 #import <UserNotifications/UserNotifications.h>

3.在application:didFinishLaunchingWithOptions方法中, 注册远程通知

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
 {
 //请求通知权限, 本地和远程共用
 UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
 [center requestAuthorizationWithOptions:UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError * _Nullable error) {
  if (granted) { 
   NSLog(@"请求成功"); 
    } else { 
    NSLog(@"请求失败"); 
    } 
   }];

 //注册远程通知
 [[UIApplication sharedApplication] registerForRemoteNotifications];

 //设置通知的代理
 center.delegate = self;

 return YES;
 }

4.在接收远程推送的DeviceToken方法中, 获取Token

 - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
 { 
 //将来需要将此Token上传给后台服务器
 NSLog(@"token:%@", deviceToken);
 }

二、 iOS10远程推送通知的处理方法

当点击了推送后, 如果你希望进行处理. 那么在iOS10中, 还需要设置UNUserNotificationCenterdelegate, 并遵守UNUserNotificationCenterDelegate协议.

以及实现下面实现3个方法, 用于处理点击通知时的不同情况的处理

      willPresentNotification:withCompletionHandler 用于前台运行

      didReceiveNotificationResponse:withCompletionHandler 用于后台及程序退出

      didReceiveRemoteNotification:fetchCompletionHandler用于静默推送

//设置通知的代理
center.delegate = self;

1.前台运行 会调用的方法

前台运行: 指的是程序正在运行中, 用户能看见程序的界面.

iOS10会出现通知横幅, 而在以前的框架中, 前台运行时, 不会出现通知的横幅.

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
 { 
  NSDictionary *userInfo = notification.request.content.userInfo; 

  //前台运行推送 显示红色Label
  [self showLabelWithUserInfo:userInfo color:[UIColor redColor]];

  //可以设置当收到通知后, 有哪些效果呈现(声音/提醒/数字角标)
  completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
 }

2.后台运行及程序退出 会调用的方法

后台运行: 指的是程序已经打开, 用户看不见程序的界面, 如锁屏和按Home键.

程序退出: 指的是程序没有运行, 或者通过双击Home键,关闭了程序.

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler
 {
  NSDictionary *userInfo = response.notification.request.content.userInfo; 

  //后台及退出推送 显示绿色Label
  [self showLabelWithUserInfo:userInfo color:[UIColor greenColor]]; 

  completionHandler();
 }

3.静默推送通知 会调用的方法

静默推送: iOS7以后出现, 不会出现提醒及声音.

要求:

推送的payload中不能包含alertsound字段

需要添加content-available字段, 并设置值为1

例如: {"aps":{"content-available":"1"},"PageKey”":"2"}

 //如果是以前的旧框架, 此方法 前台/后台/退出/静默推送都可以处理
 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
 {
   //静默推送 显示蓝色Label
  [self showLabelWithUserInfo:userInfo color:[UIColor blueColor]]; 

  completionHandler(UIBackgroundFetchResultNewData);
  }

4.处理通知的公用方法

开发中, 点击通知的逻辑应当看自己程序的需求.

这里为了方便演示, 简单的将通知的值, 通过UILabel显示在主界面上.

 - (void)showLabelWithUserInfo:(NSDictionary *)userInfo color:(UIColor *)color
 { 
  UILabel *label = [UILabel new];
  label.backgroundColor = color; 
  label.frame = CGRectMake(0, 250, [UIScreen mainScreen].bounds.size.width, 300);
  label.text = userInfo.description;
  label.numberOfLines = 0;
  [[UIApplication sharedApplication].keyWindow addSubview:label];
 }

三、测试远程推送

PushMeBaby是一个简单的模拟服务器的Mac小程序, 可以将内容提交给苹果的APNs服务器.

为了测试远程通知, 我们需要安装此程序.

请前往www.github.com, 搜索并下载PushMeBaby

使用时:

编译该项目, 如果报错, 则注释报错的代码, 不影响实际使用.

进入苹果开发者网站, 获取真机调试用的远程推送证书, 导入到项目中

将之前获取到的DeviceToken, 及测试的文字, 填入该项目中的AppDelegate中的init方法中.

运行此项目, 会出现一个Mac小程序, 点击Push即可发送远程通知.

 - (id)init { 
  self = [super init]; 
  if(self != nil) { 
   self.deviceToken = @"de20184c ef0461d5 12c76422 f5b78240 5f657e18 ebf91c9f 01d5560c e2913102";
   self.payload = @"{\\"aps\\":{\\"alert\\":{\\"title\\":\\"himeao\\",\\"subtitle\\":\\"自学成才\\",\\"body\\":\\"iOS10远程&本地推送教程\\"},\\"badge\\":1,\\"sound\\":\\"default\\"},\\"PageKey\\":\\"1\\"}"; 
   self.certificate = [[NSBundle mainBundle] pathForResource:@"aps_development" ofType:@"cer"]; 
  } 
  return self;
  }

总结

以上就是iOS10最新实现远程通知开发教程的全部内容,这篇文章的内容对大家学习iOS10还是很有参考借鉴价值的,希望能对各位iOS开发者们有所帮助,如果大家有疑问可以留言交流。

iOS10最新实现远程通知的开发教程详解的更多相关文章

  1. iOS中指纹识别常见问题汇总

    最近在公司做了一个app要使用指纹支付的功能,在实现过程中遇到各种坑,今天小编抽抗给大家总结把遇到问题汇总特此分享到脚本之家平台,需要的朋友参考下

  2. iOS10 适配以及Xcode8配置总结

    这篇文章主要介绍了iOS10 适配以及Xcode8配置总结的相关资料,本文通过图文并茂的形式给大家介绍,非常不错具有参考借鉴价值,需要的朋友可以参考下

  3. iOS10推送教程详解

    这篇文章主要为大家详细介绍了iOS10推送开发教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  4. php远程请求CURL实例教程(爬虫、保存登录状态)

    这篇文章主要给大家介绍了关于php远程请求CURL(爬虫、保存登录状态)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  5. iOS实现远程推送原理及过程

    这篇文章主要为大家详细介绍了iOS实现远程推送原理及具体过程,图文结合的方式针对iOS远程推送进行分析,感兴趣的小伙伴们可以参考一下

  6. iOS10通知框架UserNotification理解与应用

    在iOS10系统中,通知被整合进了UserNotification框架,除了使通知的处理脱离了UIApplication,通知功能的相关开发更加结构化与模块化外,还新增开放了许多更加灵活的开发接口,现在,开发者可以为通知定义UI末班,添加媒体附件,需要的朋友可以参考下

  7. iOS10添加本地推送(Local Notification)实例

    这篇文章主要为大家详细介绍了iOS10添加本地推送(Local Notification)实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  8. PHP抓取远程图片(含不带后缀的)教程详解

    最近在做微信登录开发时候,发现微信头像图片没有后缀名,传统的图片抓取方式不奏效,需要特殊的抓取处理。所以,后来将各种情况结合起来,封装成一个类,分享出来给大家,感兴趣的朋友们下面来一起看看吧。

  9. 针对iOS10新增Api的详细研究

    这篇文章主要针对iOS10新增Api进行详细研究,基于Api层面,着重看一些具体用法所做的笔记,感兴趣的小伙伴们可以参考一下

  10. 详解适配iOS10 的相关权限设置

    在最新版本的iOS10系统中,如果你的项目中访问了隐私数据,比如:相机、相册、录音、定位、联系人等等。涉及到权限问题,本篇文章主要介绍了适配iOS10 的相关权限设置,有兴趣的可以了解一下。

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部