详解mpaas离线包pushWindow方法的两个参数defaultTitle和readTitle在iOS客户端代码执行流程以及自定义导航条之后的适配方法(四)

现在看看defaultTitle。

defaultTitle设置默认标题时,readTitle必须为false才会生效     

这是其堆栈

通过前面的断点很容易发现走了一个新方法,并且已经有值了

-[NBViewControllerProxy initUI:delegate:]

void -[NBViewControllerProxy initUI:delegate:](void * self, void * _cmd, void * arg2, void * arg3) {
    rcx = arg3;
    r14 = [arg2 retain];
    objc_storeWeak(*ivar_offset(_psdView) + self, arg2);
    r15 = [[arg2 contentView] retain];
    [r14 release];
    rbx = *ivar_offset(_contentView) + self;
    objc_storeWeak(rbx, r15);
    [r15 release];
    r15 = rbx;
    rbx = objc_loadWeakRetained(rbx);
    [rbx setAutoresizingMask:0x12];
    [rbx release];
    var_-56 = self;
    r14 = [[self channelId] retain];
    rbx = objc_loadWeakRetained(r15);
    [rbx setChannelId:r14];
    [rbx release];
    [r14 release];
    r14 = [[self options] retain];
    r12 = [[r14 nbl_id] retain];
    rbx = objc_loadWeakRetained(r15);
    [rbx setNbl_id:r12];
    [rbx release];
    [r12 release];
    [r14 release];
    r14 = [[var_-56 pvReporter] retain];
    rbx = objc_loadWeakRetained(r15);
    [rbx setPageDelegate:r14];
    [rbx release];
    [r14 release];
    r14 = [[var_-56 options] retain];
    rbx = [r14 canPullDown];
    r12 = objc_loadWeakRetained(r15);
    r13 = [[r12 scrollView] retain];
    [r13 setBounces:rbx & 0xff];
    [r13 release];
    [r12 release];
    [r14 release];
    r14 = objc_loadWeakRetained(r15);
    [r14 setScalesPageToFit:0x1];
    [r14 release];
    r14 = objc_loadWeakRetained(r15);
    [var_-56 setCustomUserAgentWithContentView:r14];
    [r14 release];
    r14 = [[var_-56 viewController] retain];
    r12 = [[r14 view] retain];
    rbx = objc_loadWeakRetained(r15);
    [r12 addSubview:rbx];
    [rbx release];
    [r12 release];
    [r14 release];
    rbx = objc_loadWeakRetained(r15);
    [rbx contentViewDidLoad];
    [rbx release];
    rax = [var_-56 psdSession];
    rax = [rax retain];
    r15 = [[rax session] retain];
    r14 = [[r15 context] retain];
    r13 = [[r14 nbl_id] retain];
    rbx = [[var_-56 pvReporter] retain];
    [rbx setNbl_id:r13];
    [rbx release];
    [r13 release];
    [r14 release];
    [r15 release];
    [rax release];
    r14 = [[var_-56 options] retain];
    r15 = [[r14 url] retain];
    rbx = [[var_-56 pvReporter] retain];
    rdx = r15;
    [rbx setEntranceUrl:rdx];
    [rbx release];
    [r15 release];
    rbx = var_-56;
    [r14 release];
    if ([rbx->_myFlags isInited] == 0x0) {
            [rbx sendCreateNavigationTitleViewEvent];
            rax = [rbx options];
            rax = [rax retain];
            var_-48 = rax;
            rax = [rax defaultTitle];
            rax = [rax retain];
            var_-80 = rax;
            r14 = [rax length];
            rax = [rbx options];
            rax = [rax retain];
            var_-72 = rax;
            if (r14 != 0x0) {
                    r13 = [[rax defaultTitle] retain];
                    var_-64 = 0x1;
                    var_-60 = 0x0;
            }
            else {
                    r13 = [[rax titleImage] retain];
                    var_-60 = 0x1;
                    var_-64 = 0x0;
            }
            r12 = [[rbx options] retain];
            r14 = [[r12 defaultSubtitle] retain];
            rdx = r13;
            rcx = r14;
            [rbx sendSetMainTitleEvent:rdx subtitle:rcx];
            [r14 release];
            [r12 release];
            if (var_-60 != 0x0) {
                    [r13 release];
                    [var_-72 release];
            }
            if (var_-64 != 0x0) {
                    [r13 release];
                    [var_-72 release];
            }
            [var_-80 release];
            [var_-48 release];
            rbx = var_-56;
            [rbx sendCreateLeftItemsEvent];
            [rbx sendCreateRightItemsEvent];
            [rbx sendCreateToolbarEvent];
    }
    rbx = [[rbx viewController] retain];
    [rbx nbViewDidLoad];
    [rbx release];
    return;
}

通过断点位置可以看到调用方法在最后的"sendSetMainTitleEvent:subtitle:"处,

最上面代码看到var_38 = self;

取值的代码就是 [[self options] defaultTitle]

那options的值在哪里获取的呢

可以看到是在-[NBViewControllerProxy associateWeakScene:sceneParam:]设置的

void -[NBViewControllerProxy associateWeakScene:sceneParam:](void * self, void * _cmd, void * arg2, void * arg3) {
    var_30 = [arg2 retain];
    r13 = [arg3 retain];
    [arg2 addEventListener:@"navigation.*" withListener:self useCapture:0x0];
    r12 = self;
    rcx = r12;
    [arg2 addEventListener:@"page.*" withListener:rcx useCapture:0x0];
    objc_storeWeak(*ivar_offset(_psdScene) + r12, arg2);
    rbx = [[arg2 parentKernelObject] retain];
    [var_30 release];
    objc_storeWeak(*ivar_offset(_psdSession) + r12, rbx);
    [rbx release];
    var_30 = r13;
    r13 = [[r13 expandParams] retain];
    rbx = [[r13 objectForKey:@"kNBSceneOptionsParam"] retain];
    [r13 release];
    if (rbx == 0x0) {
            rbx = [_NBServiceConfigurationGet() retain];
            r14 = r12;
            r12 = [rbx optionsClass];
            [rbx release];
            r12 = [r12 alloc];
            r13 = [[var_30 expandParams] retain];
            rdi = r12;
            r12 = r14;
            rbx = [rdi initWithDictionary:r13];
            [r13 release];
    }
    var_50 = rbx;
    rdx = rbx;
    [r12 setOptions:rdx];
    rbx = [[r12 viewController] retain];
    [rbx nbViewControllerInit];
    [rbx release];
    rbx = [_NBServiceConfigurationGet() retain];
    var_40 = [[rbx userAgent] retain];
    [rbx release];
    var_38 = r12;
    r13 = [[r12 psdScene] retain];
    r14 = [[r13 uniqueId] retain];
    rbx = [NSString stringWithFormat:rdx];
    r12 = [rbx retain];
    [r14 release];
    [r13 release];
    objc_storeStrong(*ivar_offset(_channelId) + var_38, rbx);
    r13 = [[NSString stringWithFormat:@"%@(0)", @"ChannelId"] retain];
    var_48 = r12;
    rcx = r12;
    r12 = [_objc_msgSend(var_40, @selector(stringByReplacingOccurrencesOfString:withString:)) retain];
    [var_40 release];
    [r13 release];
    rbx = [[var_38 viewController] retain];
    r14 = [[rbx nbUserAgentSuffix] retain];
    [rbx release];
    if ([r14 length] != 0x0) {
            rbx = [[r12 stringByAppendingString:r14] retain];
            [r12 release];
            r12 = rbx;
    }
    var_38->_customUserAgent = r12;
    [var_38->_customUserAgent release];
    [r14 release];
    [var_48 release];
    [var_50 release];
    [var_30 release];
    return;
}

这地方出现一个分支

看一下该走哪里

可以看到r13有值,不走括号内

总结:options = [arg2 expandParams] [@"kNBSceneOptionsParam"];

后面可以看到arg2是PSDSceneParam类型

arg2来自于哪里呢? 下面显示来自sceneParam

void -[UIViewController associateWeakScene:sceneParam:](void * self, void * _cmd, void * arg2, void * arg3) {
    var_-48 = [arg2 retain];
    r15 = [arg3 retain];
    r12 = [[NBWeakObject weakObject:arg2] retain];
    objc_setAssociatedObject(self, @"kViewController_Lifecycle_PSDDelegate", r12, 0x1);
    r14 = [[self lazyViewControllerProxy] retain];
    [r14 associateWeakScene:var_-48 sceneParam:r15];
    [r15 release];
    [var_-48 release];
    [r14 release];
    [r12 release];
    return;
}

可以看到UIViewController只是做了一个转发

继续下一个方法

