当前位置: 移动技术网 > IT编程>开发语言>JavaScript > iOS端mPaaS离线包10.1.60基线获取启动参数失败白屏问题研究(2)_flushMessageQueue方法查看

iOS端mPaaS离线包10.1.60基线获取启动参数失败白屏问题研究(2)_flushMessageQueue方法查看

2020年08月14日  | 移动技术网IT编程  | 我要评论
这是PSDJsBridge里的一个方法下面是伪代码void -[PSDJsBridge _flushMessageQueue](void * self, void * _cmd) { r15 = self; if ([self isBridgeReady] == 0x0) { [r15 setIsBridgeReady:0x1]; } objc_initWeak(&var_30, r15); rbx = [_PSDCon...

 

这是PSDJsBridge里的一个方法

下面是伪代码

void -[PSDJsBridge _flushMessageQueue](void * self, void * _cmd) {
    r15 = self;
    if ([self isBridgeReady] == 0x0) {
            [r15 setIsBridgeReady:0x1];
    }
    objc_initWeak(&var_30, r15);
    rbx = [_PSDConfigurationGet() retain];
    r14 = [rbx shouldCallJSAPIWithToken];
    [rbx release];
    if (r14 != 0x0) {
            var_38 = [[r15 contentView] retain];
            r13 = [_PSGetTokenWithContentView() retain];
            rbx = 0x1;
    }
    else {
            r13 = @"";
            rbx = 0x0;
    }
    r12 = [[NSString stringWithFormat:@"AlipayJSBridge._fetchQueue('%@');", r13] retain];
    if (rbx != 0x0) {
            [r13 release];
            [var_38 release];
    }
    rax = objc_loadWeakRetained(&r15->_contentView);
    *(&var_48 + 0xffffffffffffffe0) = __NSConcreteStackBlock;
    *(&var_48 + 0xffffffffffffffe8) = 0xc2000000;
    *(&var_48 + 0xfffffffffffffff0) = ___33-[PSDJsBridge _flushMessageQueue]_block_invoke;
    *(&var_48 + 0xfffffffffffffff8) = ___block_descriptor_tmp.290;
    *(int8_t *)(&var_48 + 0x8) = r14;
    objc_copyWeak(&var_48, &var_30);
    [rax evaluateJavaScript:r12 completionHandler:&var_68];
    [rax release];
    objc_destroyWeak(&var_48);
    [r12 release];
    objc_destroyWeak(&var_30);
    return;
}
int ___33-[PSDJsBridge _flushMessageQueue]_block_invoke(int arg0, int arg1, int arg2) {
    rdx = arg2;
    r12 = arg0;
    rbx = [arg1 retain];
    var_58 = [rdx retain];
    var_60 = rbx;
    rbx = [[rbx description] retain];
    rdi = @"";
    if (rbx != 0x0) {
            rdi = rbx;
    }
    r14 = [rdi retain];
    [rbx release];
    var_48 = r14;
    if ((*(int8_t *)(r12 + 0x28) != 0x0) && ([r14 length] == 0x0)) {
            r13 = [[PSDLogger shareInstance] retain];
            var_40 = @"logStr";
            r14 = [[NSString stringWithFormat:@"msg=%@"] retain];
            var_38 = r14;
            rbx = [[NSDictionary dictionaryWithObjects:@"msg=%@" forKeys:&var_40 count:0x1] retain];
            [r13 doLogWithLogId:@"PSD_JsApi_Call_Without_Token" params:rbx];
            [rbx release];
            [r14 release];
            [r13 release];
    }
    r12 = r12 + 0x20;
    r15 = objc_loadWeakRetained(r12);
    rbx = [[r15 contentView] retain];
    rdx = [WKWebView class];
    r13 = [rbx isKindOfClass:rdx];
    [rbx release];
    [r15 release];
    if (r13 != 0x0) {
            r15 = objc_loadWeakRetained(r12);
            rbx = [[r15 contentView] retain];
            var_50 = rbx;
            [r15 release];
            r15 = objc_loadWeakRetained(r12);
            r12 = [[rbx URL] retain];
            rbx = [[r12 absoluteString] retain];
            rsi = @selector(_doFlushMessageQueue:url:);
            r13 = var_48;
            rdx = r13;
            rcx = rbx;
            _objc_msgSend(r15, rsi);
            [rbx release];
            [r12 release];
            [r15 release];
            [var_50 release];
    }
    else {
            r15 = objc_loadWeakRetained(r12);
            rax = [r15 contentView];
            rax = [rax retain];
            *(&var_68 + 0xffffffffffffffd8) = __NSConcreteStackBlock;
            *(&var_68 + 0xffffffffffffffe0) = 0xc2000000;
            *(&var_68 + 0xffffffffffffffe8) = ___33-[PSDJsBridge _flushMessageQueue]_block_invoke_2;
            *(&var_68 + 0xfffffffffffffff0) = ___block_descriptor_tmp.287;
            objc_copyWeak(&var_68, r12);
            *(&var_68 + 0xfffffffffffffff8) = [var_48 retain];
            rsi = @selector(evaluateJavaScript:completionHandler:);
            rdx = @"document.location.href";
            rcx = &var_90;
            _objc_msgSend(rax, rsi);
            [rax release];
            [r15 release];
            [var_70 release];
            objc_destroyWeak(&var_68);
            r13 = var_48;
    }
    [r13 release];
    [var_58 release];
    [var_60 release];
    rax = *___stack_chk_guard;
    if (rax != *___stack_chk_guard) {
            rax = __stack_chk_fail();
    }
    return rax;
}
int ___33-[PSDJsBridge _flushMessageQueue]_block_invoke_2(int arg0, int arg1) {
    r14 = [arg1 retain];
    r15 = objc_loadWeakRetained(arg0 + 0x28);
    rbx = [[r14 description] retain];
    [r14 release];
    [r15 _doFlushMessageQueue:*(arg0 + 0x20) url:rbx];
    [rbx release];
    rax = [r15 release];
    return rax;
}

 

然后对这个代码还原一下可以运行的代码(不保证完全正确)

需要引入PSDUtils.h头文件

-(void)_flushMessageQueueS{
    if ([self isBridgeReady] == 0x0) {
            [self setIsBridgeReady:0x1];
       }
    BOOL r14 = [[PSDConfiguration defaultConfiguration]  shouldCallJSAPIWithToken];
    
    BOOL rbx;
    NSString *r13;
    if (r14 != 0x0) {
        
        r13 = PSGetTokenWithContentView([self contentView]);
        rbx = 1;
    }else{
        r13 = @"";
        rbx = 0x0;
    }
    
    NSString *r12 = [NSString stringWithFormat:@"AlipayJSBridge._fetchQueue('%@');", r13];
                      
                   
    [self.contentView evaluateJavaScript:r12 completionHandler:^(NSString* str, NSError * _Nullable error) {
      NSString * rbx =  [str description];
      NSString*  rdi = @"";
         if (rbx != 0x0) {
                 rdi = rbx;
         }
        
        if ([self.contentView isKindOfClass:[WKWebView class]]) {

            NSURL* r12 = [[self contentView] URL];
            NSString* rbx3 = [r12 absoluteString];
            [self _doFlushMessageQueue:rbx url:rbx3];

            
        }else{
             WKWebView* rax = [self contentView];
            [rax evaluateJavaScript:@"document.location.href" completionHandler:^(NSString* strr, NSError * _Nullable error) {
                
                NSString* rbx2 = [strr description];
                
                  [self _doFlushMessageQueue:rbx url:rbx2];
                
            }];
        }
        
    }];
    
//    [self _flushMessageQueueS];
}

 

本想这里可以看看白屏问题,可是只是原生调用了h5,执行了一下交互代码,这个思路也暂停一下。

 

 

 

 

本文地址:https://blog.csdn.net/qq_15509071/article/details/107977368

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网