关于启动页面的一点思考

制作炫酷的启动界面一直是产品的追求,但很遗憾的是iOS不能完全做到这一点,我所已知的最好的解决方案是在didFinishLaunch方法里获取启动页面的图片作为动画的第一帧形成连贯的动画,但动态的更换第一帧的App我是没有见到的。

那么能不能更换动态的启动页面呢,我谷歌了一些国外开发者论坛,答案依然是没有找到。这时我想到hook。runtime里面方法交换能否帮助到我呢,我使用的是LaunchScreen.storyboad作为启动页,里面设置了全屏的UIImageView。

1、先尝试使用自定义UIImageView的子类,结果是编译报错,Apple不允许在启动storyboard中使用自定义UI类。然后我创建UIImageView的分类,并重写+ (void)load方法。
结论是:hook不到启动图,我先后hook了initWithImage,setImage:都没有效果。
2、尝试hookUIImage,先后hook了imageNamed:,imageNamed:inBundle:等方法,依然没有效果,最后不死心的我,hookUIStoryboard的方法,很显然都没有效果,难道storyboard的底层并没有使用runtime的消息机制。很显然不是,使用其他的storyboard hook都有捕捉到,到底哪里出问题了呢。
3、我尝试在load方法处设置断点,神奇的出现了。启动图先出现,然后再进入断点,这令我有些不知所措,启动图竟然比load都早,难道他比runtime都早吗。这显然runtime是管不了它了。

结论:launchScreen.board的启动时机非常早,早于load,更不用说main,didFinishLaunch了,它的作用是app初始化时诸如:dyld链接,镜像加载,runtime的运行等一系列耗时操作的遮罩美化,它运行的太早了,具体是在什么时机,水平有限,我也不得而知。所以想要通过代码动态的修改,有点痴人说梦。但有一点或许可以做到,使用fishhook或许可以做到,但需要更多的底层的api。回过头来想,为什么launchScreen不能使用自定义类,而且创建Storyboard文件时会有普通storyboard和launchScreen两个选项,它确实不是普通的storyboard。最后补充一点,apple对启动图做了缓存处理,在第一次启动后,会在splashBoard这个目录缓存一张启动图,如果出现更换启动图没有效果,可以尝试清除这个目录的图片,具体怎么操作,百度一下即可,我有点懒,就不贴代码了。

你可能感兴趣的:(关于启动页面的一点思考)