void * -[PSDScene initWithSceneParam:parentObject:](void * self, void * _cmd, void * arg2, void * arg3) {
    rcx = arg3;
    r14 = self;
    r12 = [arg2 retain];
    r13 = [rcx retain];
    if (r12 == 0x0) {
            rcx = "-[PSDScene initWithSceneParam:parentObject:]";
            rbx = [[NSString stringWithFormat:cfstring__] retain];
            NSLog(@"%@", rbx);
            [rbx release];
    }
    var_80 = r14;
    *(&var_80 + 0x8) = _OBJC_CLASS_$_PSDScene;
    r15 = [[&var_80 super] init];
    if (r15 != 0x0) {
            rax = [r15 jsApiManager];
            rax = [rax retain];
            var_40 = r13;
            var_30 = r12;
            [rax setScope:@"scene"];
            [rax release];
            rbx = [[r15 jsApiManager] retain];
            [rbx registerDefaultJsApis];
            [rbx release];
            rbx = [[r15 pluginManager] retain];
            [rbx setScope:@"scene"];
            [rbx release];
            rbx = [[r15 pluginManager] retain];
            [rbx registerDefaultPlugins];
            [rbx release];
            [var_40 addSubObject:r15];
            [r15 setSceneParam:var_30];
            r12 = [[r15 sceneParam] retain];
            rbx = [[[r12 viewControllerCls] alloc] init];
            [r15 setPsdViewController:rbx];
            [rbx release];
            [r12 release];
            rbx = [[r15 psdViewController] retain];
            [rbx setEdgesForExtendedLayout:0x0];
            [rbx release];
            rbx = [[r15 psdViewController] retain];
            rdx = @selector(associateWeakScene:sceneParam:);
            r13 = [rbx respondsToSelector:rdx];
            [rbx release];
            r14 = var_30;
            if (r13 != 0x0) {
                    rbx = [[r15 psdViewController] retain];
                    rdx = r15;
                    rcx = r14;
                    [rbx associateWeakScene:rdx sceneParam:rcx];
                    [rbx release];
            }
            rbx = [[PSDSceneEvent createEvent] retain];
            [r15 dispatchEvent:rbx, rcx];
            [rbx release];
            r12 = [[PSDViewParam alloc] init];
            rdx = [r14 contentViewCls];
            [r12 setContentViewCls:rdx, rcx];
            r14 = [[r15 sceneParam] retain];
            rbx = [[r14 url] retain];
            var_38 = r12;
            [r12 setUrl:rbx, rcx];
            [rbx release];
            [r14 release];
            r14 = [[r15 viewController] retain];
            r12 = [[r14 view] retain];
            var_48 = r15;
            if (r12 != 0x0) {
                    [&var_70 bounds];
            }
            else {
                    var_60 = intrinsic_movaps(var_60, 0x0);
                    var_70 = intrinsic_movaps(var_70, 0x0);
            }
            [var_38 setFrame:var_70, var_60];
            rsp = (rsp - 0x20) + 0x20;
            [r12 release];
            [r14 release];
            r14 = [[var_48 sceneParam] retain];
            rbx = [[r14 expandParams] retain];
            [var_38 setExpandParams:rbx];
            [rbx release];
            [r14 release];
            r15 = var_48;
            r12 = [[PSDView viewWithViewParam:var_38 parentObject:r15] retain];
            r14 = [[UIColor clearColor] retain];
            rbx = [[r12 contentView] retain];
            [rbx setBackgroundColor:r14];
            [rbx release];
            [r14 release];
            [r15 setPsdView:r12];
            rbx = [[r15 psdViewController] retain];
            [rbx initUI:r12 delegate:r15];
            [rbx release];
            rbx = [[PSDSceneEvent readyEvent] retain];
            [r15 dispatchEvent:rbx];
            [rbx release];
            rbx = [[PSDSceneEvent startFirstRequestEvent] retain];
            if ([r15 dispatchEvent:rbx] != 0x0) {
                    [r12 startLoadRequest];
            }
            [rbx release];
            [r12 release];
            [var_38 release];
            r12 = var_30;
            r13 = var_40;
    }
    [r13 release];
    [r12 release];
    rax = r15;
    return rax;
}

代码调用在中等偏上,第三个psdViewController后面

看来参数是上个方法直接传过来的,第一个参数initWithSceneParam:

void * +[PSDScene sceneWithSceneParam:parentObject:](void * self, void * _cmd, void * arg2, void * arg3) {
    r14 = [arg2 retain];
    objc_initWeak(&var_28, arg3);
    r15 = [PSDScene alloc];
    rbx = objc_loadWeakRetained(&var_28);
    r15 = [r15 initWithSceneParam:r14 parentObject:rbx];
    [rbx release];
    objc_destroyWeak(&var_28);
    [r14 release];
    rax = [r15 autorelease];
    return rax;
}

接着参数是上个方法直接传过来的,第一个参数createSceneWithSceneParam

void * -[PSDService createSceneWithSceneParam:parentObject:](void * self, void * _cmd, void * arg2, void * arg3) {
    r15 = self;
    r12 = [arg2 retain];
    r14 = [arg3 retain];
    if (r12 == 0x0) {
            rbx = [[NSString stringWithFormat:cfstring__] retain];
            NSLog(@"%@", rbx);
            [rbx release];
    }
    if ((*(int8_t *)&r15->_myFlags & 0x1) == 0x0) {
            rbx = [[NSString stringWithFormat:cfstring__] retain];
            NSLog(@"%@", rbx);
            [rbx release];
    }
    rbx = [[PSDScene sceneWithSceneParam:r12 parentObject:r14] retain];
    [r14 release];
    [r12 release];
    rax = [rbx autorelease];
    return rax;
}

还是 参数是上个方法直接传过来的

void * -[PSDSession createScene:preRenderParams:kickOut:isHit:](void * self, void * _cmd, void * arg2, void * arg3, void * arg4, bool * arg5) {
    r8 = arg4;
    rcx = arg3;
    var_40 = arg5;
    var_38 = [arg2 retain];
    r14 = [rcx retain];
    r12 = [[self preRenderQueue] retain];
    var_30 = self;
    r13 = [[self taskId:r14] retain];
    [r14 release];
    rdx = r13;
    rbx = [[r12 task:rdx] retain];
    [r13 release];
    [r12 release];
    r12 = [[rbx scene] retain];
    if (r12 != 0x0) {
            rdi = var_30;
            rax = var_40;
            if (rax != 0x0) {
                    *(int8_t *)rax = 0x1;
            }
            r14 = [[rdi preRenderQueue] retain];
            rax = [rbx taskId];
            rax = [rax retain];
            rcx = _objc_msgSend;
            r13 = rbx;
            rbx = rax;
            rsi = @selector(remove:);
            rdx = rbx;
            [[_objc_msgSend(r14, rsi, rdx, rcx) retain] release];
            [rbx release];
            [r14 release];
            r14 = var_38;
    }
    else {
            rax = [PSDService sharedInstance];
            rax = [rax retain];
            r8 = _objc_msgSend;
            r13 = rbx;
            rsi = @selector(createSceneWithSceneParam:parentObject:);
            r14 = var_38;
            rdx = r14;
            rcx = var_30;
            var_30 = [_objc_msgSend(rax, rsi, rdx, rcx, r8) retain];
            [r12 release];
            [rax release];
            r12 = var_30;
    }
    [r13 release];
    [r14 release];
    rax = [r12 autorelease];
    return rax;
}

接下来应该看PSDSceneParam在[JsApiHandler4PushWindow handler:context:callback:]如何创建的 

