最近公司项目在接入信鸽推送功能,详细记录下整个过程。。。
选择平台
填写配置(证书可以暂时不上传,后面补填即可)
应用创建完成
应用配置(证书)
参考信鸽官方文档 iOS推送证书说明
SDK地址
参考信鸽文档 iOS集成接入指南
注意:
checkTargetOtherLinkFlagForObjc报错,是因为build setting中,Other link flags未添加-ObjC
参考文章
iOS Bug --- 信鸽推送报错:+[NSObject checkTargetOtherLinkFlagForObjc]: unrecognized selector sent to ......
- 引入头文件,并遵守协议
#import "XGPush.h" #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 #import
#endif @interface AppDelegate ()
@end
- 注册苹果推送服务
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self registerAPNS]; } - (void)registerAPNS { float sysVer = [[[UIDevice currentDevice] systemVersion] floatValue]; #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 if (sysVer >= 10) { // iOS 10 [self registerPush10]; #endif if (sysVer < 8) { // before iOS 8 [self registerPushBefore8]; } else { // iOS 8-9 [self registerPush8to9]; } } - (void)registerPush10{ #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 //请求通知权限,本地和远程公用 UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [center requestAuthorizationWithOptions:UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError * _Nullable error) { if (granted) { //请求成功 }else{ //请求失败 } }]; //设置通知的代理 center.delegate = self; //注册远程通知 [[UIApplication sharedApplication] registerForRemoteNotifications]; #endif } - (void)registerPush8to9{ UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert; UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings]; //注册远程通知 [[UIApplication sharedApplication] registerForRemoteNotifications]; } - (void)registerPushBefore8{ [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; }
- 启动信鸽推送服务
通过使用在信鸽官网注册的应用的信息,启动信鸽推送服务,参数说明如下:
appID:通过前台申请的应用 ID, 即 Access ID
appKey: 通过前台申请的 appKey,即 Access Key
delegate:回调对象
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //开启debug模式,打印log信息 [[XGPush defaultManager] setEnableDebug:YES]; //初始化信鸽 [[XGPush defaultManager] startXGWithAppID:2200319067 appKey:@"I89PBJ5G62KU" delegate:self]; //角标设置为0 [[XGPush defaultManager] setXgApplicationBadgeNumber:0]; //为了更好的了解每一条推送消息的运营效果,需要将用户对消息的行为上报 [[XGPush defaultManager] reportXGNotificationInfo:launchOptions]; }
判断程序是不是由推送打开
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if (launchOptions) { self.isLaunchedByNotification = YES; NSDictionary *pushNotificationKey = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; [self performSelector:@selector(receiveRemoteNotificationWithUserInfo:) withObject:pushNotificationKey afterDelay:1.0]; }else{ self.isLaunchedByNotification = NO; } } //可以通过launchOptions这个参数是否为空来判断程序是否是点击推送消息启动了应用。launchOptions有几个key: //UIApplicationLaunchOptionsRemoteNotificationKey返回一个远程推送的userInfo字典类型参数; //UIApplicationLaunchOptionsLocalNotificationKey返回一个UILocalNotification对象; //receiveRemoteNotificationWithUserInfo:这个方法用来处理接收到的通知,如通过推送过来的userInfo中的内容跳转不同的界面;
- 注册信鸽
在V3.2.0中注册信鸽是在 SDK内部做的,项目中可以通过下面方法获取到注册的deviceToken ,一般这个deviceToken要上传到服务端,然后服务端通过deviceToken发送推送消息。
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { //将来需要将此Token上传给后台服务器 NSString *XGPushtokenStr = [[XGPushTokenManager defaultTokenManager] deviceTokenString]; NSLog(@"XGPushtokenStr===>%@",XGPushtokenStr); }
**********************************************************************************************************************************
- iOS10之前通知的处理方法(2个)
/** 在iOS10 以前 收到推送分为下面两种形式,如果有方法1,方法2,方法1就不会执行 */ //iOS 3-10 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ NSLog(@"%s======》",__func__); NSString *zero =[[[userInfo objectForKey:@"aps"] objectForKey:@"alert"] objectForKey:@"body"]; if (application.applicationState == UIApplicationStateActive) { [self showAlertViewWithTitle:@"新消息提示" Message:zero ConfirmTitle:@"确定" CancelTitle:nil]; } [self receiveRemoteNotificationWithUserInfo:userInfo]; }
/** iOS7 + iOS10之前,接收远程通知时,不管在前台、后台还是程序杀死都会调用此方法 在前台,App内展示alert 在后台,点击弹框,进入App */ - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { NSLog(@"%s",__func__); NSLog(@"[XGDemo] receive slient Notification"); NSLog(@"[XGDemo] userinfo %@", userInfo); if (self.isLaunchedByNotification == NO) { NSString *zero =[[[userInfo objectForKey:@"aps"] objectForKey:@"alert"] objectForKey:@"body"]; if (application.applicationState == UIApplicationStateActive) { //iOS10之前,在前台时用自定义AlertView展示消息 [self showAlertViewWithTitle:@"新消息提示" Message:zero ConfirmTitle:@"确定" CancelTitle:nil]; [self receiveRemoteNotificationWithUserInfo:userInfo]; }else { [self receiveRemoteNotificationWithUserInfo:userInfo]; } }else{ self.isLaunchedByNotification = NO; } //iOS 9.x 及以前,需要在 UIApplicationDelegate 的回调方法(如下)中调用上报数据的接口 [[XGPush defaultManager] reportXGNotificationInfo:userInfo]; completionHandler(UIBackgroundFetchResultNewData); }
**********************************************************************************************************************************
- iOS10之后通知的处理方法
1,前台运行
前台运行: 指的是程序正在运行中, 用户能看见程序的界面.
iOS10会出现通知横幅, 而在以前的框架中, 前台运行时, 不会出现通知的横幅.
/** iOS 10 新增 API iOS 10 会走新 API, iOS 10 以前会走到老 API App 在前台弹通知需要调用这个接口 */ #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - (void)xgPushUserNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler { [[XGPush defaultManager] reportXGNotificationInfo:notification.request.content.userInfo]; //可设置是否在应用内弹出通知 completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert); } #endif
- iOS10之后通知的处理方法
2,后台运行及程序退出 会调用的方法
/** iOS 10 新增 API iOS 10 会走新 API, iOS 10 以前会走到老 API App 用户点击通知 App 用户选择通知中的行为 App 用户在通知中心清除消息 无论本地推送还是远程推送都会走这个回调 */ #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - (void)xgPushUserNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler { NSLog(@"%s",__func__); [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; NSLog(@"Userinfo %@",response.notification.request.content.userInfo); //处理接收到的消息 [self receiveRemoteNotificationWithUserInfo:response.notification.request.content.userInfo]; [[XGPush defaultManager] reportXGNotificationResponse:response]; completionHandler(); } #endif
**********************************************************************************************************************************
- 查询信鸽注册结果
/** @brief 注册设备token的回调 @param deviceToken 当前设备的token @param error 错误信息 注意:此回调方法在注册成功之后调用,当前的 Token 已经注册过之后,SDK 将缓存注册信息,此方法将不会再调用 */ - (void)xgPushDidRegisteredDeviceToken:(NSString *)deviceToken error:(NSError *)error{ NSLog(@"======》%s",__func__); NSLog(@"xgPushDidRegisteredDeviceToken===>%s, result %@, error %@", __FUNCTION__, error?@"NO":@"OK", error); }
- 监控信鸽推送服务的启动情况
/** @brief 监控信鸽推送服务的启动情况 @param isSuccess 信鸽推送是否启动成功 @param error 信鸽推送启动错误的信息 */ -(void)xgPushDidFinishStart:(BOOL)isSuccess error:(NSError *)error{ NSLog(@"======》%s",__func__); NSLog(@"%@ error %@",isSuccess? @"Success":@"Fail",error); }
- 远程通知注册失败代理方法
/** 远程通知注册失败代理方法 */ -(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{ NSLog(@"%s",__func__); NSLog(@"[XGDemo] register APNS fail.\n[XGDemo] reason : %@", error); // [[NSNotificationCenter defaultCenter] postNotificationName:@"registerDeviceFailed" object:nil]; }
信鸽后台 http://xg.qq.com
应用列表-->历史明细
相关文章:
IOS 普通推送和静默推送
iOS学习笔记5-推送(信鸽推送)
iOS 信鸽推送
记录iOS 10信鸽推送适配
iOS手把手教你生成推送证书(测试和生产)
iOS静默通知
关于推送消息的处理