远程消息推送

若app允许接受远程推送消息,需要在AppDelegate的didFinishLaunchingWithOptions方法中通知注册。
    //推送
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
    // 当前版本 >=  iOS 8 
    [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
    [application registerForRemoteNotifications];
} else {
    //当前版本号 iOS < 8
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
}


APNs:苹果所提供的一套服务称之为Apple Push Notification service。

app允许远程推送,设备联网时(无论是蜂窝联网还是Wi-Fi联网)都会与苹果的APNs服务器建立一个长连接(persistent IP connection),当后台服务器推送一条通知的时候,这条通知并不是直接推送给了我们的设备,而是先推送到苹果的APNs服务器上面,而苹果的APNs服务器再通过与设备建立的长连接进而把通知推送到我们的设备上。而当设备处于非联网状态的时候,APNs服务器会保留后台服务器所推送的最后一条通知,当设备转换为连网状态时,APNs则把其保留的最后一条通知推送给我们的设备;如果设备长时间处于非联网状态下,那么APNs服务器为其保存的最后一条通知也会丢失。


处理注册远程通知的回调方法(获取当前设备,当前APP的deviceToken)

当一个App注册接收远程通知时,系统会发送请求到APNs服务器,APNs服务器收到此请求会根据请求所带的key值生成一个独一无二的value值也就是所谓的deviceToken,而后APNs服务器会把此deviceToken包装成一个NSData对象发送到对应请求的App上。从下面函数获取

成功:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    //存储deviceToken,此已经转化成<strong>字符串,不是NSData</strong>
    [[UserCenter defaultCenter]setDeviceToken:[[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""]stringByReplacingOccurrencesOfString: @">" withString: @""]stringByReplacingOccurrencesOfString: @" " withString: @""]];
    [self sendProviderDeviceToken:deviceToken]; // 将此deviceToken发送给后台服务器
}
失败:
- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{
    NSLog(@"Failed to get token, error: %@", error);
}


处理接收到远程通知消息
1. app从 终止->前台
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //  userInfo为收到远程通知的内容
    NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
    if (userInfo) {
         // 有推送的消息,处理推送的消息
    }
    return YES;
}
2.  app在后台,点击消息时
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {<p>}</p>


iOS7之后,苹果开始支持多任务,即App可在后台做一些更新UI、下载数据的操作等。因此可在接收到推送消息时,在后台进行相关处理。

打开后台推送模式

iOS7之后系统的项目,设置如下:

第一步:项目对应TARGETS-Capabilities-Background Modes-Remote Notifications具体设置方法如下图

第二步:content-available此key值,对应的value值为1(如下图,UMeng消息推送)

上面方式设置后,此方法不论App处于Foreground状态还是处于Background状态,收到远程推送消息的时候都会立即调用此方法。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {    
    // 在此方法中一定要调用completionHandler这个回调,告诉系统是否处理成功     
    UIBackgroundFetchResultNewData, // 成功接收到数据    
    UIBackgroundFetchResultNoData,  // 没有接收到数据    
    UIBackgroundFetchResultFailed  // 接受失败    
    if (userInfo) {        
        completionHandler(UIBackgroundFetchResultNewData);   
	} else {       
	completionHandler(UIBackgroundFetchResultNoData);   
    }}


可操作通知类型收到推送消息时回调方法
// 此两个回调方法对应可操作通知类型,具体使用方法参考以上方法很容易理解,不在详细叙述
- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler { 
}

- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler { 
}


附录:

{     
"aps" : {
"alert"              :             
{   // string or dictionary            
"title"           :   "string"            
"body"            :   "string",           
"title-loc-key"  :   "string or null"            
"title-loc-args"  :   "array of strings or null"            
"action-loc-key"  :   "string or null"            
"loc-key"         :   "string"            
"loc-args"        :   "array of strings"            
"launch-image"    :   "string"
},          
"badge"               :    number,          
"sound"               :    "string"          
"content-available"   :    number;         
"category"            :    "string"     },     
"key1"                :    1314,             //  自定义key值     
"key2"                :    "customType"        //  自定义key值
}
aps:推送消息必须有的key
alert:推送消息包含此key值,系统就会根据用户的设置展示标准的推送信息
badge:在app图标上显示消息数量,缺少此key值,消息数量就不会改变,消除标记时把此key对应的value设置为0
sound:设置推送声音的key值,系统默认提示声音对应的value值为default 
content-available:此key值设置为1,系统接收到推送消息时就会调用不同的回调方法,iOS7之后配置后台模式
category:UIMutableUserNotificationCategory's identifier 可操作通知类型的key值
title:简短描述此调推送消息的目的,适用系统iOS8.2之后版本
body:推送的内容
title-loc-key:功能类似title,附加功能是国际化,适用系统iOS8.2之后版本
title-loc-args:配合title-loc-key字段使用,适用系统iOS8.2之后版本
action-loc-key:可操作通知类型key值,不详细叙述
loc-key:参考title-loc-key
loc-args:参考title-loc-args
launch-image:点击推送消息或者移动事件滑块时,显示的图片。如果缺少此key值,会加载app默认的启动图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值