void -[JsApiHandler4PushWindow handler:context:callback:](void * self, void * _cmd, void * arg2, void * arg3, void * arg4) {
    r14 = [arg2 retain];
    rbx = [arg3 retain];
    rax = [arg4 retain];
    r15 = r14;
    var_140 = rax;
    var_188 = self;
    var_248 = self;
    *(&var_248 + 0x8) = _OBJC_CLASS_$_JsApiHandler4PushWindow;
    var_160 = rbx;
    [[&var_248 super] handler:r15 context:rbx callback:rax];
    rbx = [[H5Configs sharedConfigs] retain];
    r14 = [[rbx stripLandingConfig] retain];
    [rbx release];
    r12 = [[r15 objectForKeyedSubscript:@"url"] retain];
    rax = [r12 length];
    var_180 = r14;
    if (rax != 0x0) {
            var_128 = r15;
            r15 = [r14 boolForKey:@"pushWindowNormal"];
            [r12 release];
            if (r15 != 0x0) {
                    rbx = [[var_128 objectForKeyedSubscript:@"url"] retain];
                    r12 = [_H5StripLandingURL() retain];
                    [rbx release];
                    r15 = [[NSURL URLWithString:r12] retain];
                    rbx = [[var_128 objectForKeyedSubscript:@"url"] retain];
                    var_1C8 = r12;
                    rax = [r12 isEqualToString:rbx];
                    var_158 = r15;
                    if (rax != 0x0) {
                            [rbx release];
                            r15 = var_128;
                    }
                    else {
                            r12 = [[r14 objectForKeyedSubscript:@"scheme"] retain];
                            r14 = [[r15 scheme] retain];
                            r13 = [r12 containsObject:r14];
                            [r14 release];
                            [r12 release];
                            [rbx release];
                            if (r13 != 0x0) {
                                    rbx = [var_128 mutableCopy];
                                    var_138 = rbx;
                                    [rbx setValue:var_1C8 forKey:@"url"];
                                    rbx = [rbx copy];
                                    var_148 = rbx;
                                    [var_128 release];
                                    r14 = [[rbx objectForKeyedSubscript:@"url"] retain];
                                    rbx = [[NSString stringWithFormat:@"origUrl=%@^parsedUrl=%@^result=1^in=pushWindowNormal"] retain];
                                    var_178 = rbx;
                                    [r14 release];
                                    var_50 = @"seedId";
                                    var_40 = @"H5_STRPLANDING_RESULT";
                                    *(&var_50 + 0x8) = @"logStr";
                                    *(&var_40 + 0x8) = rbx;
                                    r12 = [[NSDictionary dictionaryWithObjects:@"origUrl=%@^parsedUrl=%@^result=1^in=pushWindowNormal" forKeys:r14 count:0x2] retain];
                                    r15 = [[var_160 currentScene] retain];
                                    r13 = [[r15 psdView] retain];
                                    rbx = [[r13 page] retain];
                                    [H5AutoLogger logWithOptions:r12 inPage:rbx];
                                    [rbx release];
                                    [r13 release];
                                    [r15 release];
                                    [r12 release];
                                    [var_178 release];
                                    [var_138 release];
                                    r15 = var_148;
                            }
                            else {
                                    r15 = var_128;
                            }
                    }
                    [var_158 release];
                    [var_1C8 release];
            }
            else {
                    r15 = var_128;
            }
    }
    else {
            [r12 release];
    }
    rbx = [[r15 objectForKeyedSubscript:@"url"] retain];
    rdx = rbx;
    r14 = [[NSURL URLWithString:rdx] retain];
    [rbx release];
    rbx = [[r14 scheme] retain];
    rax = [rbx length];
    var_128 = r15;
    var_1C8 = r14;
    if (rax == 0x0) goto loc_10058f253;

loc_10058f204:
    r15 = [[r14 scheme] retain];
    if ([r15 hasPrefix:@"http"] == 0x0) goto loc_10058f265;

loc_10058f230:
    [r15 release];
    [rbx release];
    r12 = var_140;
    r15 = var_128;
    goto loc_10058f2c3;

loc_10058f2c3:
    rdx = r15;
    [H5LaunchParamChecker checkURLParmaWithData:rdx];
    goto loc_10058f2da;

loc_10058f2da:
    rbx = [[var_188 pushWindowTask] retain];
    r14 = [rbx isFinished];
    [rbx release];
    if (r14 == 0x0) goto loc_10058f513;

loc_10058f318:
    if ([r15 isKindOfClass:[NSDictionary class]] == 0x0) goto loc_10058f595;

loc_10058f341:
    r14 = [[r15 objectForKey:@"param"] retain];
    if (r14 == 0x0) goto loc_10058f3d4;

loc_10058f36b:
    rbx = [[r15 objectForKey:@"param"] retain];
    r15 = [rbx isKindOfClass:[NSDictionary class]];
    [rbx release];
    [r14 release];
    r12 = var_140;
    COND = r15 == 0x0;
    r15 = var_128;
    if (COND) goto loc_10058f595;

loc_10058f3d4:
    rbx = [[r15 objectForKeyedSubscript:@"url"] retain];
    if ([rbx length] == 0x0) goto loc_10058f5f7;

loc_10058f409:
    r14 = [[NSCharacterSet whitespaceAndNewlineCharacterSet] retain];
    r12 = [[rbx stringByTrimmingCharactersInSet:r14] retain];
    [rbx release];
    [r14 release];
    r15 = r12;
    rdx = r15;
    rbx = var_160;
    rcx = rbx;
    if ([var_188 shouldStartApp:rdx context:rcx] == 0x0) goto loc_10058f68a;

loc_10058f47c:
    var_80 = @"success";
    r14 = r15;
    r15 = [@(YES) retain];
    var_78 = r15;
    rbx = [[NSDictionary dictionaryWithObjects:&var_78 forKeys:&var_80 count:0x1] retain];
    r12 = var_140;
    (*(r12 + 0x10))(r12, rbx);
    [rbx release];
    rdi = r15;
    r15 = var_128;
    [rdi release];
    var_158 = r14;
    goto loc_10058f67e;

loc_10058f67e:
    r14 = var_180;
    goto loc_100591566;

loc_100591566:
    [var_158 release];
    goto loc_10058f5a9;

loc_10058f5a9:
    [var_1C8 release];
    [r14 release];
    [r12 release];
    [var_160 release];
    [r15 release];
    if (*___stack_chk_guard != *___stack_chk_guard) {
            __stack_chk_fail();
    }
    return;

loc_10058f68a:
    rbx = [[rbx currentSession] retain];
    var_178 = [[rbx subObjects] retain];
    [rbx release];
    rbx = [[var_128 objectForKeyedSubscript:@"param", rcx] retain];
    r14 = [[NSMutableDictionary dictionaryWithDictionary:rbx, rcx] retain];
    [rbx release];
    rbx = [[r14 objectForKey:@"closeAllWindow", rcx] retain];
    [rbx release];
    var_150 = 0x0;
    var_148 = r14;
    var_158 = r15;
    if (rbx != 0x0) {
            rbx = [[r14 objectForKey:@"closeAllWindow"] retain];
            var_170 = [rbx boolValue];
            [rbx release];
    }
    else {
            var_170 = 0x0;
    }
    r15 = [[var_128 objectForKey:@"popToIndex"] retain];
    r12 = _objc_release;
    [r15 release];
    rbx = [[var_128 objectForKey:@"popToIndex"] retain];
    var_138 = [rbx intValue];
    [rbx release];
    var_1A8 = r15;
    if (r15 == 0x0) goto loc_10058f9d1;

loc_10058f81b:
    r15 = [var_178 count];
    r14 = [[var_160 currentSession] retain];
    rbx = [[r14 subObjects] retain];
    [r14 release];
    var_130 = rbx;
    r13 = [[rbx firstObject] retain];
    r12 = [[r13 viewController] retain];
    r14 = [r12 childTabCount];
    [r12 release];
    [r13 release];
    rax = r14 + (0x1 - r15);
    r15 = r15 - r14 - 0x1;
    if (r15 >= 0x0) {
            rax = r15;
    }
    rcx = var_138;
    if (rcx <= rax) goto loc_10058f9a0;

loc_10058f8e5:
    var_A0 = @"error";
    r12 = [@(0xa) retain];
    rdx = &var_90;
    *rdx = r12;
    *(&var_A0 + 0x8) = @"errorMessage";
    *(rdx + 0x8) = cfstring__eHe_vi;
    r8 = 0x2;
    rcx = &var_A0;
    r15 = [[NSDictionary dictionaryWithObjects:rdx forKeys:rcx count:r8] retain];
    rsi = r15;
    (*(var_140 + 0x10))(var_140, rsi);
    [r15 release];
    rdi = r12;
    r12 = var_140;
    [rdi release];
    [var_130 release];
    r14 = var_180;
    r15 = var_128;
    goto loc_100591554;

loc_100591554:
    [var_148 release];
    [var_178 release];
    goto loc_100591566;

loc_10058f9a0:
    rax = (SAR(rcx, 0x1f) & r15) + rcx;
    r14 = r14 + rax;
    if (rax == 0x0) {
            r14 = rax;
    }
    var_150 = r14;
    [var_130 release];
    r12 = _objc_release;
    goto loc_10058f9d1;

loc_10058f9d1:
    r15 = [[var_160 currentViewController] retain];
    [@"" retain];
    r14 = [[r15 psdView] retain];
    rbx = [[r14 contentView] retain];
    rdx = [UIWebView class];
    var_130 = [rbx isKindOfClass:rdx, @selector(isKindOfClass:)];
    (r12)(rbx, @selector(isKindOfClass:), rdx);
    (r12)(r14, @selector(isKindOfClass:), rdx);
    var_138 = r15;
    r14 = [[r15 psdView] retain];
    rbx = [[r14 contentView] retain];
    if (var_130 != 0x0) {
            r15 = [_objc_msgSend(rbx, @selector(stringByEvaluatingJavaScriptFromString:)) retain];
            (r12)(@"", @selector(stringByEvaluatingJavaScriptFromString:), @"document.location.href", @selector(isKindOfClass:));
            (r12)(rbx, @selector(stringByEvaluatingJavaScriptFromString:), @"document.location.href", @selector(isKindOfClass:));
            (r12)(r14, @selector(stringByEvaluatingJavaScriptFromString:), @"document.location.href", @selector(isKindOfClass:));
    }
    else {
            rdx = [WKWebView class];
            r15 = [rbx isKindOfClass:rdx, @selector(isKindOfClass:)];
            (r12)(rbx, @selector(isKindOfClass:), rdx, @selector(isKindOfClass:));
            (r12)(r14, @selector(isKindOfClass:), rdx, @selector(isKindOfClass:));
            COND = r15 == 0x0;
            r15 = @"";
            if (!COND) {
                    rbx = [[var_138 psdView] retain];
                    r14 = [[rbx contentView] retain];
                    [rbx release];
                    rbx = [[r14 URL] retain];
                    r12 = [[rbx absoluteString] retain];
                    [@"" release];
                    [rbx release];
                    [r14 release];
                    r15 = r12;
            }
    }
    rdx = r15;
    var_1D8 = [[NSURL URLWithFixedString:rdx] retain];
    r12 = [_H5URLString() retain];
    [var_158 release];
    r14 = [[H5Configs sharedConfigs] retain];
    rbx = [[r14 documentRefererWhitelist] retain];
    var_158 = r12;
    rax = _H5RegexTest();
    var_1F8 = r15;
    if (rax != 0x0) {
            r12 = var_148;
            rdx = [NSMutableDictionary class];
            r15 = [r12 isKindOfClass:rdx];
            [rbx release];
            [r14 release];
            if (r15 != 0x0) {
                    rax = [var_160 currentViewController];
                    rax = [rax retain];
                    var_130 = rax;
                    rax = [rax psdView];
                    rax = [rax retain];
                    var_1C0 = rax;
                    rax = [rax contentView];
                    rax = [rax retain];
                    var_1B0 = rax;
                    rax = [rax request];
                    rax = [rax retain];
                    var_168 = rax;
                    rax = [rax URL];
                    rax = [rax retain];
                    r15 = [[rax absoluteString] retain];
                    r14 = [_H5String() retain];
                    rdx = r14;
                    [r12 setValue:rdx forKey:@"pushingURLString"];
                    [r14 release];
                    [r15 release];
                    [rax release];
                    [var_168 release];
                    [var_1B0 release];
                    [var_1C0 release];
                    [var_130 release];
            }
            else {
                    rdx = 0x0;
                    [r12 setValue:rdx forKey:@"pushingURLString"];
            }
    }
    else {
            [rbx release];
            [r14 release];
            r12 = var_148;
            rdx = 0x0;
            [r12 setValue:rdx forKey:@"pushingURLString"];
    }
    r14 = r12;
    r12 = [[var_138 options] retain];
    rbx = [[r12 appId] retain];
    rcx = rbx;
    r8 = var_158;
    [H5LaunchParamsProcessor checkAndProcessLaunchParams:r14 appId:rcx urlString:r8];
    [rbx release];
    [r12 release];
    rdx = @"launchParamsTag";
    rbx = [[var_128 objectForKeyedSubscript:rdx, rcx] retain];
    var_1C0 = rbx;
    if (rbx != 0x0) {
            rdx = [NSString class];
            r12 = var_140;
            if ([rbx isKindOfClass:rdx, rcx, r8] != 0x0) {
                    rax = [var_138 psdSession];
                    rax = [rax retain];
                    var_130 = rax;
                    rax = [rax session];
                    rax = [rax retain];
                    r12 = [[rax context] retain];
                    rbx = [[r12 appConfigManager] retain];
                    rdx = r14;
                    rcx = var_1C0;
                    r14 = [[rbx mergeParams:rdx withTag:rcx] retain];
                    [rbx release];
                    rdi = r12;
                    r12 = var_140;
                    [rdi release];
                    [rax release];
                    [var_130 release];
                    rbx = [r14 mutableCopy];
                    [var_148 release];
                    [r14 release];
                    r14 = rbx;
            }
    }
    else {
            r12 = var_140;
    }
    r13 = _objc_msgSend;
    rax = _NBServiceConfigurationGet();
    rax = [rax retain];
    rbx = [[rax optionsClass] alloc];
    r15 = [[var_138 options] retain];
    var_148 = r14;
    rcx = r14;
    rbx = [rbx initWithOptions:r15 overrides:rcx];
    [r15 release];
    [rax release];
    r14 = var_158;
    [rbx setUrl:r14, rcx];
    var_130 = [rbx transparent];
    var_1B0 = rbx;
    if ([rbx transparent] != 0x0) {
            r15 = var_138;
            r14 = var_130;
    }
    else {
            r12 = [_H5OptionsWithURL(r14) retain];
            r15 = [[r12 objectForKeyedSubscript:@"transparent", rcx] retain];
            if ([r15 boolValue] != 0x0) {
                    rbx = _objc_msgSend;
                    [r15 release];
                    r14 = 0x1;
            }
            else {
                    r14 = [[r12 objectForKeyedSubscript:@"tt"] retain];
                    rbx = _objc_msgSend;
                    r13 = [r14 boolValue];
                    [r14 release];
                    [r15 release];
                    r14 = var_130;
                    if (r13 != 0x0) {
                            r14 = 0x1;
                    }
            }
            [r12 release];
            r12 = var_140;
            r13 = rbx;
            r15 = var_138;
    }
    rbx = [[r15 navigationController] retain];
    if (rbx == 0x0) goto loc_1005902fd;

loc_100590155:
    if (r14 != 0x0) goto loc_100590324;

loc_10059015e:
    var_130 = r14;
    [rbx release];
    goto loc_10059016e;

loc_10059016e:
    r14 = [(r13)(var_160, @selector(currentSession)) retain];
    r15 = [(r13)(r14, @selector(subObjects)) retain];
    rbx = [(r13)(r15, @selector(firstObject)) retain];
    [r15 release];
    [r14 release];
    rdx = (r13)(@class(PSDScene), @selector(class));
    if ((r13)(rbx, @selector(isKindOfClass:), rdx) == 0x0) {
            [rbx release];
            rbx = 0x0;
    }
    var_1D0 = rbx;
    r14 = [(r13)(rbx, @selector(viewController), rdx) retain];
    rbx = [(r13)(r14, @selector(options), rdx) retain];
    r15 = (r13)(rbx, @selector(transparent), rdx);
    [rbx release];
    [r14 release];
    if (r15 == 0x0) goto loc_100590360;

loc_100590264:
    var_E0 = @"error";
    r15 = [(r13)(@class(NSNumber), @selector(numberWithInt:), 0x3) retain];
    rdx = &var_D0;
    *rdx = r15;
    *(&var_E0 + 0x8) = @"errorMessage";
    *(rdx + 0x8) = cfstring___u__N___f_Wof_NAQ___z_S_Rbc;
    r8 = 0x2;
    rcx = &var_E0;
    rbx = [(r13)(@class(NSDictionary), @selector(dictionaryWithObjects:forKeys:count:), rdx, rcx, r8) retain];
    rsi = rbx;
    (*(r12 + 0x10))(r12, rsi);
    [rbx release];
    rdi = r15;
    goto loc_1005912d2;

loc_1005912d2:
    [rdi release];
    [var_1D0 release];
    r14 = var_180;
    r15 = var_128;
    r13 = var_1D8;
    goto loc_10059152b;

loc_10059152b:
    [var_1B0 release];
    [var_1C0 release];
    [r13 release];
    [var_1F8 release];
    [var_138 release];
    goto loc_100591554;

loc_100590360:
    r14 = var_1B0;
    r12 = [(r13)(r14, @selector(appId)) retain];
    rbx = [(r13)(r14, @selector(url)) retain];
    r15 = (r13)(@class(H5WKWebViewManager), @selector(shouldUseWKWebViewWithAppId:url:isSubView:params:), r12, rbx, 0x0, var_148);
    [rbx release];
    [r12 release];
    r12 = (r13)((r13)(@class(PSDSceneParam), @selector(alloc)), @selector(init));
    rbx = [_NBServiceConfigurationGet() retain];
    rdx = (r13)(rbx, @selector(viewControllerClass));
    (r13)(r12, @selector(setViewControllerCls:), rdx);
    [rbx release];
    rcx = objc_cls_ref_H5WebView;
    if (r15 != 0x0) {
            rcx = objc_cls_ref_H5WKWebView;
    }
    (r13)(r12, @selector(setContentViewCls:), (r13)(*rcx, @selector(class), rdx, rcx, 0x0), rcx, 0x0);
    rbx = [(r13)(r14, @selector(url), rdx, rcx, 0x0) retain];
    (r13)(r12, @selector(setUrl:), rbx, rcx, 0x0);
    [rbx release];
    var_F0 = @"kNBSceneOptionsParam";
    var_E8 = r14;
    r14 = [(r13)(@class(NSDictionary), @selector(dictionaryWithObjects:forKeys:count:), &var_E8, &var_F0, 0x1) retain];
    rbx = [_H5DictMerge() retain];
    var_1B8 = r12;
    (r13)(r12, @selector(setExpandParams:), rbx, &var_F0, 0x1);
    [rbx release];
    [r14 release];
    r15 = [(r13)(var_138, @selector(navigationController), rbx, &var_F0, 0x1) retain];
    rbx = [(r13)(r15, @selector(viewControllers), rbx, &var_F0, 0x1) retain];
    var_168 = [(r13)(@class(NSMutableArray), @selector(arrayWithArray:), rbx, &var_F0, 0x1) retain];
    [rbx release];
    [r15 release];
    r15 = 0x1;
    if (var_1A8 != 0x0) {
            rbx = sign_extend_64(var_150);
            if ([var_178 count] - 0x1 > rbx) {
                    rbx = [(r13)(var_178, @selector(objectAtIndex:), rbx) retain];
                    r14 = [(r13)(rbx, @selector(viewController)) retain];
                    [rbx release];
                    rbx = (r13)(var_168, @selector(indexOfObject:), r14);
                    if (rbx == 0x7fffffffffffffff) {
                            r13 = 0x7fffffffffffffff;
                            r15 = 0x1;
                            if ([r14 isSubViewMode] != 0x0) {
                                    rbx = [[r14 parentViewController] retain];
                                    [rbx release];
                                    if (rbx != 0x0) {
                                            r15 = [[r14 parentViewController] retain];
                                            rbx = [var_168 indexOfObject:r15];
                                            [r15 release];
                                            r15 = 0x1;
                                            if (rbx != r13) {
                                                    [var_168 count] - rbx + 0x1;
                                                    [var_168 removeObjectsInRange:rbx + 0x1];
                                                    r15 = 0x0;
                                            }
                                    }
                                    else {
                                            r15 = 0x1;
                                    }
                            }
                    }
                    else {
                            [var_168 count] - rbx + 0x1;
                            [var_168 removeObjectsInRange:rbx + 0x1];
                            r15 = 0x0;
                    }
                    [r14 release];
                    r13 = _objc_msgSend;
            }
    }
    rbx = var_1B8;
    if (var_170 != 0x0) {
            rax = [var_178 count];
            var_150 = rax;
            if (rax > 0x0) {
                    r12 = 0x0;
                    do {
                            rbx = [(r13)(var_178, @selector(objectAtIndex:), r12) retain];
                            rdx = (r13)(@class(PSDScene), @selector(class));
                            if ((r13)(rbx, @selector(isKindOfClass:), rdx) != 0x0) {
                                    r15 = [(r13)(rbx, @selector(viewController), rdx) retain];
                                    (r13)(var_168, @selector(removeObject:), r15);
                                    [r15 release];
                            }
                            [rbx release];
                            r12 = r12 + 0x1;
                    } while (var_150 != r12);
                    r15 = 0x0;
                    rbx = var_1B8;
            }
            else {
                    r15 = 0x0;
            }
    }
    var_1A8 = r15;
    r12 = var_128;
    rcx = r12;
    r15 = [(r13)(@class(H5PreRenderEvent), @selector(preRenderEventWithSceneParam:data:), rbx, rcx) retain];
    rbx = [(r13)(var_138, @selector(scene)) retain];
    rdx = r15;
    r14 = (r13)(rbx, @selector(dispatchEvent:), rdx);
    [rbx release];
    var_1F0 = r15;
    if (r14 == 0x0) goto loc_1005909e7;

loc_10059098c:
    var_190 = 0x0;
    rbx = [(r13)(var_160, @selector(currentSession), rdx, rcx) retain];
    var_150 = [(r13)(rbx, @selector(createScene:preRenderParams:kickOut:isHit:), var_1B8, r12, @"first", &var_190) retain];
    rdi = rbx;
    goto loc_100590a94;

loc_100590a94:
    [rdi release];
    goto loc_100590a9a;

loc_100590a9a:
    r14 = [(r13)(r12, @selector(objectForKeyedSubscript:), @"passData") retain];
    rdx = &var_198;
    rcx = rdx;
    rbx = [(r13)(@class(NSDictionary), @selector(dictionaryWithObjects:forKeys:count:), rdx, rcx, 0x0) retain];
    r15 = [_NBDictionary() retain];
    [rbx release];
    [r14 release];
    r12 = var_150;
    if (r15 != 0x0) {
            r14 = [(r13)(r12, @selector(viewController), rdx, rcx, 0x0) retain];
            rbx = [(r13)(r14, @selector(viewControllerProxy), rdx, rcx, 0x0) retain];
            rcx = r15;
            (r13)(rbx, @selector(setExpando:withValue:), @"kNBViewControllerProxyPassData", rcx, 0x0);
            [rbx release];
            [r14 release];
    }
    var_1E8 = r15;
    rax = (r13)(r12, @selector(getExpando:), @"kPSDSceneFinishRender", rcx, 0x0);
    rax = [rax retain];
    [rax release];
    var_170 = 0x0;
    r8 = rax != 0x0 ? 0x1 : 0x0;
    rax = (r13)(@class(NSString), @selector(stringWithFormat:), @"hitPreRender=%d^finishRender=%d", 0x0 & 0xff, r8);
    rax = [rax retain];
    rbx = &var_120;
    *rbx = @"logStr";
    r14 = &var_108;
    var_1E0 = rax;
    *r14 = rax;
    *(rbx + 0x8) = @"extPram2";
    rcx = var_128;
    rax = @"";
    if (rcx != 0x0) {
            rax = rcx;
    }
    *(r14 + 0x8) = rax;
    *(rbx + 0x10) = @"lid";
    r13 = [(r13)(@class(NSNumber), @selector(numberWithInt:), 0x13ed, rcx, r8) retain];
    *(r14 + 0x10) = r13;
    r8 = 0x3;
    r14 = [[NSDictionary dictionaryWithObjects:r14 forKeys:rbx count:r8] retain];
    r15 = [[r12 psdView] retain];
    rbx = [[r15 page] retain];
    rcx = rbx;
    [H5AutoLogger logWithOptions:r14 inPage:rcx];
    [rbx release];
    [r15 release];
    [r14 release];
    [r13 release];
    rbx = [[var_128 objectForKey:@"waitRender"] retain];
    [rbx doubleValue];
    var_1A0 = intrinsic_movsd(@class(H5AutoLogger), xmm0);
    [rbx release];
    xmm0 = intrinsic_xorpd(xmm0, xmm0);
    if (0x0 != 0x0) {
            xmm0 = intrinsic_xorpd(xmm0, xmm0);
    }
    else {
            xmm1 = intrinsic_movsd(xmm1, var_1A0);
            xmm1 = intrinsic_maxsd(xmm1, xmm0);
            xmm0 = intrinsic_movsd(xmm0, *0x100999d08);
            xmm0 = intrinsic_minsd(xmm0, xmm1);
            xmm0 = intrinsic_divsd(xmm0, *0x100980c48);
    }
    var_1A0 = intrinsic_movsd(var_1A0, xmm0);
    r12 = var_140;
    r14 = var_148;
    rbx = [[r14 objectForKeyedSubscript:@"closeCurrentWindow"] retain];
    r15 = [rbx respondsToSelector:@selector(boolValue)];
    [rbx release];
    if (r15 != 0x0) {
            rbx = [[r14 objectForKeyedSubscript:@"closeCurrentWindow"] retain];
            r14 = [rbx boolValue];
            [rbx release];
            if (r14 != 0x0) {
                    r12 = [[var_160 currentViewController] retain];
                    rax = [r12 cachedParentViewController];
                    rax = [rax retain];
                    rcx = _objc_msgSend;
                    r13 = rax;
                    rbx = [[var_160 currentViewController] retain];
                    if (r13 != 0x0) {
                            r14 = [[rbx cachedParentViewController] retain];
                            [rbx release];
                            rbx = r14;
                    }
                    [r13 release];
                    [r12 release];
                    [var_168 removeObject:rbx];
                    [rbx release];
                    var_170 = 0x1;
                    var_1A8 = 0x0;
                    r12 = var_140;
            }
            else {
                    var_170 = 0x0;
            }
    }
    rbx = var_148;
    r15 = [[rbx objectForKeyedSubscript:@"animationType"] retain];
    if ([r15 isKindOfClass:[NSString class]] != 0x0) {
            rbx = [[rbx objectForKeyedSubscript:@"animationType"] retain];
            r14 = [rbx isEqualToString:@"none"];
            [rbx release];
    }
    else {
            r14 = 0x0;
    }
    [r15 release];
    rbx = [[var_188 pushWindowTask] retain];
    if (r14 != 0x0) {
            rdx = 0x1;
    }
    else {
            rdx = 0x0;
    }
    [rbx setAnimationType:rdx];
    [rbx release];
    rbx = [[var_148 objectForKeyedSubscript:@"endJS"] retain];
    rdx = [NSString class];
    r14 = [rbx isKindOfClass:rdx];
    [rbx release];
    if (r14 != 0x0) {
            rbx = [[var_148 objectForKeyedSubscript:@"endJS"] retain];
            rdx = @"endJS";
            rcx = rbx;
            [var_150 setExpando:rdx withValue:rcx];
            [rbx release];
    }
    rbx = var_150;
    if (var_170 != 0x0) {
            rdx = @"kPSDSceneFromRedirectOrRelanch";
            rcx = @"1";
            [rbx setExpando:rdx withValue:rcx];
    }
    rax = [var_188 pushWindowTask];
    rax = [rax retain];
    var_150 = rbx;
    intrinsic_movsd(xmm0, var_1A0);
    [rax setWaitRender:rdx, rcx];
    [rax release];
    rbx = [[var_188 pushWindowTask] retain];
    [rbx setTransparent:var_130 & 0xff, rcx];
    [rbx release];
    rbx = [[var_188 pushWindowTask] retain];
    [rbx setIsNormalPush:var_1A8 & 0xff, rcx];
    [rbx release];
    rbx = [[var_188 pushWindowTask] retain];
    [rbx setCurrentVC:var_138, rcx];
    [rbx release];
    rbx = [[var_188 pushWindowTask] retain];
    [rbx setScene:var_150, rcx];
    [rbx release];
    rax = [UIApplication sharedApplication];
    rax = [rax retain];
    r15 = [[rax keyWindow] retain];
    rbx = [[var_188 pushWindowTask] retain];
    [rbx setKeyWindow:r15, rcx];
    [rbx release];
    [r15 release];
    [rax release];
    rbx = [[var_188 pushWindowTask] retain];
    rdx = var_168;
    [rbx setViewControllers:rdx, rcx];
    [rbx release];
    r14 = [[var_188 pushWindowTask] retain];
    rsi = @selector(run);
    _objc_msgSend(r14, rsi, rdx, rcx);
    [r14 release];
    [var_1E0 release];
    [var_1E8 release];
    [var_1F0 release];
    [var_150 release];
    [var_168 release];
    rdi = var_1B8;
    goto loc_1005912d2;

loc_1005909e7:
    rbx = [[r15 preRenderScene] retain];
    [rbx release];
    if (rbx == 0x0) goto loc_100590a37;

loc_100590a13:
    var_150 = [[r15 preRenderScene] retain];
    r12 = var_128;
    goto loc_100590a9a;

loc_100590a37:
    var_190 = 0x0;
    r15 = [(r13)(var_160, @selector(currentSession)) retain];
    r12 = var_128;
    var_150 = [(r13)(r15, @selector(createScene:preRenderParams:kickOut:isHit:), var_1B8, r12, @"first", &var_190) retain];
    rdi = r15;
    goto loc_100590a94;

loc_100590324:
    rax = [r15 presentingViewController];
    rax = [rax retain];
    if (rax == 0x0) goto loc_1005907eb;

loc_100590345:
    [rax release];
    [rbx release];
    goto loc_100590833;

loc_100590833:
    [@"" retain];
    goto loc_100590840;

loc_100590840:
    rax = [r15 presentingViewController];
    rax = [rax retain];
    if (rax == 0x0) goto loc_100590868;

loc_10059085d:
    [rax release];
    goto loc_100590891;

loc_100590891:
    r15 = cfstring_S_MRV;
    goto loc_100590898;

loc_100590898:
    [r15 retain];
    [@"" release];
    goto loc_100591478;

loc_100591478:
    var_C0 = @"error";
    r12 = [(r13)(@class(NSNumber), @selector(numberWithInt:), 0x3, rcx, r8) retain];
    rdx = &var_B0;
    *rdx = r12;
    *(&var_C0 + 0x8) = @"errorMessage";
    *(rdx + 0x8) = r15;
    r8 = 0x2;
    rcx = &var_C0;
    rbx = [(r13)(@class(NSDictionary), @selector(dictionaryWithObjects:forKeys:count:), rdx, rcx, r8) retain];
    rsi = rbx;
    (*(var_140 + 0x10))(var_140, rsi);
    [rbx release];
    [r12 release];
    goto loc_100591506;

loc_100591506:
    r13 = var_1D8;
    [r15 release];
    r12 = var_140;
    r14 = var_180;
    r15 = var_128;
    goto loc_10059152b;

loc_100590868:
    rbx = [[r15 presentedViewController] retain];
    [rbx release];
    if (rbx == 0x0) goto loc_1005908b3;
    goto loc_100590891;

loc_1005908b3:
    r12 = 0x1;
    goto loc_1005908b6;

loc_1005908b6:
    if (r15 == 0x0) goto loc_100590905;

loc_1005908bb:
    if ([r15 isSubViewMode] == 0x0) goto loc_100591352;

loc_1005908d6:
    rax = [r15 parentViewController];
    rax = [rax retain];
    if (rax == 0x0) goto loc_1005912fb;

loc_1005908f7:
    [rax release];
    goto loc_100591352;

loc_100591352:
    if (_H5ConfigServiceBool() == 0x0) goto loc_1005913a5;

loc_100591362:
    rbx = [[r15 navigationController] retain];
    r12 = r12 | (rbx != 0x0 ? 0x1 : 0x0);
    if ((r12 != 0x0) || ([r15 isSubViewMode] != 0x0)) goto loc_10059139c;

loc_100591578:
    if ([r15 isTagViewReady] != 0x0) goto loc_1005913a5;

loc_100591590:
    objc_initWeak(&var_190, var_188);
    *(&var_200 + 0xffffffffffffffc8) = __NSConcreteStackBlock;
    *(&var_200 + 0xffffffffffffffd0) = 0xc2000000;
    *(&var_200 + 0xffffffffffffffd8) = ___52-[JsApiHandler4PushWindow handler:context:callback:]_block_invoke;
    *(&var_200 + 0xffffffffffffffe0) = ___block_descriptor_tmp;
    objc_copyWeak(&var_200, &var_190);
    [var_128 retain];
    *(&var_200 + 0xffffffffffffffe8) = var_128;
    *(&var_200 + 0xfffffffffffffff0) = [var_160 retain];
    *(&var_200 + 0xfffffffffffffff8) = [var_140 retain];
    rax = objc_retainBlock(&var_238);
    r12 = [[r15 delayExecList] retain];
    rbx = objc_retainBlock(rax);
    rsi = @selector(addObject:);
    rdx = rbx;
    _objc_msgSend(r12, rsi);
    [rbx release];
    [r12 release];
    [rax release];
    [var_208 release];
    [var_210 release];
    [var_218 release];
    objc_destroyWeak(&var_200);
    objc_destroyWeak(&var_190);
    r15 = @"";
    goto loc_100591506;

loc_1005913a5:
    r12 = [(r13)(@class(NSNumber), @selector(numberWithBool:), (r13)(r15, @selector(isSubViewMode)) & 0xff) retain];
    rax = (r13)(r15, @selector(parentViewController));
    rax = [rax retain];
    r14 = r13;
    r13 = [(r13)(@class(NSNumber), @selector(numberWithInt:), rax != 0x0 ? 0x1 : 0x0) retain];
    rcx = r12;
    r8 = r13;
    r15 = [(r14)(@class(NSString), @selector(stringWithFormat:), cfstring_____V, rcx, r8) retain];
    [@"" release];
    rdi = r13;
    r13 = r14;
    [rdi release];
    [rax release];
    [r12 release];
    goto loc_100591478;

loc_10059139c:
    [rbx release];
    goto loc_1005913a5;

loc_1005912fb:
    r15 = [_DTContextGet() retain];
    rbx = [[r15 navigationController] retain];
    [rbx release];
    rdi = r15;
    r15 = var_138;
    [rdi release];
    if (rbx == 0x0) goto loc_1005916b2;
    goto loc_100591352;

loc_1005916b2:
    r15 = cfstring_____V;
    goto loc_100590898;

loc_100590905:
    r15 = cfstring_____V;
    goto loc_100590898;

loc_1005907eb:
    var_130 = r14;
    r14 = [[r15 presentedViewController] retain];
    [r14 release];
    [rbx release];
    r15 = var_138;
    if (r14 == 0x0) goto loc_10059016e;
    goto loc_100590833;

loc_1005902fd:
    [rbx release];
    [@"" retain];
    if (r14 != 0x0) goto loc_100590840;

loc_10059031c:
    r12 = 0x0;
    goto loc_1005908b6;

loc_10058f5f7:
    var_158 = rbx;
    var_70 = @"error";
    r15 = [@(0x2) retain];
    var_68 = r15;
    rbx = [[NSDictionary dictionaryWithObjects:&var_68 forKeys:&var_70 count:0x1] retain];
    (*(r12 + 0x10))(r12, rbx);
    [rbx release];
    rdi = r15;
    r15 = var_128;
    [rdi release];
    goto loc_10058f67e;

loc_10058f595:
    _ErrorCallback();
    goto loc_10058f5a2;

loc_10058f5a2:
    r14 = var_180;
    goto loc_10058f5a9;

loc_10058f513:
    var_60 = @"error";
    r15 = [@(0xb) retain];
    var_58 = r15;
    rbx = [[NSDictionary dictionaryWithObjects:&var_58 forKeys:&var_60 count:0x1] retain];
    (*(r12 + 0x10))(r12, rbx);
    [rbx release];
    rdi = r15;
    r15 = var_128;
    [rdi release];
    goto loc_10058f5a2;

loc_10058f265:
    r14 = [[r14 scheme] retain];
    rdx = @"https";
    var_158 = [r14 hasPrefix:rdx];
    [r14 release];
    [r15 release];
    [rbx release];
    r12 = var_140;
    r15 = var_128;
    if (var_158 != 0x0) {
            rdx = r15;
            [H5LaunchParamChecker checkURLParmaWithData:rdx];
    }
    goto loc_10058f2da;

loc_10058f253:
    [rbx release];
    r12 = var_140;
    goto loc_10058f2c3;
}

