iOS-本地推送和远程推送,常用的三方推送和常用的测试方法,推送实现和原理详解...

什么是消息推送

举一个常见的例子,我们的手机上经常会有弹出一些信息,例如QQ信息、微信信息等等,这就是常见的消息推送。

例如:

778724-20150905232341654-191345947.png

778724-20150905232401467-1043575899.png

778724-20150905232416717-131907038.png

778724-20150905232442670-839224500.png

消息推送的类型:

  • 在屏幕顶部显示一块横幅(显示具体内容)
  • 在屏幕中间弹出一个UIAlertView(显示具体内容)
  • 在锁屏界面显示一块横幅(锁屏状态下,显示具体内容)
  • 更新app图标的数字(说明新内容的数量)
  • 播放音效(提醒作用)

这是我们常见的推送消息的样式,我们可以在手机上自定义接收的消息如何展示。

在一些软件中,如果用户不小心关闭了我们的推送服务,我们也可以这样提示用户怎么打开允许接收推送服务(iOS8以后)。

778724-20150905232519795-854492966.png

注意:

  • 发出推送通知时,如果当前程序正运行在前台,那么推送通知就不会被呈现出来

  • 点击推送通知后,默认会自动打开发出推送通知的app

  • 不管app打开还是关闭,推送通知都能如期发出

消息推送和平常的从服务器获取数据有什么不同?

  • 当我们从服务器获取数据的时候,我们会主动向服务器发送消息,然后服务器才会给我们发送我们需要的信息;而消息推送是当我们不在聊天状态下,甚至是连QQ软件都没有打开的情况下,服务器主动向我们发送消息,告诉我们一些信息。

当然了,消息推送和通知(NSNotification)可不一样,虽然它们的使用类名看起来有点相似。

  • NSNotification是抽象的,不可见的
  • 消息推送是可见(肉眼可见的)

本地推送

在iOS中,推送分为本地推送和远程推送,本地推送不需要网络(不需要服务器的支持),常见的应用场景例如:

  • 事件提醒类的软件,到了我们自定义的时间,就会弹出一些信息告诉我们该干什么了。

  • 记账类软件,会提醒我们的一些花销等等。


我们先来学习一下本地推送

相关使用的类(重要)

  • 创建本地推送通知对象
UILocalNotification *ln = [[UILocalNotification alloc] init];
  • 设置本地推送通知属性
//推送通知的触发时间(何时发出推送通知)
@property(nonatomic,copy) NSDate *fireDate;//推送通知的具体内容
@property(nonatomic,copy) NSString *alertBody;//在锁屏时显示的动作标题(完整标题:“滑动来” + alertAction)
@property(nonatomic,copy) NSString *alertAction;//音效文件名
@property(nonatomic,copy) NSString *soundName;//app图标数字
@property(nonatomic) NSInteger applicationIconBadgeNumber;//每隔多久重复发一次推送通知
@property(nonatomic) NSCalendarUnit repeatInterval;//点击推送通知打开app时显示的启动图片
@property(nonatomic,copy) NSString *alertLaunchImage;//附加的额外信息
@property(nonatomic,copy) NSDictionary *userInfo;//时区
@property(nonatomic,copy) NSTimeZone *timeZone;
(一般设置为[NSTimeZone defaultTimeZone] ,跟随手机的时区)//调度本地推送通知(调度完毕后,推送通知会在特地时间fireDate发出)
[[UIApplication sharedApplication] scheduleLocalNotification:ln];//获得被调度(定制)的所有本地推送通知
@property(nonatomic,copy) NSArray *scheduledLocalNotifications;
(已经发出且过期的推送通知就算调度结束,会自动从这个数组中移除)//取消调度本地推送通知
- (void)cancelLocalNotification:(UILocalNotification *)notification;
- (void)cancelAllLocalNotifications;//立即发出本地推送通知
- (void)presentLocalNotificationNow:(UILocalNotification *)notification;
  • 用户点击推送消息进入app时的调用方法

//当用户点击本地推送通知,会自动打开app,这里有2种情况
//app并没有关闭,一直隐藏在后台
//让app进入前台,并会调用AppDelegate的下面方法(并非重新启动app)
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;//app已经被关闭(进程已死)
//启动app,启动完毕会调用AppDelegate的下面方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
//launchOptions参数通过UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知对象
//当点击通知进入app时,launchOptions参数才会有值,当正常启动app时,launchOptions为null

