个推你应该这样用的
来源:互联网 发布:玄铁重剑淘宝 编辑:程序博客网 时间:2024/06/10 02:47
前言:
说到这个远程推送,大家知道的应该都挺多的,但用到的估计极光和个推要占一很大部分,这篇博客重点说的就是个推的使用,个推官网的链接在这里,它的集成是比较方便的,你可以直接使用Cocoapods集成,待会再下面命令行也会给大家分享出来,这我们还会提到的有它的一个推送流程,还有SDK的一些使用以及在使用的过程中我们需要注意的地方:
先看看个推的推送流程图:
集成中建议利用Cocoapods集成,建议还是集成这个无IDFA版本,下面是命令行,至于为什么建议集成这个版本的,个推的文档中也有这样一段话:“在 App 内无广告情况下还是建议开发者使用获取 IDFA 版本,并提交 AppStore 审核。 集成 IDFA 而未集成任何广告服务可能会遭到 Apple 拒绝。”。
platform :iospod 'GTSDK', '1.5.3-noidfa'
推送需要注意点:
一:在 Xcode 8.0 以上,必须开启Push Notification能力,操作看下图:
二:为了更好支持消息推送,SDK可定期抓取离线消息,提高消息到达率,需要配置后台运行权限,操作如下:
个推把你需要勾选的这两个选项也作出了解释:
Background fetch
: 后台定期获取权限
Remote notifications
:APNs静默推送权限
代码使用说明:
还是建议大家给个推创建一个APPDelegate的类别,如下图所示:
下一步就是注册远程通知 即用户是否同意接收通知,源代码如下:
/** 注册远程通知 即用户是否同意接收通知 */- (void)registerRemoteNotification { /* Xcode8的需要手动开启“TARGETS -> Capabilities -> Push Notifications” */ /* 下面的方法区分10.0之后版本和之前版本 该项目的最低适配版本是8.0之后的,所以放弃8.0之前注册远程通知方法 */ if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) { #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 // Xcode 8编译会调用 UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; center.delegate = self; [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionCarPlay) completionHandler:^(BOOL granted, NSError *_Nullable error) { if (!error) { // NSLog(@"request authorization succeeded!"); } }]; [[UIApplication sharedApplication] registerForRemoteNotifications]; #else // Xcode 7编译会调用 UIUserNotificationType types = (UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge); UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; [[UIApplication sharedApplication] registerForRemoteNotifications]; #endif // 大于等于8.0系统的就用这个方法注册远程通知 }else if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){ UIUserNotificationType types = (UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge); UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; [[UIApplication sharedApplication] registerForRemoteNotifications]; }}#pragma mark - 远程通知(推送)回调/** 远程通知注册成功委托 */-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]]; token = [token stringByReplacingOccurrencesOfString:@" " withString:@""]; // 获取到的Token // NSLog(@"\n>>>[DeviceToken Success]:%@\n\n", token); // [ GTSdk ]:向个推服务器注册deviceToken,这个方法写在类别里面! [self registerDeviceTokenToGeTuiSDK:token]; }/** 远程通知注册失败委托 */-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { // NSLog(@"\n>>>[DeviceToken Error]:%@\n\n", error.description);}
原本想着把SDK的方法一个一个写出来解读的,不过那样子感觉就像官方文档了,没什么意思了,在这里我直接把AppDelegate+getui.m这整个文件的代码写出来,每一个方法都是有说明的,里面很多点也是写在了注释当中,这样就觉得更完整,可读性更高一点:
@implementation AppDelegate (getui)// 初始化个推SDK-(void)initGeTuiSDK{ // [ GTSdk ]:使用APPID/APPKEY/APPSECRENT创建个推实例 // 通过个推平台分配的appId、 appKey 、appSecret 启动SDK, // 注:该方法需要在主线程中调用 [GeTuiSdk startSdkWithAppId:GTAPPID appKey:GTAPPKEY appSecret:GTAPPSECRET delegate:self];}// Background Fetch 恢复SDK 运行-(void)BackgroundFetchGeTuiSdk{ // Background Fetch 恢复SDK 运行 [GeTuiSdk resume];}// 同步本地角标值到服务器-(void)setBadgeGeTuiSdk:(NSInteger)badge{ [GeTuiSdk setBadge:badge];}// 重置角标计数-(void)resetBadgeGeTuiSdk{
[GeTuiSdk resetBadge];}/** 向个推注册deviceToken @param deviceToken deviceToken */-(void)registerDeviceTokenToGeTuiSDK:(NSString *)deviceToken{ // 向个推服务器注册deviceToken [GeTuiSdk registerDeviceToken:deviceToken]; }/* 将收到的APNs信息传给个推统计 @param userInfo 获取到的消息 */-(void)handleRemoteNotificationToGrTuiSDK:(NSDictionary *)userInfo{ // 将收到的APNs信息传给个推统计 [GeTuiSdk handleRemoteNotification:userInfo];}#pragma mark - GeTuiSdkDelegate/** SDK启动成功返回cid */- (void)GeTuiSdkDidRegisterClient:(NSString *)clientId { // [4-EXT-1]: 个推SDK已注册,返回clientId // NSLog(@"\n>>[GTSdk RegisterClient]:%@\n\n", clientId); WRITEUSERDEFAULTS(clientId, ClientId);}/** SDK遇到错误回调 */- (void)GeTuiSdkDidOccurError:(NSError *)error { // [EXT]:个推错误报告,集成步骤发生的任何错误都在这里通知,如果集成后,无法正常收到消息,查看这里的通知。 //NSLog(@"\n>>[GTSdk error]:%@\n\n", [error localizedDescription]);}/* SDK收到透传消息回调 SDK 在线状态时( App 在前台运行),个推服务器会直接给 App 发送透传消息,不发送苹果APNS消息,可以更快的把消息发送到手机端;SDK 离线状态时 (停止 SDK 或 App 后台运行 或 App 停止),个推服务器会给 App 发送苹果 APNs 消息,同时保存个推的离线消息,当 SDK 在线后,SDK 会获取所有的个推透传消息,offLine 字段就是表明该条消息是否为离线消息。 注意:这里是否能收到推送消息也是有在线时间限制的,最长是72小时之前的在线过的用户、 也就是说能收到消息的就是在72小时内在线过的,超过这个时间的是收不到推送消息的,这也就解决好长时间不在线,已在线会收到很多推送消息的困扰 **/- (void)GeTuiSdkDidReceivePayloadData:(NSData *)payloadData andTaskId:(NSString *)taskId andMsgId:(NSString *)msgId andOffLine:(BOOL)offLine fromGtAppId:(NSString *)appId { /** *汇报个推自定义事件 *actionId:用户自定义的actionid,int类型,取值90001-90999。 *taskId: 下发任务的任务ID。 *msgId: 下发任务的消息ID。 *返回值: BOOL,YES表示该命令已经提交,NO表示该命令未提交成功。注:该结果不代表服务器收到该条命令 **/ //[GeTuiSdk sendFeedbackMessage:90001 andTaskId:taskId andMsgId:msgId]; // 数据转换 NSString *payloadMsg = nil; if (payloadData) { payloadMsg = [[NSString alloc] initWithBytes:payloadData.bytes length:payloadData.length encoding:NSUTF8StringEncoding]; } // 解析拿到的数据 if (payloadMsg != nil) { NSData * data = [payloadMsg dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary * JSONresponseObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; } UIAlertController * GeTuiAlertController=[[NotificationHandleObject sharedInstance]addBaseViewNotificationAlertViewWithMessage:JSONresponseObject[@"title"] andConfirmTitle:@"确定"]; [self.window.rootViewController presentViewController:GeTuiAlertController animated:YES completion:nil]; } }}/** SDK收到sendMessage消息回调 */- (void)GeTuiSdkDidSendMessage:(NSString *)messageId result:(int)result{ // 发送上行消息结果反馈 // NSString *msg = [NSString stringWithFormat:@"sendmessage=%@,result=%d", messageId, result]; // NSLog(@"\n>>[GTSdk DidSendMessage]:%@\n\n", msg);}/** SDK运行状态通知 */- (void)GeTuiSDkDidNotifySdkState:(SdkStatus)aStatus { // 通知SDK运行状态 // NSLog(@"\n>>[GTSdk SdkState]:%u\n\n", aStatus);}/** SDK设置推送模式回调 */- (void)GeTuiSdkDidSetPushMode:(BOOL)isModeOff error:(NSError *)error { if (error) { // NSLog(@"\n>>[GTSdk SetModeOff Error]:%@\n\n", [error localizedDescription]); return; } // NSLog(@"\n>>[GTSdk SetModeOff]:%@\n\n", isModeOff ? @"开启" : @"关闭");}// 别名推送// 绑定别名是否成功// 处理 绑定/解绑 delegate返回结果:- (void)GeTuiSdkDidAliasAction:(NSString *)action result:(BOOL)isSuccess sequenceNum:(NSString *)aSn error:(NSError *)aError { if ([kGtResponseBindType isEqualToString:action]) { //NSLog(@"绑定结果 :%@ !, sn : %@", isSuccess ? @"成功" : @"失败", aSn); if (!isSuccess) { //NSLog(@"失败原因: %@", aError); } } else if ([kGtResponseUnBindType isEqualToString:action]) { //NSLog(@"绑定结果 :%@ !, sn : %@", isSuccess ? @"成功" : @"失败", aSn); if (!isSuccess) { //NSLog(@"失败原因: %@", aError); } }}
- 个推你应该这样用的
- 个推你应该这样用的
- 个推你应该这样用的
- 个推你应该这样用的
- 个推你应该这样用的
- 个推你应该这样用的
- 个推你应该这样用的
- 三年的你应该这样
- 假设你的月收入2000元,你应该这样用
- 假设你的月收入2000元,你应该这样用
- 假设你的月收入2000元,你应该这样用
- 程序员,你的简历应该这样弄
- win8,你应该这样。。。
- 知道吗?你就是这样把我推远的。
- 循环你应该这样写
- 如果有这样的机会,你应该抓住
- 如果有这样的机会,你应该抓住
- 招投标,你应该这样做!
- 数据库事务的四大特性以及事务的隔离级别
- maven构建项目时,下载的jar放在项目的lib目录中
- 数据结构与算法____算法简介
- 链表中环的入口
- 单臂路由
- 个推你应该这样用的
- 垂直方向的TextView的滚动效果
- 面试的角度诠释Java工程师(二)
- Zurmo(十一)Relation之n:n
- 第四讲项目2-2 求r1与r2并联的阻值
- __attribute__的简简简单理解
- 归档模式下-丢失关键数据文件
- CS1041号错误是什么
- A. Mike and Fax