JPush的坑
搞了一下午, 没有高出来, 最终在一个同事的提醒下终于弄好了, 废话不多说直接上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| /** 初始化极光推送 */ - (void)setJPush:(NSDictionary *)launchOptions { //初始化APNs JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init]; entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound; if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { // 可以添加自定义categories // NSSet<UNNotificationCategory *> *categories for iOS10 or later // NSSet<UIUserNotificationCategory *> *categories for iOS8 and iOS9 } [JPUSHService registerForRemoteNotificationConfig:entity delegate:self]; //初始换JPush [JPUSHService setupWithOption:launchOptions appKey:JPushAppKey channel:nil apsForProduction:NO]; //设置别名 [JPUSHService setTags:nil alias:@"abc" fetchCompletionHandle:^(int iResCode, NSSet *iTags, NSString *iAlias) { NSLog(@"%@", iAlias); }]; // [[NSNotificationCenter defaultCenter] addObserver:self // selector:@selector(networkDidLogin:) // name:kJPFNetworkDidLoginNotification // object:nil]; // 关掉无法无天的log, 需要时再开启 [JPUSHService setLogOFF];
}
|
上面就是我的代码, 完全按照极光官方文档集成, 但是就是绑定不了别名。
下面我来说一下原因, 在JPush刚刚初始化后面直接调用设置标签很有可能极光那边还没有登录完成, 因为都是异步网络请求, 所以此时去绑定标签或者别名肯定是不行的, 解决方案就是 在初始化的地方设置登录极光成功的通知, 极光sdk中有一下几个通知, 并且还给了中文注释, 不愧为中国人写的哈,
1 2 3 4 5 6 7 8
| extern NSString *const kJPFNetworkIsConnectingNotification; // 正在连接中 extern NSString *const kJPFNetworkDidSetupNotification; // 建立连接 extern NSString *const kJPFNetworkDidCloseNotification; // 关闭连接 extern NSString *const kJPFNetworkDidRegisterNotification; // 注册成功 extern NSString *const kJPFNetworkFailedRegisterNotification; //注册失败 extern NSString *const kJPFNetworkDidLoginNotification; // 登录成功 extern NSString *const kJPFNetworkDidReceiveMessageNotification; // 收到消息(非APNS) extern NSString *const kJPFServiceErrorNotification; // 错误提示
|
所以, 正确的姿势应该这么写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| /** 初始化极光推送 */ - (void)setJPush:(NSDictionary *)launchOptions { //初始化APNs JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init]; entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound; if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { // 可以添加自定义categories // NSSet<UNNotificationCategory *> *categories for iOS10 or later // NSSet<UIUserNotificationCategory *> *categories for iOS8 and iOS9 } [JPUSHService registerForRemoteNotificationConfig:entity delegate:self]; //初始换JPush [JPUSHService setupWithOption:launchOptions appKey:JPushAppKey channel:nil apsForProduction:NO]; //添加监听通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkDidLogin:) name:kJPFNetworkDidLoginNotification object:nil]; [JPUSHService setLogOFF]; } - (void)networkDidLogin:(NSNotification *)notification { [JPUSHService setTags:nil alias:@"abc" fetchCompletionHandle:^(int iResCode, NSSet *iTags, NSString *iAlias) { NSLog(@"%@", iAlias); }]; //移除通知 [[NSNotificationCenter defaultCenter] removeObserver:self name:kJPFNetworkDidLoginNotification object:nil]; }
|
经过上面的改造成功设置别名和标签, 希望做到这的小伙伴们别再才坑, 哦, 对了, 通知一定要记得移除哦!