26 - 推送

iOS中提供了2种推送通知:

  • 本地推送通知(Local Notification)
  • 远程推送通知(Remote Notification)

推送通知的作用

可以让不在前台运行的app,告知用户app内部发生了什么事情

推送通知有5种不同的呈现效果

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

本地推送(Local Notification)

什么是本地推送通知

顾名思义,就是不需要联网就能发出的推送通知(不需要服务器的支持)

本地推送通知的使用场景

  • 常用来定时提醒用户完成一些任务;
  • 比如 : 清理垃圾、记账、买衣服、看电影、玩游戏

如何发出本地推送通知

// 创建本地推送通知对象
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
----------------------------------------------
// 设置本地推送通知属性
// 推送通知的触发时间(何时发出推送通知)
@property(nonatomic,copy) NSDate *fireDate;               这2个属性必须设置
// 推送通知的具体内容
@property(nonatomic,copy) NSString *alertBody;
----------------------------------------------
// 调度本地推送通知(调度完毕后,推送通知会在特地时间fireDate发出)
[[UIApplication sharedApplication] scheduleLocalNotification:ln];     

其他属性

// 在锁屏时显示的动作标题(完整标题:“滑动来” + alertAction)
@property(nonatomic,copy) NSString *alertAction;

// 音效文件名
@property(nonatomic,copy) NSString *soundName;

// App图标数字
@property(nonatomic) NSInteger applicationIconBadgeNumber;

// 调度本地推送通知(调度完毕后,推送通知会在特地时间fireDate发出)
[[UIApplication sharedApplication] scheduleLocalNotification:ln];

// 获得被调度(定制)的所有本地推送通知
@property(nonatomic,copy) NSArray *scheduledLocalNotifications;
(已经发出且过期的推送通知就算调度结束,会自动从这个数组中移除)

// 取消调度本地推送通知
- (void)cancelLocalNotification:(UILocalNotification *)notification;
- (void)cancelAllLocalNotifications;

// 立即发出本地推送通知
- (void)presentLocalNotificationNow:(UILocalNotification *)notification;

// 每隔多久重复发一次推送通知
@property(nonatomic) NSCalendarUnit repeatInterval;

// 点击推送通知打开app时显示的启动图片
@property(nonatomic,copy) NSString *alertLaunchImage;

// 附加的额外信息
@property(nonatomic,copy) NSDictionary *userInfo;

// 时区
@property(nonatomic,copy) NSTimeZone *timeZone;
(一般设置为[NSTimeZone defaultTimeZone] ,跟随手机的时区)

iOS 8.0之后的的变化

  • 在iOS 8.0之后如果要使用本地通知,需要得到用户的许可;
  • 在 didFinishLaunchingWithOptions方法中添加如下代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    // 判断版本号
    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
        
        UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound |UIUserNotificationTypeAlert categories:nil];
        
        // 注册用户是否需要通知内容
        [application registerUserNotificationSettings:setting];
    }
    
    return YES;
}

以下是一段本地推送的简单代码

- (IBAction)localNote:(id)sender {

    // 创建本地通知对象
    UILocalNotification *localNotification = [[UILocalNotification alloc] init];
    
    localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:3.0];
    
    localNotification.alertBody = @"Hello,i`m notification";
    
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
    
}

以下为展示效果

相信大家都会遇到这样一个需求:

  • 根据点击的通知跳转到不同的页面里面
  • 比如正在用QQ和朋友聊天,但此时微信来了一条信息,那么点击通知后,需要直接跳转到微信的聊天界面,那这个该怎么实现呢?
  • 这时就要去系统的AppDelegate中做点事情了

首先我们先来了解一个AppDelegate中的方法

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification

  • 从上面我们可以得出结论
  • 这个方法是App在进入前后,或者在前台的时候都会执行的方法
  • 所以我们需要通过这个方法监听到用户点击后,来完成跳转
  • 而且需要判断是否是正在进入前台的时候
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    if (application.applicationState == UIApplicationStateInactive) {
        // 跳转界面代码段
        // 可以根据UserInfo判断跳转到哪个界面
    }
}
  • 还有一种情况就是当用户杀死了App后
  • 就不能在didReceiveLocalNotification这个方法中进行跳转了,因为杀死了程序后,是不会调用这个方法的
  • 这个时候就需要在didFinishLaunchingWithOptions这个方法中跳转
  • 而且在这个方法中要判断是通过点击图标打开的,还是通过点击通知打开的应用程序
LaunchOptions是一个字典,以下是存放的Key
NSString *const UIApplicationLaunchOptionsURLKey;
NSString *const UIApplicationLaunchOptionsSourceApplicationKey;
NSString *const UIApplicationLaunchOptionsRemoteNotificationKey;
NSString *const UIApplicationLaunchOptionsLocalNotificationKey;  <-可以通过这个key来判断
NSString *const UIApplicationLaunchOptionsAnnotationKey;
NSString *const UIApplicationLaunchOptionsLocationKey;
NSString *const UIApplicationLaunchOptionsNewsstandDownloadsKey;
NSString *const UIApplicationLaunchOptionsBluetoothCentralsKey;
NSString *const UIApplicationLaunchOptionsBluetoothPeripheralsKey;
NSString *const UIApplicationLaunchOptionsShortcutItemKey;
NSString *const UIApplicationLaunchOptionsUserActivityDictionaryKey;
NSString *const UIApplicationLaunchOptionsUserActivityTypeKey;

远程推送(Remote Notification)

什么是远程推送通知

顾名思义,就是从远程服务器推送给客户端的通知(需要联网)
远程推送服务,又称为APNs(Apple Push Notification Services)


为什么需要远程推送通知?

传统获取数据的局限性
只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容
远程推送通知可以解决以上问题
不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知


远程推送使用须知 :

  • 所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接
  • 什么是长连接 : 只要联网了,就一直建立连接
  • 长连接的作用 :
  • 时间校准
  • 系统升级
  • 查找我的iPhone
  • 长连接的好处 :
  • 数据传输速度快
  • 数据保持最新状态
  • 远程通知


获得deviceToken的过程


从获得deviceToken到推送消息给设备的过程

一.开发iOS程序的推送功能, iOS端需要做的事
1.请求苹果获得deviceToken
2.得到苹果返回的deviceToken
3.发送deviceToken给公司的服务器
4.监听用户对通知的点击

二:做远程通知提前做的操作:

  • 可以真机调试(Device Token)
  • 明确APPID
  • 给APPID配置两个整数
  • 远程推送专门配置一个描述文件

三:代码的实现

  • iOS7 和 iOS8 分别发送请求,请求DeviceToken
  • 获取DeviceToken代理方法
  • 将DeviceToken发送给服务器(或者发送给激光推送)
  • 通过didReceiveRemoteNotifications这个方法监听远程通知的点击
// 判断版本号
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { //iOS8
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
        [application registerUserNotificationSettings:settings];
        [application registerForRemoteNotifications];
    } else { // iOS7
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeNewsstandContentAvailability | UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert];
    }
}

// 注册远程通知
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // 将DeviceToken传给服务器
    NSLog(@"%@", deviceToken.description);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容