注意:

在iOS 8.0中,如果要使用本地通知,需要得到用户的许可
在didFinishLaunchingWithOptions方法中添加如下代码:

UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];[application registerUserNotificationSettings:settings];

实例:


//在需要的地方注册本地消息推送// 1.创建本地通知UILocalNotification *localNote = [[UILocalNotification alloc] init];// 2.设置本地通知的信息// 2.1.设置提示信息localNote.alertBody = @"吃饭了吗?";// 2.2.设置通知弹出的时间localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5.0];// 2.3.设置滑块显示的文字localNote.alertAction = @"快点";// 2.4.是否让上面的文字生效localNote.hasAction = NO;// 2.5.设置通知中心的标题localNote.alertTitle = @"你大哥";// 2.6.设置通知的声音localNote.soundName = @"buyao.wav";// 2.7.设置应用程序图标右上角的数字localNote.applicationIconBadgeNumber = 10;// 3.调度通知//调度前要先把原来的通知取消UIApplication *app = [UIApplication sharedApplication];[app cancelAllLocalNotifications];[app scheduleLocalNotification:localNote];

在appdelegate类中实现相应的跳转方法

#import "AppDelegate.h"#define IS_iOS8 ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)@interface AppDelegate ()@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {/*UIUserNotificationTypeNone    = 0,      不发出通知UIUserNotificationTypeBadge   = 1 << 0, 改变应用程序图标右上角的数字UIUserNotificationTypeSound   = 1 << 1, 播放音效UIUserNotificationTypeAlert   = 1 << 2, 是否运行显示横幅*/[application setApplicationIconBadgeNumber:0];if (IS_iOS8) {UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];[application registerUserNotificationSettings:settings];}// 如果是正常启动应用程序,那么launchOptions参数是null// 如果是通过其他方式启动应用程序,那么launchOptions就有值,里面存储的是通知的内容if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {// 当被杀死状态收到本地通知时执行的跳转代码[self jumpToSession];}return YES;
}//程序没有关闭时,点击通知进入app才会调用,如果将程序完全退出,点击通知进入app时只会调用上面的方法,不会调用这个方法
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{// 在这里写跳转代码// 如果是应用程序在前台,依然会收到通知,但是收到通知之后不应该跳转if (application.applicationState == UIApplicationStateActive) return;if (application.applicationState == UIApplicationStateInactive) {// 当应用在后台收到本地通知时执行的跳转代码[self jumpToSession];}
}- (void)jumpToSession
{UILabel *redView = [[UILabel alloc] init];redView.backgroundColor = [UIColor redColor];redView.frame = CGRectMake(0, 100, 300, 400);redView.numberOfLines = 0;// redView.text = [NSString stringWithFormat:@"%@", launchOptions];[self.window.rootViewController.view addSubview:redView];
}@end

远程推送

先介绍一下iOS中远程推送的原理:

我们先要明确一点,所有的iOS设备收到的远程推送消息都是通过苹果的服务器发出来的。我们自己公司的服务器或者第三方的推送服务器都是将要发送给我们的推送消息先推给苹果的服务器,然后再由苹果的服务器发送给我们。

如下图:

778724-20150905232549842-1953688890.png

所以,我们的苹果设备在联网的情况下,都会默认和苹果的服务器保持一个长连接(这里不解释长连接的概念,你可以理解成是有一条线一直在两者之间联系着,为了保持服务器不断开和我们设备的联系,我们的设备默认每隔一段时间会向服务器发送心跳包(一个很小的文件),来告诉苹果服务器不要和我们的设备断开连接)。

原理图讲解

下面详细解释一下iOS中的远程推送原理

778724-20150905234340998-1314763558.png

上图中1-8的步骤就可以很好的解释远程推送的过程了,而客户端需要做的只有几个步骤:

  • 1:发送设备的UDID和
    应用的Bundle Identifier
    给APNs服务器

  • 2:经苹果加密生成一个
    deviceToken

  • 3:发送当前用户的deviceToken
    和用户的标志(比如id或者qq)到自己公司的服务器或者第三方推送服务器

  • 4:监听通知的点击事件

