JPush的坑

Posted wangjunling888

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JPush的坑相关的知识,希望对你有一定的参考价值。

​ 搞了一下午, 没有搞出来, 最终在一个同事的提醒下终于弄好了, 废话不多说直接上代码

/**
 初始化极光推送
 */
- (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中有一下几个通知, 并且还给了中文注释, 不愧为中国人写的哈,

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;  // 错误提示

所以, 正确的姿势应该这么写:

/**
 初始化极光推送
 */
- (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];


经过上面的改造成功设置别名和标签, 希望做到这的小伙伴们别再才坑, 哦, 对了, 通知一定要记得移除哦!

以上是关于JPush的坑的主要内容,如果未能解决你的问题,请参考以下文章

1Android Studio集成极光推送(Jpush) 报错 java.lang.UnsatisfiedLinkError: cn.jpush.android.service.PushProtoc

ionic 集成jpush

JPush极光推送Java服务器端实例

JPush极光推送Java服务器端实例

Jpush之如何利用HttpClient实现消息推送到手机

用 jpush-react-native 插件快速集成推送功能(Android 篇)