吐槽极光iOS产品bug,认证与推送一起使用,认证的JVTelecomViewController弹出失败

    标题写得有点长,好让BAIDU愚蠢的SEO能找到。zzzzzz

    最近图方便app迭代加入了极光的认证登录,百度一圈没找到解决方法,现在踩坑完毕了叶总要留下点什么。这个好东西呢,本身是个好东西,但是既然你是收费的好歹写好文档严格控制控制代码质量,而不是让开发者自己去踩坑,像我这种搬运工还要花力气整理呢,碰上懒一点的解决完自己的问题也就算了。结果一大帮像我这样的人还要花费时间修轮子。估计也没谁像我这样一半时间coding一半时间写经验的了呵呵。

    由于版本不一样可能有所不同,不知道别人会不会修复修复,但求后人有参考,一切不写版本号的教程都是耍流氓。

$cat Podfile.lock查看pod库的版本。JPush(3.2.1)和JVerification(2.6.3)都使用了JCore(2.2.5)

    两个模块整合前最好单独分别测试是否能通能用,以排除因为账号、证书、Bundleid等配置问题导致的错误。反正我两个模块都分开单独测试了。

    当你乖乖按照极光官网那过时的教程加上一点百度coding完毕后。

···objectivec

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

......

[self registJpush:application :launchOptions];

[self Jverify];

}

-(void)Jverify{

    JVAuthConfig *config = [[JVAuthConfig alloc] init];

    config.appKey = appKey;

    [JVERIFICATIONService setDebug:YES];

    [JVERIFICATIONService setupWithConfig:config];

}

-(void)registJpush:(UIApplication *)application :(NSDictionary *)launchOptions{

    if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {

        JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];

        entity.types = UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound;

        [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];


    }else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {

        //可以添加自定义categories

        [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound |UIUserNotificationTypeAlert) categories:nil];

    }else {

        //categories 必须为nil

        [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert) categories:nil];

    }

    //初始换JPush

    [JPUSHService setupWithOption:launchOptions appKey:appKey

                          channel:channel

                apsForProduction:isProduction

            advertisingIdentifier:nil];  // 这里是没有advertisingIdentifier的情况,有的话,大家在自行添加

    //添加监听通知

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkDidLogin:) name:kJPFNetworkDidLoginNotification object:nil];

    //注册远端消息通知获取device token

    [application registerForRemoteNotifications];

}

···

然后在业务控制器中加入官方提供的demo抠出来的代码,因为是没有教程告诉你怎么调用的。

···objectivec

-(void)configJVerify{

    [JVERIFICATIONService getAuthorizationWithController:self hide:NO completion:^(NSDictionary *result) {

        NSString *token = result[@"loginToken"];

        NSInteger code = [result[@"code"] integerValue];

        if(token){

            dispatch_async(dispatch_get_main_queue(), ^{

                [self verifyLoginToken:token];//得到token调用登录接口

            });

        }else if (code == 6004){


        }else if(code != 6002){

            [self mbShowToast:KLString(@"无效token")];

        }

    }];


}

···

锵!赶紧commond+r跑起来。然而什么都没有发生,继续对比了官方提供的demo,有个JVTelecomViewConreoller,翻烂都没在库里找到,应该是打包成framework了。不过还是能找到配置它的地方,把这些臭臭长长的UI代码复制到我们的业务控制器viewDidLoad初始化就行了,把图片改成自己想要的,比较随便。

    再commond+r,页面还是没有按照demo那样显示出来。命名我单独测试的时候是没问题的,一切正常,把推送部分的代码注释掉也正常。为什么加上极光推送就不行了,那一定是两个模块公共部分的代码冲突了,说的就是JCore,首先推送和认证都分别初始化,推送的初始化先执行,极光服务器先收到JPush的业务请求,但这时候,我业务控制器已经调用的极光认证部分的方法getAuthorizationWithController,两个模块又是使用同一个JCore同一个appKey,那么很大可能是因为异步的原因,在JCore未接收到服务器返回的token的时候,认证模块已经访问了一个空的token,getAuthorizationWithController方法就很自然地返回了空。这个token业务是抽象的,我也不知道具体是什么,又看不到源码。我也不知道毕竟我是猜的。

    根据这个猜想,我将认证的注册部分(在AppDelegate)和调用部分(业务控制器)分别开辟了5秒和10秒的延时线程执行:

···objectivec

//AppDelegate

__block ViewController *weakSelf = self;dispatch_time_tdelayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0* NSEC_PER_SEC));dispatch_after(delayTime, dispatch_get_main_queue(), ^{ [weakSelf Jverify];});

//业务控制器
__block ViewController *weakSelf = self;dispatch_time_tdelayTime =

dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10.0*

NSEC_PER_SEC));dispatch_after(delayTime, dispatch_get_main_queue(), ^{ 

  [weakSelf configJVerify];});

···

    完美!可以打开,证明确实是异步问题,而这个问题官网是没有任何说明的。

    既然知道了问题所在,就再修修边幅吧,我发现JPush注册完deviceToken之后是有这个通知回调的:kJPFNetworkDidLoginNotification。盲猜是注册完毕推送后的回调。于是在业务控制器注册了观察者,当收到kJPFNetworkDidLoginNotification时再去调用getAuthorizationWithController方法,确保认证模块的业务是在推送注册执行完后再执行的,修改代码如下:

···objectivec

- (void)viewDidLoad {

    [super viewDidLoad];

    ............

    [self JVerifyCustomUI];

    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

    [center addObserver:self selector:@selector(configJVerify) name:kJPFNetworkDidLoginNotification object:nil];

}

···


    这里还特别说明一下getAuthorizationWithController这个方法,同样极光也是没有任何文档提及过,好歹说明下返回参数,继续盲猜。  

     在执行到configJVerify这方法的同时,弹出了“无效token”的提示。并且打了断点证明这个completion比方法的第一行都要早执行。

    差不多搞定了,只是最后有点困惑,就再琢磨一下,说不定能帮到用需要的人。查了一下这次completion块返回的code值,是6004。


    这就印证了我的之前的想法。因为这个推送初始化完成后通过通知调用的,因为共用了JCore,JCore队列执行了所有的completion。那么只可能第一次的completion是推送模块通过JCore执行的,第二次的completion是认证模块通过JCore执行的。调用就调用吧,反正没崩溃,写个else if(code == 6004){}把这个过滤掉就行了。这也让我加深了对block的了解,block的可否调用,跟谁去声明它是没有必然联系的。

    最后还是希望极光把这个隐藏的bug改过来,毕竟也是很浪费时间的,还有完善一下那咸丰年写的文档。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356