工作生活

个推集成

2019-07-01  本文已影响0人  咔咔尼亜

个推集成

第一步

通过个推的官网下载SDK并集成SDK,两种方式,第一种直接拖拽,第二种cocaapods,(略过)

第二步

登录个推SDK,在appDelegate的didFinishLaunchingWithOptions方法中

[GeTuiSdk startSdkWithAppId:GeTuiAppID appKey:GeTuiKey appSecret:GeTuiSecret delegate:self];

第三步

个推SDK注册通知类型。

//注册通知类型
- (void)registerRemoteNotification
{
    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) 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] registerForRemoteNotifications];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
#endif
    } else if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
        UIUserNotificationType types = (UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge);
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    } else {
        UIRemoteNotificationType apn_type = (UIRemoteNotificationType)(UIRemoteNotificationTypeAlert |
                                                                       UIRemoteNotificationTypeSound |
                                                                       UIRemoteNotificationTypeBadge);
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:apn_type];
    }
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(geTuiLogin:) name:@"geTuiLogin" object:nil];
    // 处理app在前台自定义推送弹窗点击事件
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(eBBannerViewDidClick:) name:EBBannerViewDidClick object:nil];
}
注册通知
- (void)registerAPN
{
    if (@available(iOS 10.0, *)) { // iOS10 以上
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError *_Nullable error) {
        }];
    } else {// iOS8.0 以上
        UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:setting];
    }
}

第四步

个推SDK注册token,用于唯一识别机器

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // [3]:向个推服务器注册deviceToken 为了方便开发者,建议使用新方法
    [GeTuiSdk registerDeviceTokenData:deviceToken];
}
//个推注册deviceToken成功回调
- (void)GeTuiSdkDidRegisterClient:(NSString *)clientId
{
    //个推SDK已注册,返回clientId
    NSLog(@"\n>>>[GeTuiSdk RegisterClient]:%@\n\n", clientId);
    //绑定别名
    [self geTuiBindOrUnbindAlias:YES];
}

第五步

个推绑定别名,实现绑定成功或失败的回调。

// 绑定解绑别名
- (void)geTuiBindOrUnbindAlias:(BOOL)isBind
{
    UserInfo *name = [HMFileManager getObjectByFileName:@"user"];
    if ([name.carownerCode length] > 0) {
        if (isBind) {
            [GeTuiSdk bindAlias:name.carownerCode andSequenceNum:@"seq-1"];
        } else {
            [GeTuiSdk unbindAlias:name.carownerCode andSequenceNum:@"seq-1" andIsSelf:YES];
        }
    }
}
//绑定成功失败回调
- (void)GeTuiSdkDidAliasAction:(NSString *)action result:(BOOL)isSuccess sequenceNum:(NSString *)aSn error:(NSError *)aError
{
    if ([kGtResponseBindType isEqualToString:action]) {
        if (!isSuccess) {
            NSLog(@"标签绑定失败原因: %@", aError);
        }
    } else if ([kGtResponseUnBindType isEqualToString:action]) {
        if (!isSuccess) {
            NSLog(@"标签解绑失败原因: %@", aError);
        }
    }
}

第六步

实现收到通知或透传消息的代理方法。

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
//  iOS 10: App在前台获取到通知
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
{
    NSLog(@"willPresentNotification:%@", notification.request.content.userInfo);
    [self getUnreadMessageNum];
    // 根据APP需要,判断是否要提示用户Badge、Sound、Alert
    completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
}

//  iOS 10: 点击通知进入App时触发,在该方法内统计有效用户点击数
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler
{
    
    [self allZYUniversalModel:response.notification.request.content.userInfo isRead:@"YES" startUp:@"YES"];
    // [ GTSdk ]:将收到的APNs信息传给个推统计
    [GeTuiSdk handleRemoteNotification:response.notification.request.content.userInfo];

    completionHandler();
}

#endif


/** SDK收到透传消息回调 */
- (void)GeTuiSdkDidReceivePayloadData:(NSData *)payloadData andTaskId:(NSString *)taskId andMsgId:(NSString *)msgId andOffLine:(BOOL)offLine fromGtAppId:(NSString *)appId
{
    //收到个推消息
    NSError *error;
    NSDictionary *msgDic = nil;
    if (payloadData) {
        msgDic = [NSJSONSerialization JSONObjectWithData:payloadData options:NSJSONReadingMutableLeaves error:&error];
    }
    NSString *payloadStr = [[NSString alloc]initWithBytes:payloadData.bytes length:payloadData.length encoding:NSUTF8StringEncoding];

    NSMutableDictionary *tempDic = [[NSMutableDictionary alloc]initWithDictionary:msgDic];
    NSString *platformType = msgDic[@"platformType"];
    
    if (![platformType.lowercaseString containsString:@"ios"]) {
        return;
    }
    tempDic[@"_gmid_"] = msgId;
    
    [GeTuiSdk handleRemoteNotification:tempDic];

//    //添加本地通知
    [self addLocalNoticeWith:tempDic];

    NSLog(@"\n>>>[GexinSdk ReceivePayload]:%@\npayloadData==%@\n", msgDic, payloadStr);
}

集成过程中遇到的坑 第一,个推的SDK登录非常慢导致的问题,因为如果app处于前台工作状态,SDK没有登录成功的时候后台发送推送通知,这个时候,通知是会从顶部弹出的(如果设置了顶部弹出框的话)这个时候走的是willPresentNotification代理方法。如果SDK登录成功了,那么收到的将是透传消息,也就是走的是透传消息的代理方法也就是GeTuiSdkDidReceivePayloadData,由于这种情况的存在,因此上如果想要在任何时候都有顶部弹窗的话,可以在透传消息代理回调中创建一个本地通知并弹出来。

上一篇 下一篇

猜你喜欢

热点阅读