来了一个长方法,

代码在第一个createScene:preRenderParams:kickOut:isHit:的地方

hook一下JsApiHandler4PushWindow handler:context:callback:

可以看到

[(r13)(var_-352, @selector(currentSession), rdx, rcx) retain];

var_-336 = [(r13)(rbx, @selector(createScene:preRenderParams:kickOut:isHit:), var_-440, r12, @"first", &var_-400) retain];

是var_-352调用的currentSession方法 传入 rdx, rcx获取创建的session

rbx = [arg3 retain];   var_-352 = rbx;  v352就是handler:context:callback:的context:的值

疑问: rdx, rcx做啥的?

不对

var_-440才是要找的

var_-240 = @"kNBSceneOptionsParam";

这地方赋值(r13)(r12, @selector(setExpandParams:), rbx, &var_F0, 0x1);

rbx = [_H5DictMerge() retain];

int _H5DictMerge() {
    rbx = [rdi retain];
    var_C8 = [rsi retain];
    var_D8 = rbx;
    if (rbx != 0x0) {
            rax = [rbx mutableCopy];
    }
    else {
            rax = [NSMutableDictionary dictionary];
            rax = [rax retain];
    }
    var_C0 = rax;
    *(int128_t *)(&var_130 + 0x30) = intrinsic_movaps(*(int128_t *)(&var_130 + 0x30), 0x0);
    *(int128_t *)(&var_130 + 0x20) = intrinsic_movaps(*(int128_t *)(&var_130 + 0x20), 0x0);
    *(int128_t *)(&var_130 + 0x10) = intrinsic_movaps(*(int128_t *)(&var_130 + 0x10), 0x0);
    var_130 = intrinsic_movaps(var_130, 0x0);
    rax = [var_C8 allKeys];
    rax = [rax retain];
    var_B8 = rax;
    rax = [rax countByEnumeratingWithState:&var_130 objects:&var_B0 count:0x10];
    var_D0 = rax;
    if (rax != 0x0) {
            var_E0 = **(&var_130 + 0x10);
            do {
                    r13 = 0x0;
                    do {
                            if (*var_120 != var_E0) {
                                    objc_enumerationMutation(var_B8);
                            }
                            rbx = [[var_C8 objectForKeyedSubscript:*(var_128 + r13 * 0x8)] retain];
                            [var_C0 setObject:rbx forKeyedSubscript:*(var_128 + r13 * 0x8)];
                            [rbx release];
                            r13 = r13 + 0x1;
                    } while (r13 < var_D0);
                    rax = [var_B8 countByEnumeratingWithState:&var_130 objects:&var_B0 count:0x10];
                    var_D0 = rax;
            } while (rax != 0x0);
    }
    [var_B8 release];
    r14 = [var_C0 copy];
    [var_C0 release];
    [var_C8 release];
    [var_D8 release];
    if (*___stack_chk_guard == *___stack_chk_guard) {
            rax = [r14 autorelease];
    }
    else {
            rax = __stack_chk_fail();
    }
    return rax;
}

