推送通知
注意:这里说的推送通知跟NSNotification有所区别
NSNotification是抽象的,不可见的
推送通知是可见的(能用肉眼看到)
iOS中提供了2种推送通知
本地推送通知(Local Notification)
远程推送通知(Remote Notification)
推送通知的呈现效果总结
总结一下,推送通知有5种不同的呈现效果
在屏幕顶部显示一块横幅(显示具体内容)
在屏幕中间弹出一个UIAlertView(显示具体内容)
在锁屏界面显示一块横幅(锁屏状态下,显示具体内容)
更新app图标的数字(说明新内容的数量)
播放音效(提醒作用)
推送通知的使用细节
发出推送通知时,如果当前程序正运行在前台,那么推送通知就不会被呈现出来
点击推送通知后,默认会自动打开发出推送通知的app
不管app打开还是关闭,推送通知都能如期发出
本地推送通知
什么是本地推送通知
顾名思义,就是不需要联网就能发出的推送通知(不需要服务器的支持)
本地推送通知的使用场景
常用来定时提醒用户完成一些任务,比如
清理垃圾、记账、买衣服、看电影、玩游戏
如何发出本地推送通知
创建本地推送通知对象
UILocalNotification*ln = [[UILocalNotificationalloc]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)NSIntegerapplicationIconBadgeNumber;
如何发出本地推送通知
调度本地推送通知(调度完毕后,推送通知会在特地时间fireDate发出)
[[UIApplicationsharedApplication]scheduleLocalNotification:ln];
获得被调度(定制)的所有本地推送通知
@property(nonatomic,copy)NSArray*scheduledLocalNotifications;
(已经发出且过期的推送通知就算调度结束,会自动从这个数组中移除)
取消调度本地推送通知
- (void)cancelLocalNotification:(UILocalNotification*)notification;
- (void)cancelAllLocalNotifications;
立即发出本地推送通知
- (void)presentLocalNotificationNow:(UILocalNotification*)notification;
本地推送通知的其他属性
每隔多久重复发一次推送通知
@property(nonatomic)NSCalendarUnitrepeatInterval;
点击推送通知打开app时显示的启动图片
@property(nonatomic,copy)NSString*alertLaunchImage;
附加的额外信息
@property(nonatomic,copy)NSDictionary*userInfo;
时区
@property(nonatomic,copy)NSTimeZone*timeZone;
(一般设置为[NSTimeZonedefaultTimeZone],跟随手机的时区)
点击本地推送通知
当用户点击本地推送通知,会自动打开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取出本地推送通知对象
远程推送通知(难)
什么是远程推送通知
顾名思义,就是从远程服务器推送给客户端的通知(需要联网)
远程推送服务,又称为APNs(Apple Push Notification Services)
为什么需要远程推送通知?
传统获取数据的局限性
只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容
远程推送通知可以解决以上问题
不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知
远程推送通知使用须知
所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接
什么是长连接
只要联网了,就一直建立连接
长连接的作用
时间校准
系统升级
查找我的iPhone
.. ...
长连接的好处
数据传输速度快
数据保持最新状态
一.开发iOS程序的推送功能, iOS端需要做的事
1.请求苹果获得deviceToken
2.得到苹果返回的deviceToken
3.发送deviceToken给公司的服务器
4.监听用户对通知的点击
二.调试iOS的远程推送功能,必备条件:
1.真机
2.调试推送需要的证书文件
1>aps_development.cer:某台电脑就能调试某个app的推送服务
2>ios_development.cer:让电脑具备真机调试的能力(调试设备)
3>iphone5_qq.mobileprovision:某台电脑就能利用某台设备调试某个程序
三.发布具有推送服务的app
1>aps_production.cer:如果发布的程序中包含了推送服务,就必须安装此证书
2>ios_distribution.cer:让电脑具备发布程序的能力
3>qq.mobileprovision:某台电脑就能发布某个程序
注册远程推送通知
注册成功后会调用AppDelegate的下面方法,得到设备的deviceToken
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
NSLog(@"%@", deviceToken);
}
点击远程推送通知
当用户点击远程推送通知,会自动打开app,这里有2种情况
app并没有关闭,一直隐藏在后台
让app进入前台,并会调用AppDelegate的下面方法(并非重新启动app)
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo;
app已经被关闭(进程已死)
启动app,启动完毕会调用AppDelegate的下面方法
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions;
launchOptions参数通过UIApplicationLaunchOptionsRemoteNotificationKey取出服务器返回的字典内容
JPush
什么是JPush
一套远程推送解决方案,支持android和iOS两个平台
它能够快捷地为iOS App增加推送功能,减少集成APNs需要的工作量、开发复杂度
更多的信息
一.推送通知
1.什么是推送通知?
>首先明确:**此处的推送通知跟我们的”NSNotification”没有半毛钱关系
>可以理解为:向用户推送一条信息来通知用户某件事情
>作用:可以在APP退到后台,或者关闭时;继续推送一条消息告诉用户某件事情
2.推送通知的应用场景?
(1)一些任务管理APP,会在任务时间即将到达时,通知你做该任务;
(2)健身App定时提醒你应该健身了;
(3)买过电影票后,提前半小时告诉你,电影即将开场;
(4)当你QQ或者微信收到消息时,即使退到后台,或者关闭APP,也可以收到信息通知告诉我们;
(5)电商APP,推送一条消息通知我们有新品上架等等
3.推送通知的展现样式?
(1)在屏幕顶部显示一块横幅(显示具体内容)
(2)在屏幕中间弹出一个UIAlertView(显示具体内容)
(3)在锁屏界面显示一块横幅(锁屏状态下,显示具体内容)
(4)更新app图标的数字(说明新内容的数量)
(5)播放音效(提醒作用)
*注意:以上样式只能是用户自己设置,我们无法通过代码控制*
4.推送通知的分类
1.本地推送通知
“本地”可以理解为”不联网”;即使没有网络情况下,也可以推送通知消息
应用场景:确定知道未来某个时间点应该提醒用户什么
2.远程推送通知
概念:
与“本地”相对,表示,必须在联网情况下才会向用户推送通知消息
远程推送服务,又称为APNs(Apple Push Notification Services)
应用场景:
1.不确定未来某个时间点应该提醒用户什么,临时性的
2.当APP彻底退出时也想继续让用户获取一些最新消息
使用原则:谁能确定通知时间和内容,谁就可以发送(开发人员在APP内部通过代码发送=本地通知;服务器可以确定通知时间和内容=远程通知)
5.推送通知的实现
1.本地推送通知
1.创建UILocalNotification对象
2.设置一些必要属性
推送通知的触发时间(何时发出推送通知)
@property(nonatomic,copy) NSDate *fireDate;
推送通知的具体内容
@property(nonatomic,copy) NSString *alertBody;
3.开始推送通知
-根据fireDate设定的时间进行推送
[[UIApplication sharedApplication] scheduleLocalNotification:ln];
-立即推送
presentLocalNotificationNow:(UILocalNotification *)notification;
4.监听用户点击通知
- app处于前台
此时不会弹框通知用户通知的到达,但是还是会调用对应的代理方法
- app并没有关闭,一直隐藏在后台时
此时用户点击通知信息后,会让app进入前台,并会调用AppDelegate的下面方法
application: didReceiveLocalNotification:
- app已经被关闭(进程已死)
此时用户点击通知信息后,会启动app,启动完毕会调用AppDelegate的下面方法
application: didFinishLaunchingWithOptions:
launchOptions参数通过UIApplicationLaunchOptionsLocalNotificationKey取出本推送通知对象
5.额外设置
每隔多久重复发一次推送通知
@property(nonatomic) NSCalendarUnit repeatInterval;
点击推送通知打开app时显示的启动图片
@property(nonatomic,copy) NSString *alertLaunchImage;
附加的额外信息
@property(nonatomic,copy) NSDictionary *userInfo;
时区
@property(nonatomic,copy) NSTimeZone *timeZone;
(一般设置为[NSTimeZone defaultTimeZone],跟随手机的时区)
在锁屏时显示的动作标题(完整标题:“滑动来” + alertAction)
@property(nonatomic,copy) NSString *alertAction;
音效文件名
@property(nonatomic,copy) NSString *soundName;
app图标数字
@property(nonatomic) NSInteger applicationIconBadgeNumber;
6.其他操作
-获得被调度(定制)的所有本地推送通知
@property(nonatomic,copy) NSArray *scheduledLocalNotifications;
已经发出且过期的推送通知就算调度结束,会自动从这个数组中移除
-取消调度本地推送通知
- (void)cancelLocalNotification:(UILocalNotification *)notification;
- (void)cancelAllLocalNotifications;
7.注意事项
-在iOS 8.0+,如果要使用本地通知,需要得到用户的许可
在didFinishLaunchingWithOptions方法中添加如下代码
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[application registerUserNotificationSettings:settings];
8.额外补充
-在iOS8.0之后,可以设置推送通知带操作行为
在注册设置时,设置categories:参数
监听通知操作行为的点击
2.远程推送通知
1.远程推送的原理
>所有苹果设备,在联网状态下,都会与苹果服务器建立一个长连接
“长连接”:相对的一个概念是”短连接”
“长连接”优势:服务器可以向客户端发送信息,保证数据即时性
劣势:占用客户和服务器资源
“短连接”优势:节省资源,一个会话结束后,立即释放资源
劣势:服务器无法主动向客户端发信息
>苹果设备“长连接”作用:
时间校准
系统升级
查找我的iPhone
推送通知...
>原理就是借助苹果设备与APNs服务器之间的长连接,借助APNs服务器将消息发送给客户端
2.远程推送通知实现的条件
>只有真机可以调试推送通知
因为只有真机具备UDID,才能够生成deviceToken
>需要真机调试证书,推送测试证书
3.远程推送通知实现,客户端需要做的事
1.请求苹果获得deviceToken
/**
*请求通知授权,以及请求远程通知
*/
- (void)registerRemoteNotification
{
if(isIOS(8.0))
{
1.请求通知授权
UIUserNotificationSettings *notificationSet = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:notificationSet];
2.注册远程通知
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
iOS8.0之前请求远程推送通知
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound ];
}
}
2.得到苹果返回的deviceToken,发送deviceToken给公司的服务器
/**
*当远程通知注册后,APNs会通过调用这个方法,返回对应的deviceToken
*/
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSLog(@"%@", deviceToken);
}
3.监听用户对通知的点击
实现APP代理方法
接收到通知,并且在以下场景
当APP在前台时,可以调用
当APP从后台,进入到前台,可以调用
注意:当APP被彻底退出时,不调用这个方法,调用- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
NSLog(@"%@", userInfo);
}
或者:
/**
*当接收到远程通知时调用(iOS7.0之后使用)
*
*当前在前台时;或者app在后台\app被彻底退出状态下,点击通知打开app进入前台;都可以执行以下方法
*
*
*执行completionHandler作用
*
* 1>系统会估量App消耗的电量,并根据传递的UIBackgroundFetchResult参数记录新数据是否可用
* 2>调用完成的处理代码时,应用的界面缩略图会自动更新
*
*如果想要接收到通知后,不要用户点击通知,就执行以下代码,那么必须有三个要求:
1>必须勾选后台模式Remote Notification ;
2>告诉系统是否有新的内容更新(执行完成代码块)
3>设置发送通知的格式("content-available":"1")
4>如果需要推送语音播报 则还需要在capabilities 中的background mode中勾选voice over ip 和 remote notifications,文章末尾有相关demo
*/
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler
{
}
4.远程推送测试
> PushMeBaby
1.编译会出现错误,直接把错误行注释即可;
2.需要填写对应的deviceToken;
3.需要将推送测试证书改名为aps.cer拖入项目中;
5.第三方推送
极光推送(JPush)
个推
信鸽
二.应用程序间跳转
1.什么是应用间跳转,有什么作用?
-应用场景
1.使用第三方用户登录,需要用户授权,还需要"返回到调用的程序,同时返回授权的用户名"
2.应用程序推广,网易彩票,设置-推荐应用-有很多应用程序图标如果本机已经安装过,会直接跳转到另外一个应用程序,软件的广告,推广结果,后续会有一些列的金钱上的结算
3.支付宝,第三方支付,淘宝,电话费充值。。。
2.应用程序间跳转实现?
直接打开对应APP的scheme即可
1.概念须知
> URL :统一资源定位符
scheme(协议头) :决定通过什么方式查找资源http:// ftp://tel://file://
path(路径) :资源路径www.baidu.com192.168.1.1/资源110 /User/Desktop
2.设置方式
>默认情况下应用程序是没有自己的URL的,如果想要拥有自己的URL,需要设置URL
项目-> info -> URL Types -> URL Scheme
3.打开方式
代码:
[[UIApplication shareApplication] openURL:appURL];
4.跳转到对方APP,对方APP执行的代理方法
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
}
iOS9.0跳转适配
在info.plist文件中添加LSApplicationQueriesSchemes字段,是数组类型
三.社交分享
1.什么是社交分享,有什么作用?
-通过用户的分享,让更多的人去了解和使用这个App
-目前移动互联网应用程序推广的最重要手段之一
-属于口碑营销的范畴,经典成功案例是《疯狂猜图》
2.社交分享的实现方案
1.系统自带社交分享
1.导入Social.framework
2.判断服务是否可用
[SLComposeViewController isAvailableForServiceType:SLServiceTypeSinaWeibo];
3.弹出分享内容输入界面
SLComposeViewController *cc = \[SLComposeViewController composeViewControllerForServiceType:SLServiceTypeSinaWeibo];
[selfpresentViewController:cc animated:YEScompletion:nil];
4.额外设置
[cc setInitialText:@"测试文字"];初始化文字
[cc addImage:[UIImage imageNamed:@"lufy"]];配图
2.第三方SDK实现(友盟分享)
下载地址: [http://www.umeng.com/]
1.申请账号,创建应用
2.下载SDK
3.参照集成文档
远程推送应用配置过程
1.创建支持远程推送功能的App ID
2.创建调试证书,并选中刚刚创建的App ID
3.下载CER文件,并导入钥匙串管理
4.创建发布证书,并选中刚刚创建的App ID
5.下载CER文件,并导入钥匙串管理
6.检查App ID,确认证书已经指定
7.生成描述文件
格式:{"aps":{"alert":"This is some fancy message.","badge":1,"sound":"default"}}
远程推送应用程序开发过程
1.新建应用程序
2.指定AppID,在developer.apple.com上设置的AppID
if(系统版本>= 8.0)
{
注册接收通知的类型
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:settings];
注册允许接收远程推送通知
[application registerForRemoteNotifications];
}
else
{
如果是iOS7.0,使用以下方法注册
[application registerForRemoteNotificationTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound];
}
当得到苹果的APNs服务器返回的DeviceToken就会被调用
7040f7d5 5a974598 c5cf31b5 3e340b39 68affd25 122f0ce1 3f315226 396c2e5b
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSLog(@"deviceToken是:%@", deviceToken);
}
接收到远程通知,触发方法和本地通知一致
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSLog(@"%@", userInfo);
}
使用后台的远程消息推送
1>在Capabilities中打开远程推送通知
2>实现代理方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler
远程消息数据格式:
{"aps": {"content-available": 1},"content-id": 42}
执行completionHandler有两个目的
1>系统会估量App消耗的电量,并根据传递的UIBackgroundFetchResult参数记录新数据是否可用
2>调用完成的处理代码时,应用的界面缩略图会自动更新
注意:接收到远程通知到执行完网络请求之间的时间不能超过30秒
if(userInfo) {
intcontentId = [userInfo[@"content-id"] intValue];
ViewController *vc = (ViewController *)application.keyWindow.rootViewController;
[vc loadDataWithContentID:contentId completion:^(NSArray *dataList) {
vc.dataList = dataList;
NSLog(@"刷新数据结束");
completionHandler(UIBackgroundFetchResultNewData);
}];
}else{
completionHandler(UIBackgroundFetchResultNoData);
}
GitHub 项目链接 :
https://github.com/liminting/MTTestPushVoice
上图为2017年最新的视频教程资料,搜索2352149755加我好友私聊我上传视频教程,有什么不懂的也可以来私聊问我。
不定时更新中。
如果你能明白这些视频资料的好差,那么你也算是入行了,底层和中高层就是这一步之差。