一.之前推送用的一直是极光推送,目前项目中用的是个推(之前都没有听说过。。。)
按照以往的理解推送当然是要在通知栏收到通知
项目接通个推以后,怎么推通知都没有,可是可以在控制台打印出收到的消息(好奇怪,我一脸懵逼@·@)
经过一天的研究才知道,之前所理解的推送是APNs通知(推送通知),现在所接的是在应用内的透传消息。
这两种是有差别的,具体有什么差别呢,极光上面也有介绍
整了个没有听过的个推,其实原理是跟极光实现是一样的。
我们所能看到的区别,就像图中所介绍的应用内消息是没有系统的提醒的,只是进行了消息的一个传递。
通知:发送后会在系统通知栏收到展现,同时响铃或振动提醒用户。
消息:以透传的形式传递给客户端,无显示,发送后不会在系统通知栏展现,第三方应用后需要开发者写代码才能看到。
二.
这里是指推送通知跟NSNotification有区别:
1、NSNotification是系统内部发出通知,一般用于内部事件的监听,或者状态的改变等等,是不可见的
2、本地通知与远程通知是可见的,主要用于告知用户或者发送一些App的内容更新,推送一些相关的消息,让用户知道App内部发生了什么事情。
Paste_Image.png
iOS常用通知
1、本地推送通知:(Local Notification)
2、远程推送通知:(Remote Notification)
iOS通知呈现效果(5)
1.设置音效,(提醒作用)
2.设置横幅,
3.设置弹窗,
4.锁屏下也可以呈现,
5.App图标的数字 (即新内容的数量)
至于显示横幅或者弹窗,取决于用户的设置
iOS手机设置中:通知中心-选择应用-选择应用下的通知模式-OK!
Paste_Image.png
通知的注意点
1、App在前台运行的时候,通知不会展示出来
2、点击通知,默认会自动打开推送通知的App
3、不管App是否打开,通知都可以如期发出
1、本地推送通知:
不需要联网就可以发出的通知
使用场景:
提醒用户完成一些任务,比如:定时提醒,生活备注,看电影等等
推送通知属性:
@property(nonatomic) NSCalendarUnit repeatInterval;
@property(nonatomic,copy) NSCalendar *repeatCalendar;
@property(nonatomic,copy) CLRegion *region
@property(nonatomic,assign) BOOL regionTriggersOnce NO
@property(nonatomic,copy) NSString *alertBody;
@property(nonatomic) BOOL hasAction;
@property(nonatomic,copy) NSString *alertAction;
@property(nonatomic,copy) NSString *alertLaunchImage;
@property(nonatomic,copy) NSString *alertTitle
@property(nonatomic,copy) NSString *soundName;
@property(nonatomic) NSInteger applicationIconBadgeNumber;
@property(nonatomic,copy) NSDictionary *userInfo;
如何发出本地通知:
UILocalNotification *localNote = [[UILocalNotification alloc] init];
localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:3.0];
localNote.alertBody = @"在干吗?";
localNote.alertAction = @"解锁";
localNote.hasAction = NO;
localNote.alertLaunchImage = @"123Abc";
localNote.alertTitle = @"你有一条新通知";
localNote.soundName = @"buyao.wav";
localNote.applicationIconBadgeNumber = 999;
localNote.userInfo = @{@"type" : @1};
[[UIApplication sharedApplication] scheduleLocalNotification:localNote];
使用注意:
iOS7,不需要用户授权就可发出通知,而iOS8以后,必须用户授权才可以发出通知,否则在手机系统设置-通知列表里是不会有你的app的。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[application setApplicationIconBadgeNumber:0];
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:settings];
if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
UILabel *redView = [[UILabel alloc] init];
redView.frame = CGRectMake(0, 0, 200, 300);
redView.numberOfLines = 0;
redView.font = [UIFont systemFontOfSize:12.0];
redView.backgroundColor = [UIColor redColor];
redView.text = [NSString stringWithFormat:@"%@", launchOptions];
[self.window.rootViewController.view addSubview:redView];
return YES;
监听通知,如果用户打开通知,可以让用户进入一些特定的界面
应用程序在进入前台,或者在前台的时候都会执行该方法
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
if (application.applicationState == UIApplicationStateInactive) {
NSLog(@"进行界面的跳转");
NSLog(@"%@", notification.userInfo);
UIView *redView = [[UIView alloc] init];
redView.frame = CGRectMake(0, 0, 100, 100);
redView.backgroundColor = [UIColor redColor];
[self.window.rootViewController.view addSubview:redView];
2、远程推送通知:
从远程服务器推送给客户端的通知(需要联网)
远程推送服务---就是APNs
模拟器无法调试远程推送
为什么需要远程推送通知:
解决获取传统数据的局限性,让数据实时更新
使用场景:
聊天功能(一般非即时聊天)、推送一下App的内部新功能、版本下载等
注:所有的苹果设备,在联网状态下,都会与苹果的服务器建立-长连接
长连接的作用:
时间效准、系统升级、查找我的iphone、远程通知
好处:
数据传输快、数据保持最新状态
Paste_Image.png
我在面试中一般也比较喜欢问面试者这个问题。能解释清楚肯定就有货真价实的开发经验
使用远程推送
1、获取苹果获得deviceToken-获取手机UDID+应用的唯一标识(bundel ID)
2、得到苹果返回的deviceToken
3、发送deviceToken给公司的服务器
4、监听用户对通知的点击
如何调试远程推送功能
1、真机
2、调试推送需要的证书文件
证书自己配置。。。
3、发布具有推送服务的App
包含推送的cer证书+某个具有发布资格的电脑,就可以发布
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:settings];
[application registerForRemoteNotifications];
} else {
[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeNewsstandContentAvailability | UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert];
if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {
return YES;
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
NSLog(@"%@", deviceToken.description);
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
NSLog(@"%@", userInfo);
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
NSLog(@"---------");
UIView *redV = [[UIView alloc] init];
redView.backgroundColor = [UIColor redColor];
redView.frame = CGRectMake(100, 100, 100, 100);
[self.window.rootViewController.view addSubview:redV];
completionHandler(UIBackgroundFetchResultNewData);
1、打开后台模式
Paste_Image.png
2、告诉系统有新内容
completionHandler(UIBackgroundFetchResultNewData);
3、发送通知有固定格式
("content-available":"1")
找的这张图:也有相应的模拟推送代码,需要的可以联系我
Paste_Image.png
一般开发中直接使用(jpush)激光推送就可以快速完成App的推送功能。具体按照官方文档来进行.
三.判断用户是否打开APP通知开关
#define IOS8 ([[[UIDevice currentDevice] systemVersion] doubleValue] >=8.0 ? YES : NO)
- if (IOS8) {
- if ([[UIApplication sharedApplication] currentUserNotificationSettings].types == UIRemoteNotificationTypeNone) {
- }
- }else{
- if ([[UIApplication sharedApplication] enabledRemoteNotificationTypes] == UIRemoteNotificationTypeNone) {
- }
- }
之前推送用的一直是极光推送,目前项目中用的是个推(之前都没有听说过。。。)按照以往的理解推送当然是要在通知栏收到通知项目接通个推以后,怎么推通知都没有,可是可以在控制台打印出收到的消息(好奇怪,我一脸懵逼@·@)经过一天的研究才知道,之前所理解的推送是APNs通知(推送通知),现在所接的是在应用内的透传消息。这两种是有差别的,具体有什么差别呢,极光上面也有介绍整了个没有听过的个
1.应用程序需要激活推送通知功能。在使用之前,用户需要确认他是否愿意接受这些推送功能。
2.IOS跟APNSServer要deviceToken,应用程序接到一个“devicetoken”。你可以认为“devicetoken”是推送通知发送信息的目的地址。
3.应用程序会将“devicetoken”发送给PUSH
参考官方Android SDK 教程完成激光推送的基本配置区别通知和自定义消息
通知即指在手机的通知栏(状态栏)上会显示的一条通知信息。
自定义消息是极光推送自己的概念。
自定义消息不是通知,所以不会被SDK展示到通知栏上。其内容完全由开发者自己定义。
服务器端主动发出:通常情况下,客户端与服务器交互都是客户端主动的,服务器一般不能主动与客户端进行数据交互,因为服务器端无法得知客户端的IP地址和状态。
数据实时性:如果服务器端有紧急数据要传递给客户端,就必须主动向客户端发送数据。
基本原理:使客户端实时获取服务器端消息,Pull方式,小周期轮询,费电费流量,另一个就是Push方式,服务器...
极光推送在众多的消息推送里,口碑算是很好的,项目中我负责的是这一块,就整理了这篇博客帮助记忆;
极光推送官方SDK文档:https://docs.jiguang.cn/jpush/server/sdk/java_sdk/
错误码信息:https://docs.jiguang.cn/jpush/server/push/rest_api_v3_push/#_19
import ja...
1. 推送更稳定;
APNs 之前的版本有很多硬伤(最近有更新版本有所改进在推送 APNs 时很容易被中断连接,然后需要重新来过。类似这些极光推送因为专业做这个,会有一些措施来补救。
2. 性能更好;
大容量、并发。
3. 推送统计;
极光提供了推送成功、推送失败、用户点击等数据的统计。并且结合 App 活跃情况。
4. 其他服务;
badge (角标)是 iO
传送三方SDK提供的一种特殊类型的消息,即CMD,不会存db,也不会走apns推送,类似一种指令型的消息,比如您的服务器要通知客户端做某些操作,您可以服务器和客户端提前约定好某个字段,当客户端收到约定好的字段时,执行某种特殊操作。
如果接收到透传消息的apns推送,请检查一下是否接受的是透传消息,- (void)didReceiveOfflineCmdMessages:(NSArr