個(gè)推集成

個(gè)推集成

第一步

通過(guò)個(gè)推的官網(wǎng)下載SDK并集成SDK,兩種方式,第一種直接拖拽,第二種cocaapods,(略過(guò))

第二步

登錄個(gè)推SDK,在appDelegate的didFinishLaunchingWithOptions方法中

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

第三步

個(gè)推SDK注冊(cè)通知類型。

//注冊(cè)通知類型
- (void)registerRemoteNotification
{
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 // Xcode 8編譯會(huì)調(diào)用
        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編譯會(huì)調(diào)用
        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在前臺(tái)自定義推送彈窗點(diǎn)擊事件
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(eBBannerViewDidClick:) name:EBBannerViewDidClick object:nil];
}
注冊(cè)通知
- (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];
    }
}

第四步

個(gè)推SDK注冊(cè)token,用于唯一識(shí)別機(jī)器

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // [3]:向個(gè)推服務(wù)器注冊(cè)deviceToken 為了方便開(kāi)發(fā)者,建議使用新方法
    [GeTuiSdk registerDeviceTokenData:deviceToken];
}
//個(gè)推注冊(cè)deviceToken成功回調(diào)
- (void)GeTuiSdkDidRegisterClient:(NSString *)clientId
{
    //個(gè)推SDK已注冊(cè),返回clientId
    NSLog(@"\n>>>[GeTuiSdk RegisterClient]:%@\n\n", clientId);
    //綁定別名
    [self geTuiBindOrUnbindAlias:YES];
}

第五步

個(gè)推綁定別名,實(shí)現(xiàn)綁定成功或失敗的回調(diào)。

// 綁定解綁別名
- (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];
        }
    }
}
//綁定成功失敗回調(diào)
- (void)GeTuiSdkDidAliasAction:(NSString *)action result:(BOOL)isSuccess sequenceNum:(NSString *)aSn error:(NSError *)aError
{
    if ([kGtResponseBindType isEqualToString:action]) {
        if (!isSuccess) {
            NSLog(@"標(biāo)簽綁定失敗原因: %@", aError);
        }
    } else if ([kGtResponseUnBindType isEqualToString:action]) {
        if (!isSuccess) {
            NSLog(@"標(biāo)簽解綁失敗原因: %@", aError);
        }
    }
}

第六步

實(shí)現(xiàn)收到通知或透?jìng)飨⒌拇矸椒ā?/p>

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

//  iOS 10: 點(diǎn)擊通知進(jìn)入App時(shí)觸發(fā),在該方法內(nèi)統(tǒng)計(jì)有效用戶點(diǎn)擊數(shù)
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler
{
    
    [self allZYUniversalModel:response.notification.request.content.userInfo isRead:@"YES" startUp:@"YES"];
    // [ GTSdk ]:將收到的APNs信息傳給個(gè)推統(tǒng)計(jì)
    [GeTuiSdk handleRemoteNotification:response.notification.request.content.userInfo];

    completionHandler();
}

#endif


/** SDK收到透?jìng)飨⒒卣{(diào) */
- (void)GeTuiSdkDidReceivePayloadData:(NSData *)payloadData andTaskId:(NSString *)taskId andMsgId:(NSString *)msgId andOffLine:(BOOL)offLine fromGtAppId:(NSString *)appId
{
    //收到個(gè)推消息
    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);
}

集成過(guò)程中遇到的坑 第一,個(gè)推的SDK登錄非常慢導(dǎo)致的問(wèn)題,因?yàn)槿绻鸻pp處于前臺(tái)工作狀態(tài),SDK沒(méi)有登錄成功的時(shí)候后臺(tái)發(fā)送推送通知,這個(gè)時(shí)候,通知是會(huì)從頂部彈出的(如果設(shè)置了頂部彈出框的話)這個(gè)時(shí)候走的是willPresentNotification代理方法。如果SDK登錄成功了,那么收到的將是透?jìng)飨?,也就是走的是透?jìng)飨⒌拇矸椒ㄒ簿褪荊eTuiSdkDidReceivePayloadData,由于這種情況的存在,因此上如果想要在任何時(shí)候都有頂部彈窗的話,可以在透?jìng)飨⒋砘卣{(diào)中創(chuàng)建一個(gè)本地通知并彈出來(lái)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容