其余的步骤由服务器端实现:

  • 4:自己的服务器或者第三方推送服务器将客户端发送过来的用户信息保存在自己的服务器中

  • 5:有人发送消息的时候,从服务器中(根据deviceToken)查询要发给谁

  • 6:查询到要发送给某人以后,将信息发送给苹果服务器

  • 7:苹果服务器根据得到的deviceToken和信息,查到要接受信息的设备和app,将信息发送给用户。

调试iOS的远程推送功能, 必备条件:

1.真机

2.调试推送需要的证书文件
1> aps_development.cer : 某台电脑就能调试某个app的推送服务
2> iphone5_qq.mobileprovision : 某台电脑就能利用某台设备调试某个程序

三.发布具有推送服务的app,需要的证书文件
1> aps_production.cer : 如果发布的程序中包含了推送服务,就必须安装这个证书
2> qq.mobileprovision : 某台电脑就能发布某个程序

实际操作

下面就开始真正的使用一下远程推送功能吧。

证书配置01 – 创建App ID

配置明确的App ID

大概步骤如下:

先选择明确的App ID

778724-20150905233254201-1570646357.png

配置远程推送的调试证书

778724-20150905233315170-1364818901.png
778724-20150905233336670-1061601399.png

778724-20150905233347561-217541473.png

778724-20150905233359295-173745249.png

778724-20150905233408607-1947860322.png

778724-20150905233417639-1170994192.png

778724-20150905233427186-188267282.png

配置远程推送的发布证书(使用第二种方法配置)

778724-20150905233449357-1995507758.png

778724-20150905233457373-1775984251.png

778724-20150905233509357-1534185463.png

778724-20150905233528217-853093322.png

新建项目,将Bundle ID改成和上面配置的成相同名字。
778724-20150905233545373-1896312360.png

如果还是不行,检查这里
778724-20150905233559373-515749806.png

将配置好的证书下载后安装。

接下来就可以开始处理远程推送的消息了:

  • 1、向苹果注册我们的设备,并获取到deviceToken

注意:
在iOS7和iOS8中的注册方法不一样

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// 请求获取DeviceTokenif ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {// 1.获取发送通知的权限UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];[application registerUserNotificationSettings:settings];// 2.注册远程通知[application registerForRemoteNotifications];} else {[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];}return YES;
}//获取到deviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{NSLog(@"%@", deviceToken);
}
  • 2、处理远程通知的消息

这里有两个方法,注意两者的区别,更具需要调用

//这个方法可以处理当用户点击消息进入前台做一些操作
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{NSLog(@"%@", userInfo);
}

//这个方法可以实现在用户手机收到消息就可以在后台进行一些操作,例如更新UI//不过,这个方法要先设置后台模式,方法如下:
/*1.开启后台模式2.调用completionHandler,告诉系统你现在是否有新的数据更新3.userInfo添加一个字段:"content-available" : "1" : 只要添加了该字段,接受到通知都会在后台运行*/
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{UIView *redView = [[UIView alloc] init];redView.frame = CGRectMake(100, 100, 100, 100);redView.backgroundColor = [UIColor redColor];[self.window.rootViewController.view addSubview:redView];completionHandler(UIBackgroundFetchResultFailed);
}

添加后台模式方法:

778724-20150905233616107-1336294323.png

测试工具介绍

下面介绍一种测试远程通知的工具PushMeBaby

  • PushMeBaby是一款用来测试ANPs的开源Mac项目
  • 它充当了服务器的作用,用法非常简单
  • 它负责将内容提交给苹果的APNs服务器,苹果的APNs服务器再将内容推送给用户的设备

778724-20150905233629607-1819898938.png

  • PushMeBaby的主页
    https://github.com/stefanhafeneger/PushMeBaby

使用步骤:

  • 注释掉不要的错误

778724-20150905233642701-556210302.png

  • 填写必要信息

    • deviceToken:用于找到设备的令牌

    • payload:推送的内容

778724-20150905233658279-774266338.png

  • 将推送的调试证书改为名apns.cer,添加到PushMeBaby项目中

778724-20150905233705592-1971172396.png

  • command + R启动程序,然后点击Push
    接下来就可以在设备上接收到远程推送通知

778724-20150905233718779-23403654.png

常用的第三方推送(极光推送)

什么是JPush

一套远程推送解决方案,支持android和iOS两个平台
它能够快捷地为iOS App增加推送功能,减少集成APNs需要的工作量、开发复杂度

更多的信息,可以参考JPush官方网站:https://www.jpush.cn

集成iOS SDK的步骤可以参考
http://docs.jpush.cn/pages/viewpage.action?pageId=2621727

转载于:https://www.cnblogs.com/66it/p/4784224.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3 : 1,从21世纪科技趋势分析美国为什么一定要遏制华为

作者&#xff1a;刘锋 计算机博士 互联网进化论作者前言&#xff1a;某种意义&#xff0c;21世纪国家间科技竞争的焦点就在于对互联网这个”类脑巨系统”的控制和利用。互联网有四个重要的战略核心&#xff0c;1.通讯系统--互联网神经纤维 2.芯片--智能设备心脏 3&#xff0…

创建加密应用程序

此演练提供用于对内容进行加密和解密的代码示例。这些代码示例是专为 Windows 窗体应用程序设计的。此应用程序并不演示实际方案&#xff08;如使用智能卡&#xff09;&#xff0c;而是演示加密和解密的基础。 此演练使用下列加密准则&#xff1a; 使用 RijndaelManaged 类&…

中科院詹剑锋:美国出口管控对中国开源软件及产业的影响。

来源&#xff1a;Bench Council摘要&#xff1a;开源软件受美国出口管控限制&#xff1f;对中国蓬勃发展的信息产业有着什么样的影响&#xff1f; 本周五&#xff08;19年5月24日&#xff09;上午9点组织中美科技和法律专家通过欣秀科教交流工具远程线上讨论&#xff0c; 6月27…

附全文 |《数字中国指数报告2019》重磅发布,下一个数字经济增长点将由产业驱动...

来源&#xff1a;腾讯研究院5月21日&#xff0c;2019腾讯全球数字生态大会在昆明盛大开幕。在主峰会上&#xff0c;腾讯研究院发布《数字中国指数报告&#xff08;2019&#xff09;》&#xff08;以下简称“报告”&#xff09;&#xff0c;推出2019数字中国指数&#xff0c;全面…

将KEEL的数据集转换为CSV文件

使用MATLAB将KEEL的数据集&#xff08;以glass1数据集为例&#xff09;转换为CSV文件步骤如下&#xff1a; 预处理&#xff1a;首先将从KEEL下载的.dat文件用记事本方式打开&#xff0c;删除里面的非数据部分 点击MATLAB的"导入数据"按钮&#xff0c;选择要转换的.…

超维计算让AI有记忆和反应,还能解决自动驾驶难题

来源&#xff1a;雷锋网这可以打破我们与自动驾驶汽车和其他机器人之间的僵局&#xff0c;这也将促使更像人类AI模型的出现。马里兰大学的一个研究团队最近提出了超维计算理论&#xff08;hyperdimensional computing theory&#xff09;&#xff0c;能够让机器人拥有记忆和反应…

数字图像处理-0.绪论

一、图像处理的概念 图像&#xff1a;是对客观物体的一种相似性的生动的写真或描述。 可见的图像&#xff1a;照片、图与画 、投影 /不可见光&#xff1a;不可见光成像&#xff08;红外、紫外等&#xff09;、数学模型的生成。 图像的类别&#xff1a;彩色和非彩色&#xff…

window下打开tensorboard

首先通过一个简单的 TensorFlow 程序&#xff0c;在这个程序中完成了TensorBoard 日志输出的功能。 import tensorflow as tfa tf.constant([1, 2, 3], nameinput1) b tf.constant([4, 5, 6], nameinput2) c tf.add_n([a, b], nameadd)with tf.Session() as sess:sess.run(…

数字图像处理-1.图像获取

一、图像数字化 原理&#xff1a;图像数字化是将一幅画面转化成计算机能处理的形式——数字图像的过程。 将一幅图像分割成如图的一个个小区域&#xff08;像元或像素&#xff09;&#xff0c;并将各小区域灰度用整数表示&#xff0c;形成一幅点阵式的数字图像。 包括采样和量…

刘炽平:腾讯要以生态方式进行开放,不做“颠覆者”

