iOS中提供了2种推送通知:
本地推送通知(Local Notification)
远程推送通知(Remote Notification)
推送通知的呈现效果
- 在屏幕顶部显示一块横幅(显示具体内容)
- 在屏幕中间弹出一个UIAlertView(显示具体内容)
- 在锁屏界面显示一块横幅(锁屏状态下,显示具体内容)
- 更新app图标的数字(说明新内容的数量)
- 播放音效(提醒作用)
本地推送通知
就是不需要联网就能发出的推送通知(不需要服务器的支持)
常用来定时提醒用户完成一些任务,比如清理垃圾、记账、买衣服、看电影、玩游戏
如何发出本地通知
创建本地推送通知对象
UILocalNotification *localNoti = [[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;
时区(一般设置为[NSTimeZone defaultTimeZone] ,跟随手机的时区)
@property(nonatomic,copy) NSTimeZone *timeZone;
调度本地推送通知(调度完毕后,推送通知会在特地时间fireDate发出)
[[UIApplication sharedApplication] scheduleLocalNotification:localNoti];
获得被调度(定制)的所有本地推送通知(已经发出且过期的推送通知就算调度结束,会自动从这个数组中移除)
@property(nonatomic,copy) NSArray *scheduledLocalNotifications;
取消调度本地推送通知
- (void)cancelLocalNotification:(UILocalNotification *)notification;
- (void)cancelAllLocalNotifications;
立即发出本地推送通知
- (void)presentLocalNotificationNow:(UILocalNotification *)notification;
当用户点击本地推送通知,会自动打开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
取出本地推送通知对象
在iOS 8.0中,如果要使用本地通知,需要得到用户的许可在didFinishLaunchingWithOptions
方法中添加如下代码:
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[application registerUserNotificationSettings:settings];
示例
- (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]) {
// 跳转代码
do something...
}
return YES;
}
/*
* 应用程序在进入前台,或者在前台的时候都会执行该方法
*/
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
// 针对应用程序在后台的时候进行的跳转
if (application.applicationState == UIApplicationStateInactive) {
NSLog(@"进行界面的跳转");
NSLog(@"%@", notification.userInfo);
do something...
}
}
远程推送通知
就是从远程服务器推送给客户端的通知(需要连网)
远程推送服务,又称为APNs(Apple Push Notification Services)
为什么需要远程推送通知?传统获取数据的局限性
只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容。远程推送通知可以解决以上问题,不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知。
所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接. 长连接作用:时间校准、
系统升级、查找我的iPhone。 长连接的好处:数据传输速度快、数据保持最新状态
获得device Token
的过程
从获得 deviceToken 到 推送消息给设备 的过程
一. 开发iOS程序的推送功能, iOS端需要做的事
- 请求苹果获得deviceToken
- 得到苹果返回的deviceToken
- 发送deviceToken给公司的服务器
- 监听用户对通知的点击
二.调试iOS的远程推送功能, 必备条件:
- 真机
- 调试推送需要的证书文件
- aps_development.cer : 某台电脑就能调试某个app的推送服务
- iphone6_qq.mobileprovision : 某台电脑就能利用某台设备调试某个程序
三.发布具有推送服务的app
- aps_production.cer : 如果发布的程序中包含了推送服务,就必须安装这个证书
- qq.mobileprovision : 某台电脑就能发布某个程序
证书配置01 - 创建App ID
证书配置02 - 为App ID创建APNs SSL证书
真机调试用的APNs SSL证书:要在哪台电脑上调试具有推送服务的App
最终得到2个APNs SSL证书:
- APNs Development iOS:真机调试用的证书
- APNs Production iOS:发布程序用的证书
证书配置03 – 生成描述文件
描述文件的作用是用来描述哪台设备要在哪台电脑上调试哪个程序
证书配置04 – 安装
最终会得到3个文件:(先安装cer文件,再安装mobileprovision文件)
- aps_development.cer:真机调试用的
- aps_production.cer:发布程序用的
- netease_news_iphone5_home.mobileprovision:描述文件
注册远程推送通知
一般在App启动完毕后就马上注册
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 注册远程通知
UIRemoteNotificationType type = UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:type];
return YES;
}
注册成功后会调用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取出服务器返回的字典内容
最后更新: 2023年03月25日 22:39:55
本文链接: http://aeronxie.github.io/post/184f5571.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可,转载请注明出处!