当前位置:首页 > 移动端 > iOS 远程推送通知

iOS 远程推送通知

2022年08月05日 19:34:10移动端8

1.什么是推送通知

  1. 在某些特殊情况下,应用程序被动收到的以不同种界面形式出现的提醒信息
  2. 推送通知的作用:可以让不在前台运行的app通知app发生了改变
  3. iOS中得推送通知种类
    1. 远程推送通知(Remote Notification)
    2. 本地推送通知(Local Notification)

2.推送通知的5种形式

iOS 远程推送通知 _ JavaClub全栈架构师技术笔记

3.推送通知的特点

  1. App关闭时,可以接收通知并显示
  2. App打开并处于后台时,通知会显示
  3. App打开并处于前台时,通知不会显示
  4. 点击通知后,默认会自动打开发出通知的App

4.远程推送通知

  1. 在联网的情况下,由远程服务器推送给客户端的通知,又称APNs(Apple Push Notification Services)
  2. 不管应用是打开还是关闭的情况下,都能接收到服务器推送的远程通知

5.远程通知的实现基础

  • 在联网状态下,所有苹果设备都会与苹果服务器建立长连接
    1. 长连接的作用:时间校准,系统升级,查找我的iPhone
    2. 长连接的好处:数据传输速度快,数据保持最新状态

6.远程推送的实现原理

iOS 远程推送通知 _ JavaClub全栈架构师技术笔记

iOS 远程推送通知 _ JavaClub全栈架构师技术笔记

  1. 安装App时
    1. 发送UDID和BundleID给APNs加密后返回deviceToken
    2. 登陆服务时,将用户身份和deviceToken发给服务器,服务器记录
  2. 李四给张三发消息
    1. 发送消息及张三的用户身份
    2. 服务器按照张三的身份找到存储的deviceToken,将消息和deviToken发送给APNs
    3. APNs通过deviceToken推送消息给张三

7.实现远程推送功能的前提

  1. 真机
  2. 调试阶段的证书
    1. aps_development.cer 电脑可以调试有推送功能的app的证书
    2. iOS_development.cer 电脑可以真机调试的证书
    3. xxx.mobileprovision 描述文件,其中确定了哪台手机和电脑可以进行调试
  3. 发布阶段的证书
    1. aps.cer 用该证书中说明的那台电脑发布的app具有远程推送功能时,用来使该app有推送功能的证书
    2. iOS_distribution.cer 电脑有发布app的能力的证书
    3. xxx.mobileprovision 描述文件,其中描述了哪台电脑可以发布app

8.实现远程推送功能的步骤

  1. 在启动方法中注册通知
  2. 注册成功后收到设备的deviceToken
  3. 实现用户点击通知后的响应(两种情况)
    1. 程序没有关闭,在后台实现AppDelegate中的didReceiveRemoteNotification方法
    2. 程序已经关闭,执行AppDelegation中的didFinishesLaunchingWithOption方法

9.远程推送的具体实现过程

  1. 去开发者平台,生成两个支持远程推送的证书
  2. 先点击App IDS添加一个准确的可以支持push功能的应用程序的BundleID
  3. 到生成的证书的那个节点下,先添加一个development阶段的支持push功能的cer文件
  4. 到最后一个provision节点下添加一个development阶段的支持push功能创建的那个App ID,cer文件要选择最新生成的支持push功能的cer文件,最后生成,下载,双击安装
  5. 为了确定cer文件和provision文件安装成功,可以到钥匙串和Xcode中的设备节点中分别查看(远程推送证书的申请流程请移步http://www.cnblogs.com/czq1989/p/5311302.html)
  6. 新建一个工程,先修改info.plist文件中Bundle ID为第二步创建的那个ID
  7. 为了兼容7.0所以修改配置中的deployment target为7.0
  8. 在AppDelegate中,发请求,询问是否要开通push功能,如果用户点击允许,则接收从服务器端发回的deviceToken(需要真机联网)
  9. 配置通过点击了通知打开应用程序后要做的事情,可以在AppDelegate中通过实现didReceiveRemoteNotification方法,就可以获取到用户点击了通知这个动作

10.远程推送过程中AppDelegate中所要响应的方法

  下面的方法都是写在AppDelegate.m文件中

/*
 1.有一种打开,叫做点击图标后的打开
 2.还有一种打开,叫做 点击了 通知 之后的打开
 当通过 点击通知  这种方法打开应用程序,执行didFinishLaunching方法时,launchOptions
 参数中,就存着通知发来的消息,也就是 类似于
 didReceiveRemote方法中的那个userInfo
*/
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    if ([UIDevice currentDevice].systemVersion.doubleValue <= 8.0) {
        //向服务器发请求,要注册推送功能,以此获取到服务器返回的deviceToken
        //type 用来说明 支持的通知形式
        //如 横幅 声音  角标
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert];
    }else{
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge| UIUserNotificationTypeSound|UIUserNotificationTypeAlert  categories:nil];
        [application registerUserNotificationSettings:settings];
        //申请使用通知
        [application registerForRemoteNotifications];
    }
    NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
    UILabel *label = [[UILabel alloc]init];
    label.frame = CGRectMake(0, 40, 300, 200);
    label.numberOfLines = 0;
    label.textColor = [UIColor whiteColor];
    label.font = [UIFont systemFontOfSize:24];
    label.backgroundColor = [UIColor blueColor];
    label.text =[NSString stringWithFormat:@"%@",userInfo];
    [self.window.rootViewController.view addSubview:label];
    return YES;
}