这是一个c方法,使用了rdi rsi,

  r12 = (r13)((r13)(@class(PSDSceneParam), @selector(alloc)), @selector(init));
    rbx = [_NBServiceConfigurationGet() retain];
    rdx = (r13)(rbx, @selector(viewControllerClass));
    (r13)(r12, @selector(setViewControllerCls:), rdx);
    [rbx release];
    rcx = objc_cls_ref_H5WebView;
    if (r15 != 0x0) {
            rcx = objc_cls_ref_H5WKWebView;
    }
    (r13)(r12, @selector(setContentViewCls:), (r13)(*rcx, @selector(class), rdx, rcx, 0x0), rcx, 0x0);
    rbx = [(r13)(r14, @selector(url), rdx, rcx, 0x0) retain];
    (r13)(r12, @selector(setUrl:), rbx, rcx, 0x0);
    [rbx release];
    var_F0 = @"kNBSceneOptionsParam";
    var_E8 = r14;
    r14 = [(r13)(@class(NSDictionary), @selector(dictionaryWithObjects:forKeys:count:), &var_E8, &var_F0, 0x1) retain];
    rbx = [_H5DictMerge() retain];
    var_1B8 = r12;
    (r13)(r12, @selector(setExpandParams:), rbx, &var_F0, 0x1);
  

