从阿里云官网获取代码示例,只看h5容器的: 示例链接
h5像下面这样,两个参数都不设置,代码默认读取网页的title。
<button class="jsapiButton" onclick="jsapi_call('pushWindow', {url:window.location.href,
param: {
username: 'xxxxx',
password: 'aaaaaa',
<!-- readTitle: false,-->
<!-- defaultTitle: '你'-->
},
passData: {
username: 'xxxxx',
password: 'aaaaaa',
}
})">pushWindow 自定义参数</button>
在 MPH5Demo_pod`-[NBNavigationTitleView setMainTitle:]: 处设置断点
可以看到初始化h5页面和页面加载完成后各调用一次
第一次明显的create和init操作。
先从简单的看,看第二次赋值. 把模拟器app直接拖进hopper
-[UIWebView(NBLifecycle) webViewDidFinishLoad:]
void -[UIWebView webViewDidFinishLoad:](void * self, void * _cmd, void * arg2) {
r13 = self;
rbx = [arg2 retain];
if ([r13 shouldSkipHandleLoad] != 0x0) {
[r13 setShouldSkipHandleLoad:0x0];
}
else {
var_38 = rbx;
rbx = [[r13 webPageProfile] retain];
rdx = 0x2;
r15 = [rbx setState:rdx];
[rbx release];
if (r15 != 0x0) {
r15 = [[NSDate date] retain];
rbx = [[r13 webPageProfile] retain];
[rbx setCompleteDate:r15];
[rbx release];
[r15 release];
r12 = [[r13 webPageProfile] retain];
r15 = [[r12 completeDate] retain];
rbx = [[r13 webPageProfile] retain];
[rbx setDidFinishedLoadDate:r15];
[rbx release];
[r15 release];
[r12 release];
objc_initWeak(&var_30, r13);
*(&var_40 + 0xffffffffffffffe0) = __NSConcreteStackBlock;
*(&var_40 + 0xffffffffffffffe8) = 0xc2000000;
*(&var_40 + 0xfffffffffffffff0) = ___47-[UIWebView(NBLifecycle) webViewDidFinishLoad:]_block_invoke;
*(&var_40 + 0xfffffffffffffff8) = ___block_descriptor_tmp.288;
objc_copyWeak(&var_40, &var_30);
rcx = &var_60;
[r13 evaluateJavaScript:@"document.title" completionHandler:rcx];
r12 = [[r13 request] retain];
r15 = [[r13 webPageProfile] retain];
[r15 setFinalRequest:r12];
[r15 release];
[r12 release];
r12 = [[r13 request] retain];
rbx = [[r13 webPageProfile] retain];
[rbx setRequest:r12];
[rbx release];
[r12 release];
r12 = [[r13 pageDelegate] retain];
rbx = [[r13 webPageProfile] retain];
rdx = rbx;
[r12 contentViewPageComplete:rdx];
[rbx release];
[r12 release];
objc_destroyWeak(&var_40);
objc_destroyWeak(&var_30);
}
rbx = [[r13 assignedDelegate] retain];
rdx = @selector(webViewDidFinishLoad:);
r15 = _objc_msgSend;
r14 = [rbx respondsToSelector:rdx, rcx];
[rbx release];
rbx = var_38;
if (r14 != 0x0) {
r14 = [(r15)(r13, @selector(assignedDelegate), rdx) retain];
(r15)(r14, @selector(webViewDidFinishLoad:), rbx);
[r14 release];
}
}
[rbx release];
return;
}
看到里面多次调用了 -[UIWebView webPageProfile] 它是后加的属性@"kWebView_WebPageProfile"
-[UIWebView(NBLifecycle) webViewDidFinishLoad:]打断点
po [self webPageProfile]
<NBLogPagePerformance: 0x7f9c9b499820>
webViewDidFinishLoad方法主要:
1.设置了一些判断标记,
2.获取网页title,
3.调用代理(assignedDelegate)的webViewDidFinishLoad:方法。
然后到-[PSDJsBridge webViewDidFinishLoad:]
void -[PSDJsBridge webViewDidFinishLoad:](void * self, void * _cmd, void * arg2) {
r13 = self;
r14 = [arg2 retain];
rbx = [[r13 webViewDelegate] retain];
r15 = [rbx respondsToSelector:@selector(webViewDidFinishLoad:)];
[rbx release];
if (r15 != 0x0) {
rbx = [[r13 webViewDelegate] retain];
[rbx webViewDidFinishLoad:r14];
[rbx release];
}
[r13 loadFinished];
[r14 release];
return;
}
继续向上调用webViewDelegate的webViewDidFinishLoad:
void -[PSDView webViewDidFinishLoad:](void * self, void * _cmd, void * arg2) {
var_38 = [arg2 retain];
[self injectJS];
rbx = [[self page] retain];
r12 = [[PSDPageEvent loadCompleteEvent] retain];
[rbx dispatchEvent:r12];
[r12 release];
[rbx release];
r15 = [[arg2 request] retain];
[var_38 release];
rbx = [[PSDNavigationEvent completeEvent:r15] retain];
[self dispatchEvent:rbx];
[rbx release];
[r15 release];
return;
}
1.js注入
2.(lldb) po [self page]
<PSDPage: 0x6000032ba4c0>
继承于PSDKernel,核心事件分发-[PSDKernel dispatchEvent:]
bool -[PSDKernel dispatchEvent:](void * self, void * _cmd, void * arg2) {
rbx = self;
r12 = [arg2 retain];
if (r12 == 0x0) goto loc_1006a454b;
loc_1006a4256:
var_E0 = r12;
[r12 setTarget:rbx];
r14 = [[NSMutableArray array] retain];
rax = [rbx retain];
var_C0 = rax;
if (rax != 0x0) {
rbx = var_C0;
do {
[r14 insertObject:rbx atIndex:0x0];
r13 = [[rbx parentEventTarget] retain];
[rbx release];
rbx = r13;
} while (r13 != 0x0);
}
r12 = var_E0;
[r12 setEventPhase:0x0];
rbx = [[PSDContext contextWithEvent:r12 eventTargetList:r14] retain];
[r12 setContext:rbx];
[rbx release];
*(int128_t *)(&var_140 + 0x30) = intrinsic_movaps(*(int128_t *)(&var_140 + 0x30), 0x0);
*(int128_t *)(&var_140 + 0x20) = intrinsic_movaps(*(int128_t *)(&var_140 + 0x20), 0x0);
*(int128_t *)(&var_140 + 0x10) = intrinsic_movaps(*(int128_t *)(&var_140 + 0x10), 0x0);
var_140 = intrinsic_movaps(var_140, 0x0);
rax = [r14 retain];
var_B8 = rax;
rax = [rax countByEnumeratingWithState:&var_140 objects:&var_B0 count:0x10];
var_E8 = rax;
rbx = _objc_msgSend;
r15 = var_C0;
if (rax == 0x0) goto loc_1006a4500;
loc_1006a43b2:
var_100 = **(&var_140 + 0x10);
goto loc_1006a43c7;
loc_1006a43c7:
r14 = 0x0;
goto loc_1006a4410;
loc_1006a4410:
if (*var_130 != var_100) {
objc_enumerationMutation(var_B8);
}
r13 = *(var_138 + r14 * 0x8);
rdx = r13;
(rbx)(r12, @selector(setCurrentTarget:), rdx);
r12 = [(rbx)(r13, @selector(captureEventListenersDict)) retain];
r15 = rbx;
rbx = (rbx)(r12, @selector(count));
rdi = r12;
r12 = var_E0;
[rdi release];
COND = rbx == 0x0;
rbx = r15;
r15 = var_C0;
if (COND) goto loc_1006a44b0;
loc_1006a4491:
if ((rbx)(r12, @selector(isStoped), rdx) != 0x0) goto loc_1006a450f;
loc_1006a44a1:
(rbx)(r13, @selector(fireEvent:), r12);
goto loc_1006a44b0;
loc_1006a44b0:
if (r13 == r15) goto loc_1006a450f;
loc_1006a44b5:
r14 = r14 + 0x1;
if (r14 < var_E8) goto loc_1006a4410;
loc_1006a44cc:
rax = (rbx)(var_B8, @selector(countByEnumeratingWithState:objects:count:), &var_140, &var_B0, 0x10);
var_E8 = rax;
if (rax != 0x0) goto loc_1006a43c7;
loc_1006a4500:
[var_B8 release];
goto loc_1006a4523;
loc_1006a4523:
rax = [r12 currentTarget];
rax = [rax retain];
if (rax == r15) goto loc_1006a454f;
loc_1006a4540:
[rax release];
goto loc_1006a4571;
loc_1006a4571:
rbx = 0x0;
goto loc_1006a4573;
loc_1006a4573:
[var_B8 release];
goto loc_1006a4580;
loc_1006a4580:
[r12 release];
if (*___stack_chk_guard == *___stack_chk_guard) {
rax = rbx ^ 0x1;
}
else {
rax = __stack_chk_fail();
}
return rax;
loc_1006a454f:
r14 = rbx;
rbx = [r12 isStoped];
[r15 release];
if (rbx == 0x0) goto loc_1006a45b4;
goto loc_1006a4571;
loc_1006a45b4:
rbx = r14;
(rbx)(r12, @selector(setEventPhase:), 0x1);
(rbx)(r15, @selector(fireEvent:), r12);
if ((rbx)(r12, @selector(bubbles)) == 0x0) goto loc_1006a46fb;
loc_1006a45e7:
(rbx)(r12, @selector(setEventPhase:), 0x2);
rax = (rbx)(var_B8, @selector(count), 0x2);
rcx = rax;
rax = rax + 0xfffffffffffffffe;
if (rax < 0x0) goto loc_1006a46fb;
loc_1006a4611:
rcx = rcx - 0x1;
goto loc_1006a4645;
loc_1006a4645:
rcx = rcx - 0x1;
var_C0 = rcx;
r14 = [(rbx)(var_B8, @selector(objectAtIndexedSubscript:), rcx, rcx) retain];
rdx = r14;
(rbx)(r12, @selector(setCurrentTarget:), rdx, rcx);
r12 = [(rbx)(r14, @selector(normalEventListenersDict)) retain];
r15 = (rbx)(r12, @selector(count));
rdi = r12;
r12 = var_E0;
[rdi release];
if (r15 == 0x0) goto loc_1006a46d3;
loc_1006a46b4:
if ((rbx)(r12, @selector(isStoped), rdx, rcx) != 0x0) goto loc_1006a46f2;
loc_1006a46c4:
(rbx)(r14, @selector(fireEvent:), r12);
goto loc_1006a46d3;
loc_1006a46d3:
[r14 release];
rcx = var_C0;
if (rcx > 0x0) goto loc_1006a4645;
loc_1006a46fb:
rbx = [r12 isCancelled];
goto loc_1006a4573;
loc_1006a46f2:
[r14 release];
goto loc_1006a46fb;
loc_1006a450f:
[var_B8 release];
goto loc_1006a4523;
loc_1006a454b:
rbx = 0x0;
goto loc_1006a4580;
}
r12是传入的参数
(lldb) register read r12
r12 = 0x0000600003dccc40
(lldb) po 0x0000600003dccc40
PSDNavigationEvent-navigation.complete
(lldb) po [0x0000600003dccc40 class]
PSDNavigationEvent
创建的事件[PSDContext contextWithEvent:r12 eventTargetList:r14]看看是什么
(lldb) register read r15
r15 = 0x000060000189c0f0
(lldb) po 0x000060000189c0f0
<__NSArrayM 0x60000189c0f0>(
<PSDService: 0x6000035aadf0>,
<PSDSession: 0x6000032b9200>,
<PSDScene: 0x6000032b9560>,
<PSDView: 0x600003ddb250>
)
后面-[PSDKernel fireEvent:]
void -[PSDKernel fireEvent:](void * self, void * _cmd, void * arg2) {
r14 = self;
rbx = [arg2 retain];
rax = [rbx eventPhase];
if ((rax == 0x2) || (rax == 0x1)) goto loc_1006a4757;
loc_1006a4749:
if (rax != 0x0) goto loc_1006a476a;
loc_1006a474e:
rsi = @selector(handleCaptureEvent:);
goto loc_1006a475e;
loc_1006a475e:
_objc_msgSend(r14, rsi);
goto loc_1006a476a;
loc_1006a476a:
[rbx release];
return;
loc_1006a4757:
rsi = @selector(handleNormalEvent:);
goto loc_1006a475e;
}
然后-[PSDKernel handleNormalEvent:]
void -[PSDKernel handleNormalEvent:](void * self, void * _cmd, void * arg2) {
r15 = [arg2 retain];
rbx = [[self normalEventListenersDict] retain];
[self handleEvent:r15 evenListenersDict:rbx];
[r15 release];
[rbx release];
return;
}
然后-[PSDKernel handleEvent:evenListenersDict:]
void -[PSDKernel handleEvent:evenListenersDict:](void * self, void * _cmd, void * arg2, void * arg3) {
var_248 = [arg2 retain];
r15 = [[arg3 retain] retain];
objc_sync_enter(r15);
r14 = [[r15 allKeys] retain];
objc_sync_exit(r15);
[r15 release];
*(int128_t *)(&var_3D0 + 0x30) = intrinsic_movaps(*(int128_t *)(&var_3D0 + 0x30), 0x0);
*(int128_t *)(&var_3D0 + 0x20) = intrinsic_movaps(*(int128_t *)(&var_3D0 + 0x20), 0x0);
*(int128_t *)(&var_3D0 + 0x10) = intrinsic_movaps(*(int128_t *)(&var_3D0 + 0x10), 0x0);
var_3D0 = intrinsic_movaps(var_3D0, 0x0);
rax = [r14 retain];
var_278 = rax;
rax = [rax countByEnumeratingWithState:&var_3D0 objects:&var_B0 count:0x10];
var_298 = rax;
if (rax == 0x0) goto loc_1006a398b;
loc_1006a3195:
var_2D0 = **(&var_3D0 + 0x10);
rbx = _objc_msgSend;
var_250 = r15;
goto loc_1006a31b8;
loc_1006a31b8:
r12 = 0x0;
goto loc_1006a322b;
loc_1006a322b:
if (*var_3C0 != var_2D0) {
objc_enumerationMutation(var_278);
}
r14 = *(var_3C8 + r12 * 0x8);
if ((rbx)(@"*.*", @selector(isEqualToString:), r14) == 0x0) goto loc_1006a344a;
loc_1006a3270:
var_258 = r12;
r15 = [r15 retain];
objc_sync_enter(r15);
r13 = rbx;
rbx = [(rbx)(r15, @selector(objectForKey:), r14) retain];
r14 = [(r13)(@class(NSArray), @selector(arrayWithArray:), rbx) retain];
[rbx release];
objc_sync_exit(r15);
[r15 release];
var_360 = intrinsic_movaps(var_360, 0x0);
var_370 = intrinsic_movaps(var_370, 0x0);
var_380 = intrinsic_movaps(var_380, 0x0);
var_390 = intrinsic_movaps(var_390, 0x0);
r15 = [r14 retain];
rax = (r13)(r15, @selector(countByEnumeratingWithState:objects:count:), &var_390, &var_130, 0x10);
var_240 = rax;
rbx = r13;
if (rax == 0x0) goto loc_1006a38f6;
loc_1006a3345:
var_270 = *var_380;
var_238 = r15;
goto loc_1006a335d;
loc_1006a335d:
r12 = 0x0;
goto loc_1006a3383;
loc_1006a3383:
if (*var_380 != var_270) {
objc_enumerationMutation(var_238);
}
r14 = *(var_388 + r12 * 0x8);
r13 = var_248;
if ((rbx)(r13, @selector(isStoped)) != 0x0) goto loc_1006a38ef;
loc_1006a33c4:
rbx = [(rbx)(r14, @selector(weakObjectValue)) retain];
[rbx handleEvent:r13];
rdi = rbx;
rbx = _objc_msgSend;
[rdi release];
r12 = r12 + 0x1;
if (r12 < var_240) goto loc_1006a3383;
loc_1006a340e:
rbx = _objc_msgSend;
r15 = var_238;
rax = [r15 countByEnumeratingWithState:&var_390 objects:&var_130 count:0x10];
var_240 = rax;
if (rax != 0x0) goto loc_1006a335d;
loc_1006a38f6:
[r15 release];
[r15 release];
r15 = var_250;
goto loc_1006a3940;
loc_1006a3940:
r12 = var_258;
goto loc_1006a3947;
loc_1006a3947:
r12 = r12 + 0x1;
if (r12 < var_298) goto loc_1006a322b;
loc_1006a3957:
rax = (rbx)(var_278, @selector(countByEnumeratingWithState:objects:count:), &var_3D0, &var_B0, 0x10);
var_298 = rax;
if (rax != 0x0) goto loc_1006a31b8;
loc_1006a398b:
[var_278 release];
[var_278 release];
[r15 release];
[var_248 release];
if (*___stack_chk_guard != *___stack_chk_guard) {
__stack_chk_fail();
}
return;
loc_1006a38ef:
r15 = var_238;
goto loc_1006a38f6;
loc_1006a344a:
if ((rbx)(r14, @selector(hasSuffix:), @".*") == 0x0) goto loc_1006a36c7;
loc_1006a3465:
var_258 = r12;
rdx = (rbx)(r14, @selector(length), @".*") + 0xfffffffffffffffe;
r13 = [(rbx)(r14, @selector(substringToIndex:), rdx) retain];
rbx = [(rbx)(var_248, @selector(eventType), rdx) retain];
rcx = 0x1;
rsi = @selector(rangeOfString:options:);
rdx = r13;
r15 = _objc_msgSend(rbx, rsi);
rdi = rbx;
rbx = _objc_msgSend;
[rdi release];
COND = r15 != 0x0;
r15 = var_250;
if (COND) goto loc_1006a393a;
loc_1006a34ed:
var_2A8 = r13;
r15 = [r15 retain];
objc_sync_enter(r15);
rbx = [[r15 objectForKey:r14, 0x1] retain];
r14 = [[NSArray arrayWithArray:rbx, 0x1] retain];
[rbx release];
objc_sync_exit(r15);
[r15 release];
var_320 = intrinsic_movaps(var_320, 0x0);
var_330 = intrinsic_movaps(var_330, 0x0);
var_340 = intrinsic_movaps(var_340, 0x0);
var_350 = intrinsic_movaps(var_350, 0x0);
r15 = [r14 retain];
rsi = @selector(countByEnumeratingWithState:objects:count:);
rdx = &var_350;
rcx = &var_1B0;
rax = _objc_msgSend(r15, rsi, rdx, rcx, 0x10);
var_240 = rax;
rbx = _objc_msgSend;
if (rax == 0x0) goto loc_1006a3919;
loc_1006a35c2:
var_270 = *var_340;
var_238 = r15;
goto loc_1006a35da;
loc_1006a35da:
r15 = 0x0;
goto loc_1006a3600;
loc_1006a3600:
rcx = var_270;
if (*var_340 != rcx) {
objc_enumerationMutation(var_238);
}
r14 = *(var_348 + r15 * 0x8);
r13 = var_248;
rsi = @selector(isStoped);
if ((rbx)(r13, rsi) != 0x0) goto loc_1006a3912;
loc_1006a3641:
rbx = [(rbx)(r14, @selector(weakObjectValue)) retain];
rdx = r13;
[rbx handleEvent:rdx];
rdi = rbx;
rbx = _objc_msgSend;
[rdi release];
r15 = r15 + 0x1;
if (r15 < var_240) goto loc_1006a3600;
loc_1006a368b:
rbx = _objc_msgSend;
r15 = var_238;
rsi = @selector(countByEnumeratingWithState:objects:count:);
rdx = &var_350;
rcx = &var_1B0;
rax = _objc_msgSend(r15, rsi, rdx, rcx, 0x10);
var_240 = rax;
if (rax != 0x0) goto loc_1006a35da;
loc_1006a3919:
[r15 release];
[r15 release];
r15 = var_250;
r13 = var_2A8;
goto loc_1006a393a;
loc_1006a393a:
[r13 release];
goto loc_1006a3940;
loc_1006a3912:
r15 = var_238;
goto loc_1006a3919;
loc_1006a36c7:
rbx = [(rbx)(var_248, @selector(eventType), @".*") retain];
r15 = [rbx isEqualToString:r14];
rdi = rbx;
rbx = _objc_msgSend;
[rdi release];
COND = r15 == 0x0;
r15 = var_250;
if (COND) goto loc_1006a3947;
loc_1006a3718:
var_258 = r12;
r15 = [r15 retain];
objc_sync_enter(r15);
rbx = [[r15 objectForKey:r14] retain];
r14 = [[NSArray arrayWithArray:rbx] retain];
[rbx release];
objc_sync_exit(r15);
[r15 release];
var_2E0 = intrinsic_movaps(var_2E0, 0x0);
var_2F0 = intrinsic_movaps(var_2F0, 0x0);
var_300 = intrinsic_movaps(var_300, 0x0);
var_310 = intrinsic_movaps(var_310, 0x0);
r15 = [r14 retain];
rax = [r15 countByEnumeratingWithState:&var_310 objects:&var_230 count:0x10];
var_240 = rax;
rbx = _objc_msgSend;
if (rax == 0x0) goto loc_1006a38f6;
loc_1006a37ed:
var_270 = *var_300;
var_238 = r15;
goto loc_1006a3805;
loc_1006a3805:
r12 = 0x0;
goto loc_1006a382b;
loc_1006a382b:
if (*var_300 != var_270) {
objc_enumerationMutation(var_238);
}
r14 = *(var_308 + r12 * 0x8);
r13 = var_248;
if ((rbx)(r13, @selector(isStoped)) != 0x0) goto loc_1006a38ef;
loc_1006a386c:
rbx = [(rbx)(r14, @selector(weakObjectValue)) retain];
[rbx handleEvent:r13];
rdi = rbx;
rbx = _objc_msgSend;
[rdi release];
r12 = r12 + 0x1;
if (r12 < var_240) goto loc_1006a382b;
loc_1006a38b6:
rbx = _objc_msgSend;
r15 = var_238;
rax = [r15 countByEnumeratingWithState:&var_310 objects:&var_230 count:0x10];
var_240 = rax;
if (rax != 0x0) goto loc_1006a3805;
}
跟了一些上个方法传入的参数:
NBNavigationTitleViewEvent-scene.titleView.title.set
PSDPageEvent-page.load.complete
PSDNavigationEvent-navigation.complete
PSDSceneEvent-scene.appear.after
PSDMonitorEvent-monitor.log.before
PSDInvocationEvent-invocation.start
PSDInvocationEvent-invocation.invoke
NBLogPagePerformanceEvent-performance.domReady
上面这段好像就[rbx handleEvent:r13];有点用,是调用目标插件的
void -[NBPlugin4NavigationTitleView handleEvent:](void * self, void * _cmd, void * arg2) {
r13 = self;
r12 = [arg2 retain];
var_80 = r13;
*(&var_80 + 0x8) = _OBJC_CLASS_$_NBPlugin4NavigationTitleView;
[[&var_80 super] handleEvent:r12];
rbx = [[r12 eventType] retain];
rdx = rbx;
r14 = [@"scene.titleView.create.before" isEqualToString:rdx];
[rbx release];
if (r14 != 0x0) {
var_38 = r12;
r14 = [[r12 context] retain];
rbx = [[r14 currentViewController] retain];
[r14 release];
var_40 = rbx;
rbx = [[rbx navigationController] retain];
r12 = _objc_msgSend;
var_30 = r13;
if (rbx != 0x0) {
r15 = [rbx retain];
}
else {
r14 = [_NBContextGet() retain];
r15 = [[r14 navigationController] retain];
[r14 release];
}
[rbx release];
rbx = [(r12)(r15, @selector(navigationBar)) retain];
r13 = var_38;
rax = (r12)(r13, @selector(isCancelled));
var_50 = r15;
var_48 = rbx;
if (rax != 0x0) {
r14 = r13;
r13 = [[r13 titleView] retain];
if (r13 != 0x0) {
rbx = [(r12)(r14, @selector(titleView)) retain];
r15 = (r12)(rbx, @selector(conformsToProtocol:), __objc_proto_NBNavigationTitleViewProtocol_protocol) ^ 0x1;
[rbx release];
}
else {
r15 = 0x0;
}
[r13 release];
rbx = [[r14 titleView] retain];
if (r15 != 0x0) {
rdx = __objc_proto_NBNavigationTitleViewProtocol_protocol;
r14 = [rbx conformsToProtocol:rdx];
[rbx release];
COND = r14 != 0x0;
r12 = _objc_msgSend;
r14 = var_30;
if (!COND) {
rdx = cfstring__;
rcx = "-[NBPlugin4NavigationTitleView handleEvent:]";
[[[NSString stringWithFormat:rdx] retain] release];
}
}
else {
r14 = var_30;
rdx = rbx;
[r14 setNavigationTitleView:rdx];
[rbx release];
r12 = _objc_msgSend;
}
}
else {
if (rbx != 0x0) {
[&var_70 bounds];
}
else {
var_60 = intrinsic_movaps(var_60, 0x0);
var_70 = intrinsic_movaps(var_70, 0x0);
}
rcx = var_60;
r14 = var_30;
rsp = (rsp - 0x20) + 0x20;
rbx = [(r12)(r14, @selector(createNavigationTitleView:), var_70, rcx) retain];
(r12)(r14, @selector(setNavigationTitleView:), rbx);
[rbx release];
rbx = [(r12)(r14, @selector(navigationTitleView), rbx) retain];
rdx = rbx;
(r12)(r13, @selector(setTitleView:), rdx);
[rbx release];
}
rbx = [(r12)(r14, @selector(navigationTitleView), rdx, rcx, 0x38) retain];
rdx = @selector(setDelegate:);
r15 = (r12)(rbx, @selector(respondsToSelector:), rdx, rcx, 0x38);
[rbx release];
if (r15 != 0x0) {
rbx = [[r14 navigationTitleView] retain];
rdx = r14;
[rbx setDelegate:rdx];
[rbx release];
}
r13 = var_38;
r14 = [[r13 titleView] retain];
rbx = [[var_40 navigationItem] retain];
[rbx setTitleView:r14];
[rbx release];
[r14 release];
[var_48 release];
[var_50 release];
[var_40 release];
}
else {
rbx = [[r12 eventType] retain];
rdx = rbx;
r14 = [@"scene.titleView.title.set" isEqualToString:rdx];
[rbx release];
if (r14 != 0x0) {
r13 = [[r13 navigationTitleView] retain];
r14 = [[r12 mainTitle] retain];
rbx = [[r12 subtitle] retain];
[r13 setMainTitle:r14 subtitle:rbx];
[rbx release];
[r14 release];
[r13 release];
r13 = r12;
}
else {
rbx = [[r12 eventType] retain];
rdx = rbx;
r14 = [@"page.load.start" isEqualToString:rdx];
[rbx release];
var_30 = r13;
if (r14 != 0x0) {
var_38 = r12;
rax = [r13 currentViewController];
rax = [rax retain];
var_40 = rax;
r12 = [[rax viewControllerProxy] retain];
rbx = [[r12 options] retain];
r13 = [rbx showTitleLoading];
[rbx release];
[r12 release];
if (r13 != 0x0) {
rbx = [[var_30 navigationTitleView] retain];
[rbx showTitleLoading];
[rbx release];
}
[var_40 release];
r13 = var_38;
}
else {
rbx = [[r12 eventType] retain];
rdx = rbx;
if ([@"page.load.complete" isEqualToString:rdx] != 0x0) {
[rbx release];
r13 = r12;
rbx = [[var_30 navigationTitleView] retain];
[rbx hideTitleLoading];
[rbx release];
}
else {
r14 = [[r12 eventType] retain];
rdx = r14;
r13 = [@"page.load.error" isEqualToString:rdx];
[r14 release];
[rbx release];
COND = r13 == 0x0;
r13 = r12;
if (!COND) {
rbx = [[var_30 navigationTitleView] retain];
[rbx hideTitleLoading];
[rbx release];
}
}
}
}
}
[r13 release];
return;
}
然后
void -[H5NavigationTitleView setMainTitle:subtitle:](void * self, void * _cmd, void * arg2, void * arg3) {
r15 = self;
r13 = [arg2 retain];
var_50 = r15;
*(&var_50 + 0x8) = _OBJC_CLASS_$_H5NavigationTitleView;
rax = [arg3 retain];
r14 = r13;
var_40 = rax;
rcx = rax;
[[&var_50 super] setMainTitle:r14 subtitle:rcx];
[r15 setTitleViewHidden:0x1];
rdx = r14;
r13 = [r15 canSetImageTitle:rdx];
if (r13 == 0x0) {
rbx = [[r15 mainTitleImageView] retain];
[rbx removeFromSuperview];
[rbx release];
[r15 setMainTitleImageView:0x0, rcx];
}
if ([r15 shouldUseAUSearch] == 0x0) {
[r15->_mainTitleSearchView removeFromSuperview];
r15->_mainTitleSearchView = 0x0;
[r15->_mainTitleSearchView release];
}
if ([r15 shouldUseAUSearch] == 0x0) goto loc_100563254;
loc_100563248:
rsi = @selector(createAUSearchTitleView);
goto loc_1005632fb;
loc_1005632fb:
_objc_msgSend(r15, rsi);
goto loc_100563304;
loc_100563304:
NSLog(@"H5NavigationTitleView setMainTitle-subtitle %@ %@ %@", r15, r14, var_40);
_APLogToFile();
[var_40 release];
[r14 release];
return;
loc_100563254:
if (r13 != 0x0) goto loc_100563304;
loc_10056325d:
[r15 setTitleViewHidden:0x0];
rax = [r15 currentViewController];
rax = [rax retain];
r13 = [[rax options] retain];
rbx = [[r13 segWidths] retain];
var_30 = [rbx count];
[rbx release];
[r13 release];
[rax release];
r14 = r14;
if (var_30 == 0x0) goto loc_100563304;
loc_1005632f4:
rsi = @selector(createSegmentControl);
goto loc_1005632fb;
}
MPH5Demo_pod`-[H5NavigationTitleView setMainTitle:subtitle:]:下断点
(lldb) register read r13
r13 = 0x0000600000f45530
(lldb) po 0x0000600000f45530
H5向Native通信
(lldb)
可以看到在上个方法中已经有MainTitle的值了
未完待续