//只要获取到用户同意,则服务器端返回deviceToken
//会自动执行下面的方法
//1417f54c c7f0adb0 48e3558f 2b8a8bad 0a6a5152 54af017e 32137cda 8cbdb9d0
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSLog(@"%@",deviceToken);
}

/*
 用户点击了通知,进入到应用程序中,需要捕获到这个时机
 从而决定这一次的进入应用程序,到底要显示或执行什么动作,下面的方法就会在点击通知时自动调用
*/
/*
 1.应用程序在前台时:通知到,该方法自动执行
 2.应用程序在后台且没有退出时:通知到,只有点击了通知查看时,该方法自动执行
 3.应用程序退出:通知到,点击查看通知,不会执行下面的didReceive方法,而是只执行didFinishLauncing方法
*/
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    //NSLog(@"%@",userInfo);
    //为了测试在应用程序退出后,该方法是否执行
    //所以往第一个界面上添加一个label,看标签是否会显示一些内容
    UILabel *label = [[UILabel alloc]init];
    label.frame = CGRectMake(0, 250, 300, 200);
    label.numberOfLines = 0;
    label.textColor = [UIColor whiteColor];
    label.font = [UIFont systemFontOfSize:24];
    label.backgroundColor = [UIColor grayColor];
    label.text =[NSString stringWithFormat:@"%@",userInfo];
    [self.window.rootViewController.view addSubview:label];
}

/*
 此方法是新的用于响应远程推送通知的方法
 1.如果应用程序在后台,则通知到,点击查看,该方法自动执行
 2.如果应用程序在前台,则通知到,该方法自动执行
 3.如果应用程序被关闭,则通知到,点击查看,先执行didFinish方法,再执行该方法
 4.可以开启后台刷新数据的功能
   step1:点击target-->Capabilities-->Background Modes-->Remote Notification勾上
   step2:在给APNs服务器发送的要推送的信息中,添加一组字符串如:
    {"aps":{"content-available":"999","alert":"bbbbb.","badge":1}}
    其中content-availabel就是为了配合后台刷新而添加的内容,999可以随意定义
*/
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    UILabel *label = [[UILabel alloc]init];
    label.frame = CGRectMake(0, 250, 300, 200);
    label.numberOfLines = 0;
    label.textColor = [UIColor whiteColor];
    label.font = [UIFont systemFontOfSize:24];
    label.backgroundColor = [UIColor grayColor];
    label.text =[NSString stringWithFormat:@"%@",userInfo];
    [self.window.rootViewController.view addSubview:label];
    //NewData就是使用新的数据 更新界面,响应点击通知这个动作
    completionHandler(UIBackgroundFetchResultNewData);
}

11.PushMeBaby

  1. 作用:测试APNs的开源Mac项目,充当服务器,可以将内容提交给苹果的APNs服务器,然后APNs服务器再推送内容给用户的设备
  2. 使用
    1. 注销报错的代码
    2. 修改ApplicationDelegate.m文件中self.deviceToken
    3. 添加推送证书到项目中,并改名为apns.cer
    4. 运行填写信息,点击Push按钮完成发送
    5. 注意:出现SSLwrite():-36 94错误  http://www.cnblogs.com/czq1989/p/5314940.html

          无法拿到证书的路径:http://www.cnblogs.com/czq1989/p/5312146.html