rbx = [_H5DictMerge(r14, var_-328) retain];这里用到了r14。

PSDSceneParam 设置参数用到了var_E8 = r14;

然后 rbx = [rbx initWithOptions:r15 overrides:rcx];

void * -[H5Options initWithOptions:overrides:](void * self, void * _cmd, void * arg2, void * arg3) {
    r15 = [arg2 retain];
    rbx = [arg3 retain];
    var_D0 = self;
    *(&var_D0 + 0x8) = _OBJC_CLASS_$_H5Options;
    r12 = [[&var_D0 super] initWithOptions:r15 overrides:rbx];
    if (r12 != 0x0) {
            var_58 = [_objc_msgSend(r12, @selector(normalize:)) retain];
            [rbx release];
            rax = _getMappingDict();
            rax = [rax retain];
            var_C0 = __NSConcreteStackBlock;
            *(&var_C0 + 0x8) = 0xc2000000;
            *(&var_C0 + 0x10) = ___39-[H5Options initWithOptions:overrides:]_block_invoke;
            r14 = rax;
            *(&var_C0 + 0x18) = ___block_descriptor_tmp.1030;
            var_80 = r12;
            rax = [r12 retain];
            var_50 = rax;
            *(&var_C0 + 0x20) = rax;
            r12 = [var_58 retain];
            *(&var_C0 + 0x28) = r12;
            var_88 = r15;
            rax = [r15 retain];
            var_68 = rax;
            *(&var_C0 + 0x30) = rax;
            var_70 = r14;
            [r14 enumerateKeysAndObjectsUsingBlock:&var_C0];
            r14 = [_getPramField(@"kIsAutoSetNavBarStyle") retain];
            var_58 = r12;
            rbx = [[r12 objectForKeyedSubscript:r14] retain];
            [var_50 setIsAutoSetNavBarStyle:_GetBool() & 0xff];
            [rbx release];
            [r14 release];
            rax = _getPramField(@"kUrl");
            rax = [rax retain];
            var_60 = rax;
            rax = [r12 objectForKeyedSubscript:rax];
            rax = [rax retain];
            r15 = [_GetString(rax, 0x0) retain];
            r13 = [_TrimTailingWhiteSpace() retain];
            r12 = [[var_68 url] retain];
            r14 = [_GetString(r13, r12) retain];
            [var_50 setUrl:r14];
            [r14 release];
            [r12 release];
            [r13 release];
            [r15 release];
            [rax release];
            [var_60 release];
            rax = _getPramField(@"kBackBehavior");
            rax = [rax retain];
            var_60 = rax;
            r12 = [[var_58 objectForKeyedSubscript:rax] retain];
            r14 = var_68;
            r15 = [[r14 backBehavior] retain];
            rcx = r15;
            if (r15 == 0x0) {
                    rcx = @"pop";
            }
            var_48 = rcx;
            *(int128_t *)(&var_48 + 0x8) = intrinsic_movdqu(*(int128_t *)(&var_48 + 0x8), intrinsic_punpcklqdq(zero_extend_64(@"pop"), zero_extend_64(@"back")));
            r13 = [[NSArray arrayWithObjects:&var_48 count:0x3] retain];
            rbx = [_SelectString() retain];
            [var_50 setBackBehavior:rbx];
            [rbx release];
            rdi = r13;
            r13 = r14;
            [rdi release];
            [r15 release];
            [r12 release];
            [var_60 release];
            r14 = [_getPramField(@"kShowToolBar") retain];
            r12 = [[var_58 objectForKeyedSubscript:r14] retain];
            COND = [r13 transparent] != 0x0;
            rax = 0x0;
            if (!COND) {
                    rax = [r13 showToolBar];
            }
            r15 = r13;
            [var_50 setShowToolBar:_GetBool() & 0xff];
            rdi = r12;
            r12 = var_50;
            [rdi release];
            [r14 release];
            [r12 setShowTitleBar:0x1];
            rax = _getPramField(@"kShowProgress");
            rax = [rax retain];
            var_60 = rax;
            r14 = [[var_58 objectForKeyedSubscript:rax] retain];
            if ([r15 transparent] != 0x0) {
                    r15 = [[r12 appId] retain];
                    rax = _H5IsH5App();
                    rax = rax ^ 0x1;
                    r13 = 0x1;
            }
            else {
                    rax = [r15 showProgress];
                    r13 = 0x0;
            }
            [r12 setShowProgress:_GetBool() & 0xff];
            if (r13 != 0x0) {
                    [r15 release];
            }
            [r14 release];
            [var_60 release];
            r12 = [_getPramField(@"kGestureBack") retain];
            rbx = [[var_58 objectForKeyedSubscript:r12] retain];
            r13 = var_68;
            rcx = [r13 transparent];
            rax = 0x1;
            if (rcx == 0x0) {
                    rax = [r13 gestureBack];
            }
            [var_50 setGestureBack:_GetBool() & 0xff];
            [rbx release];
            [r12 release];
            r14 = [_getPramField(@"kReadTitle") retain];
            rbx = [[var_58 objectForKeyedSubscript:r14] retain];
            [var_50 setReadTitle:_GetBool() & 0xff];
            [rbx release];
            [r14 release];
            r14 = [_getPramField(@"kDefaultTitle") retain];
            r15 = [[var_58 objectForKeyedSubscript:r14] retain];
            rbx = [_GetString(r15, r13->originDefaultTitle) retain];
            [var_50 setDefaultTitle:rbx];
            [rbx release];
            [r15 release];
            [r14 release];
            r14 = [_getPramField(@"kPreSSOLoginUrl") retain];
            r15 = [[var_58 objectForKeyedSubscript:r14] retain];
            r12 = [[r13 preSSOLoginUrl] retain];
            r13 = [_GetString(r15, r12) retain];
            rbx = [_TrimTailingWhiteSpace() retain];
            [var_50 setPreSSOLoginUrl:rbx];
            [rbx release];
            rdi = r13;
            r13 = var_58;
            [rdi release];
            [r12 release];
            [r15 release];
            [r14 release];
            r14 = [_getPramField(@"kAllowsBounceVertical") retain];
            rbx = [[r13 objectForKeyedSubscript:r14] retain];
            [r14 release];
            var_60 = rbx;
            if (rbx != 0x0) {
                    rdi = @"kAllowsBounceVertical";
            }
            else {
                    rdi = @"kCanPullDown";
            }
            r14 = [_getPramField(rdi) retain];
            r12 = [[r13 objectForKeyedSubscript:r14] retain];
            r13 = var_68;
            rcx = [r13 transparent];
            rax = 0x1;
            if (rcx == 0x0) {
                    rax = [r13 canPullDown];
            }
            [var_50 setCanPullDown:_GetBool() & 0xff];
            [r12 release];
            [r14 release];
            r14 = [_getPramField(@"kShowDomain") retain];
            rbx = [[var_58 objectForKeyedSubscript:r14] retain];
            rcx = [r13 transparent];
            rax = 0x1;
            if (rcx == 0x0) {
                    rax = [r13 showDomain];
            }
            [var_50 setShowDomain:_GetBool() & 0xff];
            [rbx release];
            [r14 release];
            rbx = [_getPramField(@"kBackgroundColor") retain];
            rax = [var_58 objectForKeyedSubscript:rdx];
            rax = [rax retain];
            *(int8_t *)&var_50->hasBgColor = rax != 0x0 ? 0x1 : 0x0;
            [rax release];
            [rbx release];
            r13 = var_68;
            rbx = [var_50 transparent];
            r14 = [_getPramField(@"kBackgroundColor") retain];
            r12 = [[var_58 objectForKeyedSubscript:r14] retain];
            rax = *(int8_t *)&r13->hasBgColor;
            if (rbx != 0x0) {
                    COND = rax == 0x0;
                    rax = 0xb3000000;
                    if (!COND) {
                            rax = [r13 backgroundColor];
                    }
                    rbx = var_50;
                    if (r12 != 0x0) {
                            rax = [r12 longLongValue];
                    }
            }
            else {
                    if (rax != 0x0) {
                            rax = [r13 backgroundColor];
                    }
                    else {
                            rax = 0xffffffff;
                    }
                    rbx = var_50;
                    if (r12 != 0x0) {
                            rax = [r12 longLongValue];
                    }
            }
            [rbx setBackgroundColor:rax];
            [r12 release];
            [r14 release];
            [rbx setShowThirdDisclaimerWithDic:var_58 defaultVal:[r13 showThirdDisclaimer] & 0xff];
            rax = [r13 shareTokenParams];
            r15 = r13;
            r13 = rbx;
            rbx = [rax retain];
            [r13 shareTokenParamsWithDic:var_58 defaultParams:rbx];
            [rbx release];
            [r13 resetPartialProperties4Transparent];
            rdx = var_58;
            [r13 changeTitleImage:rdx override:0x0];
            r14 = [[r15 viewControllerProxy] retain];
            rbx = [[r14 viewController] retain];
            rsi = @selector(isApplet);
            r15 = _objc_msgSend(rbx, rsi);
            [rbx release];
            [r14 release];
            r12 = var_80;
            if (r15 != 0x0) {
                    var_108 = __NSConcreteStackBlock;
                    *(&var_108 + 0x8) = 0xc2000000;
                    *(&var_108 + 0x10) = ___39-[H5Options initWithOptions:overrides:]_block_invoke.1067;
                    *(&var_108 + 0x18) = ___block_descriptor_tmp.1072;
                    *(&var_108 + 0x20) = [var_68 retain];
                    *(&var_108 + 0x28) = [var_58 retain];
                    *(&var_108 + 0x30) = [var_50 retain];
                    rsi = @selector(enumerateKeysAndObjectsUsingBlock:);
                    rdx = &var_108;
                    _objc_msgSend(var_70, rsi);
                    [*(&var_108 + 0x30) release];
                    [*(&var_108 + 0x28) release];
                    [*(&var_108 + 0x20) release];
            }
            [var_60 release];
            [var_90 release];
            [var_98 release];
            [var_A0 release];
            [var_70 release];
            r15 = var_88;
            rbx = var_58;
    }
    [rbx release];
    [r15 release];
    if (*___stack_chk_guard == *___stack_chk_guard) {
            rax = r12;
    }
    else {
         rax = __stack_chk_fail();
    }
    return rax;
}

