3.1 第一个问题来了,抖音做了逆向检测,强制弹框,跳转至App Store,如下图所示:
3.2 先去掉这个弹框
- 思路1: 既然跳转到App Store,先hook
- (BOOL)openURL:(NSURL*)url;
方法
- 思路2: 在 UIAlertView 上动手脚
- 思路3: 实在不行就算了,我不玩了还不行😅😅😅
3.3 上面的思路1和思路2都试过了,结果不行,最后还是用Reveal看看吧,看完之后,发现思路2猜对了80%,抖音只是用了UIAlertController,哭晕。。。😭😭😭
3.4 找对了目标,实现起来就很简单了,直接去掉这个弹框
4.1 在手机上用FLEXible对抖音的播放界面进行分析,发现播放页面控制器为 AWEFeedTableViewController
4.2 查看对应头文件
4.3 首先映入眼帘的一个属性 @property(nonatomic) _Bool pureMode;
,这个就不用过多解释了,程序猿的命名套路,一试便知,果然正确,纯净模式搞定。
4.4 观察头文件,与播放下一个相关的方法有以下几个:
- (void)didReceiveAutoPlayNotification:(id)arg1;
- (void)playerItemDidReachEnd:(id)arg1;
- (void)transition_performCustomActionForSlideDirection:(unsigned long long)arg1 gestureRecognizer:(id)arg2;
- (long long)currentIndex;
4.5 尝试了上面提到的所有方法,均无果。最后的最后,灵机一动,发现视频播放器为 AWEAwemePlayVideoViewController
,那完全可以在这里发送通知,每个视频播放完的时候通知 AWEFeedTableViewController
播放下一个就可以了。Nice!这个过程很漫长,但在成功的一瞬间确实很有成就感。
4.6 验证上面的猜想,结果正确,这里用到了上面提到的:- (long long)currentIndex;
,获取当前index,然后播放下一个。
4.7 感想:方向若是错误,停止就是进步
5.1 用FLEXible观察设置界面界面布局及其属性,发现设置界面的逻辑关系为:
AWESettingsTableViewController
AWEGeneralSettingViewModel
AWESettingSectionModel
AWESettingItemModel
5.2 AWESettingsTableViewController
的父类 AWESettingBaseViewController 有一个方法名为: - (void)refreshView;
这个方法用来增加设置项最好不过。
5.3 这里涉及到一个很重要的知识点,就是快速获取block的参数信息。网上好多资料都是使用 debugserver + lldb 的方法,参考文章, 这种方法的缺点很明显:计算麻烦,需要配置,容易出错。我在逛论坛是无意间发现了一个更快捷的方法就是通过 CTObjectiveCRuntimeAdditions
快速获取block的参数信息。它的原理就是根据LLVM文档,把block重新实现了一遍,然后获取内部参数。
5.4 通过这种方法,发现AWESettingItemModel
里的
@property(copy, nonatomic) CDUnknownBlockType switchChangedBlock;
参数信息:参数个数为 1, 类型为 BOOL, 参考文档,备注:第0个参数为系统自用,不予考虑。
5.5 综上所述,功能实现,效果展示: