目录
App启动过程及生命周期
App的启动
UIApplication
UIApplicationDelegate
通过App生命周期回调实现启动页
闪屏的实现
简单实现闪屏功能
App启动过程及生命周期
App的启动
·main函数前
动态链接 / 二进制文件加载 / runtime / 类的加载 ......
·main函数
int main(int argc, char * argv[]) {NSString * appDelegateClassName;@autoreleasepool {// Setup code that might create autoreleased objects goes here.appDelegateClassName = NSStringFromClass([AppDelegate class]);}return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}
创建UIApplication对象(系统功能) 创建对应的delegate实现业务逻辑
UIApplication
·处理App生命周期 / 系统内存警告
·处理UI / statusbar / 图标消息数等状态的变化 / 方向
·处理openURL
·提供Delegate / Notification两种方式处理业务逻辑
·根据App状态调整业务逻辑
·Not running
·Inactive:中间的过渡状态
·Active:正在前台运行,系统分配更多资源
·Background:分配较少的资源
·Suspended:内存不足系统自动Kill
UIApplicationDelegate
通过App生命周期回调实现启动页
闪屏的实现
·启动前图片的组成
·Launch Screen + Splash Screen
·Launch Screen启动屏(系统级)
·是Main函数之前 + didFinishLaunch前
·系统启动App时自动展示
·在准备好App UI数据后自动消失
·给用户以响应,确定点击了正确的图标
·Splash Screen闪屏(业务逻辑)
·Launch Screen展示时间短,看不清
·实现同样的图片,显示图标等信息
·实现广告 / 推广活动页面
·实现游戏中Loading页面
使用Xcode配置图片:
·分别上传对应设备2x 3x的图片
·系统自动展示和消失
直接在当前Window上addSubview
页面结构保证在最上面
创建新的Window成为KeyWindow
调整window的level
多Window的管理
简单实现闪屏功能
点击跳过或三秒钟后自动跳过
//
// GSCSplashView.m
// GSCApp1
//
// Created by gsc on 2024/6/15.
//#import "GSCSplashView.h"
#import "GSCScreen.h"@interface GSCSplashView()@property(nonatomic,strong,readwrite)UIButton *button;
@property(nonatomic,strong,readwrite)NSTimer *timer;@end@implementation GSCSplashView-(instancetype)initWithFrame:(CGRect)frame{self = [super initWithFrame:frame];if(self){self.image = [UIImage imageNamed:@"icon.bundle/splash.png"];[self addSubview:({_button = [[UIButton alloc] initWithFrame:UIRectAdapter(330, 100, 60, 40)];_button.backgroundColor = [UIColor lightGrayColor];[_button setTitle:@"跳过" forState:UIControlStateNormal];[_button addTarget:self action:@selector(_removeSplashView) forControlEvents:UIControlEventTouchUpInside];_timer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(_removeSplashView) userInfo:nil repeats:NO];_button;})];self.userInteractionEnabled = YES;}return self;
}#pragma mark --(void)_removeSplashView{[self removeFromSuperview];
}@end