上边这个方法里的下边四行代码就是                    

            r14 = [_getPramField(@"kDefaultTitle") retain];
            r15 = [[var_58 objectForKeyedSubscript:r14] retain];
            rbx = [_GetString(r15, r13->originDefaultTitle) retain];
            [var_50 setDefaultTitle:rbx];

(lldb) po getPramField(@"kDefaultTitle")

defaultTitle

然后var_58是包含默认标题的地方

    r15 = [arg2 retain];

    rbx = [arg3 retain];

    var_D0 = self;

    r12 = [[&var_D0 super] initWithOptions:r15 overrides:rbx];

var_58 = [_objc_msgSend(r12, @selector(normalize:)) retain];

然后-[NBOptions initWithOptions:overrides:]代码类似

void * -[NBOptions nbNormalize:](void * self, void * _cmd, void * arg2) {
    r13 = [arg2 retain];
    if (*_nbNormalize:.shortMap == 0x0) {
            var_170 = intrinsic_movdqa(var_170, intrinsic_punpcklqdq(zero_extend_64(@"u"), zero_extend_64(@"dt")));
            var_D0 = intrinsic_movdqa(var_D0, intrinsic_punpcklqdq(zero_extend_64(@"url"), zero_extend_64(@"defaultTitle")));
            *(int128_t *)(&var_170 + 0x10) = intrinsic_movdqa(*(int128_t *)(&var_170 + 0x10), intrinsic_punpcklqdq(zero_extend_64(@"ds"), zero_extend_64(@"st")));
            *(int128_t *)(&var_D0 + 0x10) = intrinsic_movdqa(*(int128_t *)(&var_D0 + 0x10), intrinsic_punpcklqdq(zero_extend_64(@"defaultSubtitle"), zero_extend_64(@"showTitleBar")));
            *(int128_t *)(&var_170 + 0x20) = intrinsic_movdqa(*(int128_t *)(&var_170 + 0x20), intrinsic_punpcklqdq(zero_extend_64(@"sl"), zero_extend_64(@"cb")));
            *(int128_t *)(&var_D0 + 0x20) = intrinsic_movdqa(*(int128_t *)(&var_D0 + 0x20), intrinsic_punpcklqdq(zero_extend_64(@"showLoading"), zero_extend_64(@"closeButtonText")));
            *(int128_t *)(&var_170 + 0x30) = intrinsic_movdqa(*(int128_t *)(&var_170 + 0x30), intrinsic_punpcklqdq(zero_extend_64(@"rt"), zero_extend_64(@"bz")));
            *(int128_t *)(&var_D0 + 0x30) = intrinsic_movdqa(*(int128_t *)(&var_D0 + 0x30), intrinsic_punpcklqdq(zero_extend_64(@"readTitle"), zero_extend_64(@"bizScenario")));
            *(int128_t *)(&var_170 + 0x40) = intrinsic_movdqa(*(int128_t *)(&var_170 + 0x40), intrinsic_punpcklqdq(zero_extend_64(@"bb"), zero_extend_64(@"pr")));
            *(int128_t *)(&var_D0 + 0x40) = intrinsic_movdqa(*(int128_t *)(&var_D0 + 0x40), intrinsic_punpcklqdq(zero_extend_64(@"backBehavior"), zero_extend_64(@"pullRefresh")));
            *(int128_t *)(&var_170 + 0x50) = intrinsic_movdqa(*(int128_t *)(&var_170 + 0x50), intrinsic_punpcklqdq(zero_extend_64(@"tm"), zero_extend_64(@"sp")));
            *(int128_t *)(&var_D0 + 0x50) = intrinsic_movdqa(*(int128_t *)(&var_D0 + 0x50), intrinsic_punpcklqdq(zero_extend_64(@"toolbarMenu"), zero_extend_64(@"showProgress")));
            *(int128_t *)(&var_170 + 0x60) = intrinsic_movdqa(*(int128_t *)(&var_170 + 0x60), intrinsic_punpcklqdq(zero_extend_64(@"bc"), zero_extend_64(@"gb")));
            *(int128_t *)(&var_D0 + 0x60) = intrinsic_movdqa(*(int128_t *)(&var_D0 + 0x60), intrinsic_punpcklqdq(zero_extend_64(@"backgroundColor"), zero_extend_64(@"gestureBack")));
            *(int128_t *)(&var_170 + 0x70) = intrinsic_movdqa(*(int128_t *)(&var_170 + 0x70), intrinsic_punpcklqdq(zero_extend_64(@"pd"), zero_extend_64(@"so")));
            *(int128_t *)(&var_D0 + 0x70) = intrinsic_movdqa(*(int128_t *)(&var_D0 + 0x70), intrinsic_punpcklqdq(zero_extend_64(@"canPullDown"), zero_extend_64(@"showOptionMenu")));
            *(int128_t *)(&var_170 + 0x80) = intrinsic_movdqa(*(int128_t *)(&var_170 + 0x80), intrinsic_punpcklqdq(zero_extend_64(@"tl"), zero_extend_64(@"sd")));
            xmm0 = zero_extend_64(@"showDomain");
            *(int128_t *)(&var_D0 + 0x80) = intrinsic_movdqa(*(int128_t *)(&var_D0 + 0x80), intrinsic_punpcklqdq(zero_extend_64(@"showTitleLoading"), xmm0));
            *(&var_170 + 0x90) = @"ss";
            *(&var_D0 + 0x90) = @"showStatusBar";
            rax = [NSDictionary dictionaryWithObjects:&var_D0 forKeys:&var_170 count:0x13];
            rax = [rax retain];
            rdi = *_nbNormalize:.shortMap;
            *_nbNormalize:.shortMap = rax;
            [rdi release];
    }
    rax = [r13 mutableCopy];
    xmm0 = intrinsic_pxor(xmm0, xmm0);
    *(int128_t *)(&var_270 + 0x30) = intrinsic_movdqa(*(int128_t *)(&var_270 + 0x30), xmm0);
    *(int128_t *)(&var_270 + 0x20) = intrinsic_movdqa(*(int128_t *)(&var_270 + 0x20), xmm0);
    *(int128_t *)(&var_270 + 0x10) = intrinsic_movdqa(*(int128_t *)(&var_270 + 0x10), xmm0);
    var_200 = rax;
    var_270 = intrinsic_movdqa(var_270, xmm0);
    rax = [r13 allKeys];
    rax = [rax retain];
    var_1F8 = rax;
    rax = [rax countByEnumeratingWithState:&var_270 objects:&var_1F0 count:0x10];
    var_210 = rax;
    if (rax != 0x0) {
            var_220 = **(&var_270 + 0x10);
            var_228 = r13;
            do {
                    rbx = @selector(objectForKeyedSubscript:);
                    r14 = 0x0;
                    var_230 = rbx;
                    do {
                            if (*var_260 != var_220) {
                                    objc_enumerationMutation(var_1F8);
                            }
                            r15 = *(var_268 + r14 * 0x8);
                            var_218 = [_objc_msgSend(r13, rbx, r15) retain];
                            r13 = [_objc_msgSend(*_nbNormalize:.shortMap, rbx, r15) retain];
                            if (r13 != 0x0) {
                                    rbx = [_objc_msgSend(*_nbNormalize:.shortMap, rbx, r15) retain];
                                    rsi = @selector(setObject:forKeyedSubscript:);
                                    r15 = var_218;
                                    rdx = r15;
                                    rcx = rbx;
                                    _objc_msgSend(var_200, rsi, rdx, rcx);
                                    [rbx release];
                            }
                            else {
                                    rsi = @selector(setObject:forKeyedSubscript:);
                                    rdx = var_218;
                                    rcx = r15;
                                    r15 = rdx;
                                    _objc_msgSend(var_200, rsi, rdx, rcx);
                            }
                            [r13 release];
                            [r15 release];
                            r14 = r14 + 0x1;
                            r13 = var_228;
                            rbx = var_230;
                    } while (r14 < var_210);
                    rax = [var_1F8 countByEnumeratingWithState:&var_270 objects:&var_1F0 count:0x10];
                    var_210 = rax;
            } while (rax != 0x0);
    }
    [var_1F8 release];
    [r13 release];
    if (*___stack_chk_guard == *___stack_chk_guard) {
            rax = [var_200 autorelease];
    }
    else {
            rax = __stack_chk_fail();
    }
    return rax;
}

