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

 

使用的是UIWebview

先看原生代码获取启动参数有没有问题

void -[JsApiHandler4GetStartupParams handler:context:callback:](void * self, void * _cmd, void * arg2, void * arg3, void * arg4) {
    r8 = arg4;
    rcx = arg3;
    var_-192 = [arg2 retain];
    r15 = [rcx retain];
    var_-200 = [r8 retain];
    r14 = [[rcx currentSession] retain];
    [r15 release];
    rbx = [[r14 createParam] retain];
    r15 = [[rbx expandParams] retain];
    [rbx release];
    [r14 release];
    rbx = [[var_-192 objectForKeyedSubscript:@"key"] retain];
    [rbx release];
    if (rbx != 0x0) {
            r12 = _objc_msgSend;
            r14 = [[var_-192 objectForKeyedSubscript:@"key", rcx, r8] retain];
            rdx = [NSArray class];
            if ([r14 isKindOfClass:rdx, rcx, r8] != 0x0) {
                    rdx = @"key";
                    rbx = [(r12)(var_-192, @selector(objectForKeyedSubscript:), rdx) retain];
                    rax = (r12)(rbx, @selector(count), rdx);
                    var_-208 = r15;
                    [rbx release];
                    [r14 release];
                    r15 = var_-208;
                    if (rax != 0x0) {
                            var_-216 = [(r12)(@class(NSMutableDictionary), @selector(dictionary), @"key") retain];
                            *(int128_t *)(&var_-320 + 0x30) = intrinsic_movaps(*(int128_t *)(&var_-320 + 0x30), 0x0);
                            *(int128_t *)(&var_-320 + 0x20) = intrinsic_movaps(*(int128_t *)(&var_-320 + 0x20), 0x0);
                            *(int128_t *)(&var_-320 + 0x10) = intrinsic_movaps(*(int128_t *)(&var_-320 + 0x10), 0x0);
                            var_-320 = intrinsic_movaps(var_-320, 0x0);
                            r15 = [(r12)(var_-192, @selector(objectForKeyedSubscript:), @"key") retain];
                            rcx = &var_-176;
                            rdx = &var_-320;
                            rax = (r12)(r15, @selector(countByEnumeratingWithState:objects:count:), rdx, rcx, 0x10);
                            var_-224 = rax;
                            r14 = r12;
                            if (rax != 0x0) {
                                    var_-248 = **(&var_-320 + 0x10);
                                    var_-232 = r15;
                                    do {
                                            r12 = 0x0;
                                            do {
                                                    if (*var_-304 != var_-248) {
                                                            objc_enumerationMutation(r15);
                                                    }
                                                    r13 = *(var_-312 + r12 * 0x8);
                                                    if ((((r14)(r13, @selector(isEqualToString:), @"safePayContext") == 0x0) && ((r14)(r13, @selector(isEqualToString:), @"reportUrl") == 0x0)) && ((r14)(r13, @selector(isEqualToString:), @"feedBackExtParams") == 0x0)) {
                                                            r15 = r14;
                                                            r14 = [(r14)(var_-208, @selector(objectForKeyedSubscript:), r13) retain];
                                                            (r15)(var_-216, @selector(setValue:forKey:), r14, r13);
                                                            rdi = r14;
                                                            r14 = r15;
                                                            r15 = var_-232;
                                                            [rdi release];
                                                    }
                                                    r12 = r12 + 0x1;
                                            } while (r12 < var_-224);
                                            rdx = &var_-320;
                                            rcx = &var_-176;
                                            rax = (r14)(r15, @selector(countByEnumeratingWithState:objects:count:), rdx, rcx, 0x10);
                                            var_-224 = rax;
                                    } while (rax != 0x0);
                            }
                            [r15 release];
                            r12 = var_-200;
                            rsi = var_-216;
                            (*(r12 + 0x10))(r12, rsi);
                            [var_-216 release];
                            r15 = var_-208;
                    }
                    else {
                            rsi = 0x2;
                            r12 = var_-200;
                            _ErrorCallback(r12, rsi);
                    }
            }
            else {
                    [r14 release];
                    rsi = 0x2;
                    r12 = var_-200;
                    _ErrorCallback(r12, rsi);
            }
    }
    else {
            if (r15 != 0x0) {
                    r12 = r15;
                    r15 = [r15 mutableCopy];
                    rbx = _objc_msgSend;
            }
            else {
                    r8 = 0x0;
                    rbx = _objc_msgSend;
                    r14 = [[NSDictionary dictionaryWithObjects:&var_-184 forKeys:&var_-184 count:r8] retain];
                    r12 = r15;
                    r15 = [r14 mutableCopy];
                    [r14 release];
            }
            (rbx)(r15, @selector(setObject:forKeyedSubscript:), 0x0, @"safePayContext", r8);
            (rbx)(r15, @selector(setObject:forKeyedSubscript:), 0x0, @"reportUrl", r8);
            rcx = @"feedBackExtParams";
            rdx = 0x0;
            (rbx)(r15, @selector(setObject:forKeyedSubscript:), rdx, rcx, r8);
            rbx = (rbx)(r15, @selector(copy), rdx, rcx, r8);
            [r12 release];
            r12 = var_-200;
            rsi = rbx;
            (*(r12 + 0x10))(r12, rsi);
            [r15 release];
            r15 = rbx;
    }
    [r15 release];
    [r12 release];
    [var_-192 release];
    if (*___stack_chk_guard != *___stack_chk_guard) {
            __stack_chk_fail();
    }
    return;
}

 

