这个过渡页是第一次打开小程序展示的,点击某个小程序前把手机的开发者->network link conditioner->enable & very bad network 就会在停在此页。
比如《支付宝运动》这个小程序
先看这个类的.h
可以看到它继承于DTViewController
点击左上角返回的方法- (void)back;
#import "DTViewController.h"
#import "APBaseLoadingViewDelegate.h"
@class DFLoadingPageInfo, NSDictionary, NSString, UILabel;
@interface DFLoadingPageRootController : DTViewController
{
_Bool _isLoading;
_Bool _isCancel;
_Bool _isStoping;
_Bool _isShowFinished;
_Bool _isPanGestureBack;
DFLoadingPageInfo *_loadingInfo;
double _lastLaunchTime;
NSDictionary *_launchInfo;
CDUnknownBlockType _completeBlock;
UILabel *_sloganLabel;
}
- (void).cxx_destruct;
- (void)autoExitLoadingPage;
- (void)back;
- (void)callBackViewDidLoad;
- (void)checkDisplayTime:(long long)arg1;
@property(copy, nonatomic) CDUnknownBlockType completeBlock; // @synthesize completeBlock=_completeBlock;
- (void)dealloc;
- (void)exitAnimated;
- (void)exitAnimatedForLoadingView;
- (_Bool)gestureRecognizerShouldBegin:(id)arg1;
@property(nonatomic) _Bool isCancel; // @synthesize isCancel=_isCancel;
@property(nonatomic) _Bool isLoading; // @synthesize isLoading=_isLoading;
@property(nonatomic) _Bool isPanGestureBack; // @synthesize isPanGestureBack=_isPanGestureBack;
@property(nonatomic) _Bool isShowFinished; // @synthesize isShowFinished=_isShowFinished;
@property(nonatomic) _Bool isStoping; // @synthesize isStoping=_isStoping;
@property(nonatomic) double lastLaunchTime; // @synthesize lastLaunchTime=_lastLaunchTime;
@property(retain, nonatomic) NSDictionary *launchInfo; // @synthesize launchInfo=_launchInfo;
@property(retain, nonatomic) DFLoadingPageInfo *loadingInfo; // @synthesize loadingInfo=_loadingInfo;
- (void)monitorViewControllerChanged;
@property(retain, nonatomic) UILabel *sloganLabel; // @synthesize sloganLabel=_sloganLabel;
- (void)startLoading;
- (void)stopLoading;
- (void)updateSlogan:(id)arg1;
- (void)viewDidAppear:(_Bool)arg1;
- (void)viewDidDisappear:(_Bool)arg1;
- (void)viewDidLoad;
- (void)viewWillAppear:(_Bool)arg1;
- (void)viewWillDisappear:(_Bool)arg1;
- (void)viewWillStopLoading:(CDUnknownBlockType)arg1;
// Remaining properties
@property(readonly, copy) NSString *debugDescription;
@property(readonly, copy) NSString *description;
@property(readonly) unsigned long long hash;
@property(readonly) Class superclass;
@end
然后看.m
先看back方法
void -[DFLoadingPageRootController back](void * self, void * _cmd) {
var_-32 = self;
*(&var_-32 + 0x8) = _OBJC_CLASS_$_DFLoadingPageRootController;
[[&var_-32 super] back];
[self setIsCancel:0x1];
[self stopLoading];
rax = [DFLoadingPageManager sharedInstance];
rax = [rax retain];
[rax cancelStartLoading];
[rax release];
return;
}
先调用父类的返回
设置取消为true
停止loading、
取消loading管理单例的开始loading
问题:自定义h5容器后,点返回会把系统自带导航条显示出来。
一个解决方法是:可以在分类写这个back方法,加上系统导航条隐藏的代码。
再看 viewDidLoad 方法
void -[DFLoadingPageRootController viewDidLoad](void * self, void * _cmd) {
r12 = self;
var_38 = r12;
*(&var_38 + 0x8) = _OBJC_CLASS_$_DFLoadingPageRootController;
[[&var_38 super] viewDidLoad];
[r12 callBackViewDidLoad];
rax = [NSNotificationCenter defaultCenter];
rax = [rax retain];
[rax addObserver:r12 selector:@selector(monitorViewControllerChanged) name:@"Tracking_viewDidAppear" object:0x0];
[rax release];
r14 = [[UIColor whiteColor] retain];
rax = [r12 view];
rax = [rax retain];
[rax setBackgroundColor:r14];
[rax release];
[r14 release];
CFAbsoluteTimeGetCurrent();
[r12 setLastLaunchTime:r14];
rax = [r12 loadingInfo];
rax = [rax retain];
r15 = rax;
rax = [rax slogan];
rax = [rax retain];
rdx = rax;
[r12 updateSlogan:rdx];
[rax release];
[r15 release];
[r12 startLoading];
rax = [r12 loadingInfo];
rax = [rax retain];
r13 = rax;
rax = [rax loadingView];
rax = [rax retain];
r14 = [rax isFirstStop];
[rax release];
[r13 release];
if (r14 != 0x0) {
rax = [r12 loadingInfo];
rax = [rax retain];
r14 = rax;
rax = [rax loadingView];
rax = [rax retain];
[rax stopLoading];
[rax release];
[r14 release];
}
return;
}
遇到个新单词 slogan查一下
slogan | 英[ˈsləʊɡən] | 美[ˈsloʊɡən] |
n. | 标语; 口号; |
更新标语的方法
void -[DFLoadingPageRootController updateSlogan:](void * self, void * _cmd, void * arg2) {
r12 = self;
r14 = [arg2 retain];
rax = [r12 loadingInfo];
rax = [rax retain];
[rax setSlogan:r14];
[rax release];
if ([r14 length] == 0x0) goto loc_1001efc6c;
loc_1001efc0e:
rax = [r12 view];
rax = [rax retain];
rbx = rax;
if (rax != 0x0) {
[&var_80 bounds];
xmm0 = intrinsic_movsd(xmm0, *(&var_80 + 0x18));
var_38 = intrinsic_movsd(var_38, xmm0);
xmm0 = intrinsic_movsd(xmm0, *0x1012c2598);
xmm1 = intrinsic_movsd(xmm1, *(&var_80 + 0x10));
xmm1 = intrinsic_addsd(xmm1, xmm0);
xmm1 = intrinsic_addsd(xmm1, xmm0);
var_30 = intrinsic_movsd(var_30, xmm1);
}
else {
intrinsic_movaps(var_70, 0x0);
intrinsic_movaps(var_80, 0x0);
xmm0 = intrinsic_movsd(0x0, *0x1012c45b0);
var_30 = intrinsic_movsd(var_30, xmm0);
xmm0 = intrinsic_xorpd(xmm0, xmm0);
var_38 = intrinsic_movsd(var_38, xmm0);
}
[rbx release];
r13 = &r12->_sloganLabel;
rdi = r12->_sloganLabel;
if (rdi == 0x0) {
*r13 = [[UILabel alloc] init];
[*r13 release];
[*r13 setNumberOfLines:0x0];
intrinsic_movsd(xmm0, *0x1012c45b8);
intrinsic_movsd(xmm3, *0x1012befe0);
xmm1 = intrinsic_movapd(xmm1, xmm0);
intrinsic_movapd(xmm2, xmm0);
rax = [UIColor colorWithRed:rdx green:rcx blue:r8 alpha:r9];
rax = [rax retain];
[*r13 setTextColor:rax];
[rax release];
[*r13 setTextAlignment:0x1];
xmm0 = intrinsic_movsd(xmm0, *0x1012c2240);
rax = [UIFont systemFontOfSize:rdx];
rax = [rax retain];
[*r13 setFont:rax];
[rax release];
rdi = *r13;
}
[rdi setText:r14];
xmm1 = intrinsic_movsd(xmm1, *0x1012c2388);
xmm0 = intrinsic_movsd(xmm0, var_30);
[*r13 sizeThatFits:r14];
xmm0 = intrinsic_movsd(xmm0, var_38);
xmm0 = intrinsic_subsd(xmm0, xmm1);
xmm0 = intrinsic_addsd(xmm0, *0x1012c2268);
intrinsic_movsd(var_50, xmm0);
var_48 = intrinsic_movsd(var_48, intrinsic_movsd(xmm0, var_30));
intrinsic_movsd(var_40, xmm1);
rcx = var_48;
rdx = 0x4048000000000000;
[*r13 setFrame:rdx, rcx];
rsp = (rsp - 0x20) + 0x20;
rax = [*r13 superview];
rax = [rax retain];
[rax release];
if (rax != 0x0) goto loc_1001efe94;
loc_1001efe62:
rax = [r12 view];
rax = [rax retain];
[rax addSubview:*r13, rcx];
rdi = rax;
goto loc_1001efe8e;
loc_1001efe8e:
[rdi release];
goto loc_1001efe94;
loc_1001efe94:
[r14 release];
return;
loc_1001efc6c:
rbx = *ivar_offset(_sloganLabel);
rdi = *(r12 + rbx);
if (rdi == 0x0) goto loc_1001efe94;
loc_1001efc80:
[rdi removeFromSuperview];
rdi = *(r12 + rbx);
*(r12 + rbx) = 0x0;
goto loc_1001efe8e;
}
自动退出加载页面的方法
void -[DFLoadingPageRootController autoExitLoadingPage](void * self, void * _cmd) {
r14 = self;
if ([self isStoping] == 0x0) {
[r14 setIsStoping:0x1];
rax = [NSNotificationCenter defaultCenter];
rax = [rax retain];
rdx = r14;
[rax removeObserver:rdx];
[rax release];
if ([r14 isPanGestureBack] != 0x0) {
rax = [DFLoadingPageManager sharedInstance];
rax = [rax retain];
[rax cancelStartLoading];
[rax release];
}
rax = [r14 loadingInfo];
rax = [rax retain];
r12 = [[rax appId] retain];
[rax release];
if ((r12 == 0x0) || ([r12 length] == 0x0)) {
rax = _DTContextGet();
rax = [rax retain];
var_30 = rax;
rax = [rax currentApplication];
rax = [rax retain];
r15 = rax;
rax = [rax descriptor];
rax = [rax retain];
r13 = [[rax name] retain];
[r12 release];
[rax release];
[r15 release];
[var_30 release];
r12 = r13;
}
rax = [DFLoadingPageManager sharedInstance];
rax = [rax retain];
[rax stopLoading:r12];
[rax release];
[r12 release];
}
return;
}
到底哪个方法退出去的呢
stopLoading方法调用了一个forceExit方法,那就是它了。
bool -[DFLoadingPageManager stopLoading:](void * self, void * _cmd, void * arg2) {
rbx = self;
r15 = [arg2 retain];
r12 = 0x0;
_APLogToFile();
rax = [rbx findLoadingInfoWithAppId:r15];
rax = [rax retain];
r13 = rax;
if (rax != 0x0) {
var_38 = rbx;
[r13 setIsStopStartingApp:0x1];
r12 = 0x0;
rax = _DTContextGet();
rax = [rax retain];
rbx = [[rax findApplicationByName:@"20001120"] retain];
[rax release];
if (rbx != 0x0) {
[rbx forceExit];
rax = [r13 handler];
rax = [rax retain];
r12 = rax;
if ((rax != 0x0) && ([r12 respondsToSelector:@selector(onStopLoadingPage:params:sourceId:)] != 0x0)) {
var_30 = [[r13 params] retain];
rax = [r13 sourceId];
rax = [rax retain];
[r12 onStopLoadingPage:r15 params:var_30 sourceId:rax, r9];
[rax release];
[var_30 release];
}
[var_38 removeLoadingViewForInfo:r13];
[r12 release];
r12 = 0x1;
}
[rbx release];
}
[r13 release];
[r15 release];
rax = r12;
return rax;
}