個(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)。