支付宝小程序iOS端过渡页DFLoadingPageRootController分析

 

这个过渡页是第一次打开小程序展示的,点击某个小程序前把手机的开发者->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 <APBaseLoadingViewDelegate>
{
    _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;
}

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值