根据这个还原一下能运行的代码(非全流程,只看本次走到的分支)

 

.h

@interface JsApiHandler4GetStartupParams :NSObject

@end
//获取启动参数
NS_ASSUME_NONNULL_BEGIN

@interface JsApiHandler4GetStartupParams (YYY)

@end

NS_ASSUME_NONNULL_END

.m


#import "JsApiHandler4GetStartupParams+YYY.h"
#import <objc/runtime.h>

@implementation JsApiHandler4GetStartupParams (YYY)
+ (void)load{
    
    Method originalMethod = class_getInstanceMethod([self class], @selector(handler:context:callback:));
    Method swizzledMethod = class_getInstanceMethod([self class], @selector(handler:context:callbackS:));
    method_exchangeImplementations(originalMethod, swizzledMethod);
    
}

- (void)handler:(NSDictionary *)arg2 context:(PSDContext *)arg3 callbackS:(PSDJsApiResponseCallbackBlock)arg4;{
    id r14 = [arg3 currentSession];
    PSDSessionParam *rbx = [r14 createParam];
    NSDictionary *r15 = [rbx expandParams];
    
    NSString* rbx2 = [arg2 objectForKeyedSubscript:@"key"];
                     
    if(rbx2 != 0x0){
        
        NSArray *r14 = [arg2 objectForKeyedSubscript:@"key"];
        
        if ([r14 isKindOfClass:[NSArray class]] != 0x0) {

            if (r14.count != 0) {

                //略
            }
        
        }
    }else{
        if (r15 != 0x0) {
            r15 = [r15 mutableCopy];
        }
        else {
//          r8 = 0x0;
//          rbx = _objc_msgSend;
//          r14 = [[NSDictionary dictionaryWithObjects:&var_-184 forKeys:&var_-184 count:r8] retain];
//          r12 = r15;
//          r15 = [r14 mutableCopy];
//          [r14 release];
        }
        
        [r15 setValue:nil forKey:@"safePayContext"];
        [r15 setValue:nil forKey:@"reportUrl"];
        [r15 setValue:nil forKey:@"feedBackExtParams"];
        arg4(r15);
    }
    
//    [self handler:arg2 context:arg3 callbackS:arg4];
}
@end

 

 

可是发现正常情况下不走这个方法。

 

 

这个思路暂时放一放。

 

这个启动参数,是跳页带的参数吗?

答案应该是:跳本离线包其他页面不使用这个作为跳页传参,跳其他离线包需要

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值