iOS 远程推送通知 _ JavaClub全栈架构师技术笔记

iOS 远程推送通知 _ JavaClub全栈架构师技术笔记

demo:https://github.com/TigerCui/RemoteNotificationDemo.git

作者:TigerCui
来源链接:https://www.cnblogs.com/czq1989/p/5098871.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/mobile/17997.html

标签: iOS
分享给朋友:

“iOS 远程推送通知” 的相关文章

HBuilder X 连接苹果手机(IOS)详细教程。Windows: 连接iOS手机调试项目

HBuilder X 连接苹果手机(IOS)详细教程。Windows: 连接iOS手机调试项目

手机:苹果11,IOS版本:15.0 1.HBuilder X要是最新版本。 2.需要下载iTunes,注意事项: Windows 32位 itunes下载地址 Windows 64位 itunes下载地址 建议从如上地址下载...

mac下配置Charles,安装证书,连接iOS手机抓包

mac下配置Charles,安装证书,连接iOS手机抓包

目录 一、前置操作 二、mac上配置并信任证书 三、iOS手机手安装证书 四、查看效果  mac:MacBook Pro (Retina, 15-inch, Mid 2015) 手机:iPhone 12 p...

Flutter Web实战项目打造真正跨平台应用(windows,android,ios,linux,macos,web)

Flutter Web实战项目打造真正跨平台应用(windows,android,ios,linux,macos,web)

Flutter Web项目 Flutter 最近发布了 Flutter V2.5.1,其性能得到了很大提升,支持 Web、macOS、Android 和 iOS。 这就是为什么今天我们使用在 Web、macOS 应用、Android 和 iOS 应...

移动端热更新方案(iOS+Android)

移动端热更新方案(iOS+Android)

PPT资源包含iOS+Android 各种方案分析:https://github.com/qiyer/Share/blob/master/%E7%83%AD%E6%9B%B4%E6%96%B0%E5%88%86%E4%BA%ABPPT.pptx   一 、热更新(...

IOS开发之新浪围脖

IOS开发之新浪围脖

  IOS开发和Web开发一样,网络请求方式包括Get和Post方式。Get和Post两者有和特点和区别,在本篇博客中不做过多的论述,本篇的重点在于如何GET数据和POST数据。下面还会提到如何在我们的项目中使用CocoaPods, CocoaPods的安装和使用教程请参考链接http...

iOS开发之使用XMPPFramework实现即时通信(二)

iOS开发之使用XMPPFramework实现即时通信(二)

上篇的博客iOS开发之使用XMPPFramework实现即时通信(一)只是本篇的引子,本篇博客就给之前的微信加上即时通讯的功能,主要是对XMPPFramework的使用。本篇博客中用到了Spark做测试,当然也少不了Openfire服务器,在这就不详述Openfire的安装过程了(网上...

[iOS]使用signal让app能够在从容崩溃

前言   虽然大家都不愿意看到程序崩溃,但可能崩溃是每个应用必须面对的现实,既然崩溃已经发生,无法阻挡了,那我们就让它崩也崩得淡定点吧。 iOS SDK中提供了一个现成的函数 NSSetUncaughtExceptionHandler&nb...

IOS开发--微信支付

IOS开发--微信支付

前言:下面介绍微信支付的开发流程的细节,图文并茂,你可以按照我的随笔流程过一遍代码。包你也学会了微信支付。而且支付也是面试常问的内容。        正文:   1、首先在开始使用微信支付之前,有一些东西是开发者必须要知道的,打开下面链...

iOS开发之Alamofire源码解析

iOS开发之Alamofire源码解析

今天博客中的Alamofire源码的版本是以3.4版本为例。上篇博客系统的对NSURLSession相关的东西进行了详细的解析,详情请看《详解NSURLSession》,为了就是给本篇博客打下基础。因为AlamoFire就是对NSURLSession及其相关的东西进行了进一步的封装,让...

iOS开发支付篇——内购(IAP)详解

iOS开发支付篇——内购(IAP)详解

内购所需要的资料整理总结,史上最完整的,哈哈哈哈哈哈 思维导图 重点总结: 1.获取内购列表(从App内读取或从自己服务器读取) 2.App Store请求可用的内购列表 3.向用户展示内购列表 4.用户选择了...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。