现在看df在h5option里面怎么赋值的,需要到nboption 的-[NBOptions initWithOptions:overrides:]方法

方法就是nbNormalize 字典的一些操作

接着看哪个方法调用的-[H5Options initWithOptions:overrides:]和overrides参数

就是-[JsApiHandler4PushWindow handler:context:callback:]的第一个参数

然后看-[PSDJsApi handler:context:callback:]的第一个参数r13

然后-[PSDJsBridge _doFlushMessageQueue:url:]调用-[PSDJsApi handler:context:callback:的时候怎么传参

- (void)_doFlushMessageQueue:(NSString *)arg1 urlS:(id)arg2;{
    
    //关闭log
    if([arg1 containsString:@"reportClickTime" ]
    /*||[arg1 containsString:@"\"handlerName\":\"reportData\"" ]同时还有其他的*/){
        return;
    }
    
    //打印h5与原生交互传过来的原始参数
    NSLog(@"\n\nh5与原生交互传过来的原始参数%@ \n\n%@ \n\n",arg1,arg2);
    
    [self _doFlushMessageQueue:arg1 urlS:arg2];
}

h5与原生交互传过来的原始参数[{"handlerName":"pushWindow","data":{"url":"file:///Users/yyy/Library/Developer/CoreSimulator/Devices/E4F2BC0A-1C6B-4A7B-9739-99DFD0A0010E/data/Containers/Bundle/Application/2F9DA388-1CD2-45DC-AC02-96F2C8C566A2/MPH5Demo_pod.app/H52Native.html","param":{"username":"xxxxx","password":"aaaaaa","defaultTitle":"这是默认标题","readTitle":false},"passData":{"username":"xxxxx","password":"aaaaaa"}},"callbackId":"pushWindow_15853160637460.4508789631987421"}] 

后面的简单看看

思路是执行js返回的。

发布了130 篇原创文章 · 获赞 15 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/qq_15509071/article/details/105120925