“我们希望做生态的‘共建者’&#xff0c;成为大家的‘帮助者’&#xff0c;而不是传统互联网行业的颠覆者。”在2019腾讯全球数字生态大会上&#xff0c;腾讯公司总裁刘炽平这样说道。本次大会由云南省人民政府指导&#xff0c;云南省文化和旅游厅、昆明市人民政府、腾讯公司…

数字图像处理--2.图像变换

一、图像的傅里叶变换 目的与用途 图像变换的目的&#xff1a; 使得图像处理问题简化&#xff1b;有利于图像特征提取&#xff1b;&#xff08;我们知道特征提取的目的是为了对影像进行分析&#xff0c;根据特征从影像中提取目标等有用信息&#xff0c;特征提取对影像中提取…

《腾讯数字生活报告2019》发布,互联网时代新马斯洛需求金字塔预示什么?

来源&#xff1a;腾讯研究院5月22日&#xff0c;腾讯研究院、腾讯应用宝、腾讯开放平台联合出品的《腾讯数字生活报告2019》在腾讯全球数字生态大会应用生态主题论坛上发布&#xff0c;报告从生存、关系、发展三个层级解读了大众数字生活版图中的新趋势及核心洞察。透过这份数字…

数字图像处理--3.图像增强

一、图像增强的点运算 图像增强&#xff1a;采用一系列技术&#xff0c;改善图像的视觉效果&#xff0c;或者将图像转换成一种更适合于人或者机器进行分析和处理的形式。 图像增强方法&#xff1a;1.空间域增强&#xff1a;直接对图像各像素进行处理&#xff1b;2.对图像进行…

腾讯姚星:两大科技矩阵助力两张网,立志攻克通用人工智能和多模态问题

来源&#xff1a;腾讯AI实验室5月21日&#xff0c;2019腾讯全球数字生态大会在昆明滇池国际会展中心开幕。本次大会由云南省人民政府指导&#xff0c;云南省文化和旅游厅、昆明市人民政府、腾讯公司共同主办&#xff0c;是腾讯战略升级后&#xff0c;整合互联网数字经济峰会、云…

图像处理-5

1.图像的数学变换 空间域&#xff1a;图像的代数运算和几何运算都是利用对输入图像进行加工而得到输出图像 转换空间&#xff1a;最典型的有离散傅里叶变换将原定义在图像空间的图像以某种形式转换到另外一些空间&#xff0c;并利用输入图像在这些空间的特有性质有效而快速地…

量子算法、DNA计算与后经典计算时代

来源&#xff1a;资本实验室二进制与伟大的计算机相结合&#xff0c;推动人类进入了信息化时代。在这个基于物质世界的&#xff0c;由0和1构成的新世界中&#xff0c;我们依靠算法和电子技术不断解决了大量曾经无法解决的问题。然而&#xff0c;好奇的人类总是善于提出新的、更…

使用Matplotlib创建散点图

假设data是m行两列的训练样本&#xff0c;labels是m行一列的类标签&#xff0c;类标签一共有3类&#xff0c;分别用1、2、3表示&#xff0c;现将data用散点图表示出来&#xff0c;且不同类的样本有不同的颜色&#xff1a; import matplotlib.pyplot as pltfig plt.figure() a…

数字图像-6空域滤波

空域处理 基本概念&#xff1a; 理论基础——线性系统响应&#xff1a;卷积理论 卷积的离散表达式&#xff0c;基本上可以理解为模板运算的数学表达式 由此&#xff0c;卷积的冲击响应函数h(x,y)&#xff0c;称为空域卷积模板。 空域滤波及滤波器的定义 使用空域模板进行的…

特斯拉烧,特斯拉烧完蔚来烧

来源&#xff1a;36氪最关键的问题还是在电池。又一台蔚来汽车自燃了。5月16日&#xff0c;上海嘉定一个小区的地下车库&#xff0c;一台黑色的蔚来ES8突然冒出大量浓烟。消防人员及时赶到&#xff0c;扑灭烟雾并封锁了现场&#xff0c;才没有引起火灾。根据车主的描述&#xf…

超出内容用省略号替代

最近学习了一下怎么用省略号代替超出的文本。 虽然网上的资料很多&#xff0c;但俗话说得好&#xff0c;好记性不如烂笔头&#xff0c;还是记一下吧&#xff01; 有两种方法&#xff0c;第一是用CSS实现&#xff1b;第二是用js HTML <p id"text">9月10日&#…