注册吾爱很多年了,终于自己也可以发布原创帖子了。嘿嘿
很喜欢今日头条这个App,但是又很反感他的广告和置顶,那就动起手来优化吧。
个人网站 十一同学 欢迎大佬点评 只有浏览 没评价 好凄惨
目的
1.去除启动页广告
2.去除列表推荐广告
3.去除评论顶部推荐广告
4.去除烦人的置顶
工具及软件
越狱的手机,iOS 9.3.1
dumpdecrypted.dylib ipa脱壳
class-dump 导出头文件
Thor 手机上抓包
Reveal Mac上界面布局分析
开干
抓包
利用Thor软件,抓一个列表返回的json数据,分析特定的字符串。
通过分析返回的数据,我们可以知道,“stick_label:'置顶'”。暂时记录,留着后面用。
去除启动页广告
用Reveal分析app布局,由于广告闪屏跳转太快,未能捕捉到完整的页面,不过没关系。通过最底层的红色view,我们可以找到这是一个由TTAdSplashControllerView展示的视图,也就是启动页广告。
我们在头文件中看看TTAdSplashControllerView有什么方法。图中方框标记的,即为当前广告视图的初始化方法,我们利用Theos去hook该方法。
另外,我们也将广告视图上面的子视图的show方法hook掉。
%hook TTAdSplashControllerView
/*去除启动页广告*/
- (void)setModel:(NSArray *)model{}#这个是广告的数据模型的set方法,我们直接替代。这样也不会给他返回数据了
- (id)initWithFrame:(struct CGRect)arg1 model:(id)arg2{
return nil;
}
%end
%hook TTAdSplashView /*这个是广告视图的子视图,我们直接hook掉他们的显示方法,这样他们也不会再显示*/
- (void)showADVideoView{};
- (void)showADImage{};
%end
去除评论顶部广告
每篇文章的评论顶部都有一个推广App的广告,我们通过Reveal分析可以知道它的类是ExploreDetailADContainerView。方法和去除启动页广告一样,就是直接去除他的数据,这样就不会显示广告。但是这种做法的前提是开发这个App的人员对数据做了判断,如果他没有判断,那App肯定会崩溃的,我之所以敢肯定他做了判断是因为,有的评论页面有广告,有的评论页面没广告,因此他肯定做了判断的。
+ (void)trackAppHideIfExists:(id)arg1;
@property(nonatomic) double referHeight; // @synthesize referHeight=_referHeight;
@property(retain, nonatomic) NSMutableDictionary *showEvents; // @synthesize showEvents=_showEvents;
@property(retain, nonatomic) NSMutableDictionary *adViewFrames; // @synthesize adViewFrames=_adViewFrames;
@property(retain, nonatomic) NSMutableArray *adViews; // @synthesize adViews=_adViews;
@property(retain, nonatomic) TTAdDetailViewModel *viewModel; // @synthesize viewModel=_viewModel;
@property(nonatomic) __weak id <TTAdDetailContainerViewDelegate> delegate; // @synthesize delegate=_delegate;
@property(nonatomic) _Bool isVideoAd; // @synthesize isVideoAd=_isVideoAd;
@property(copy, nonatomic) NSArray *adModels; // @synthesize adModels=_adModels;
可以清楚的看到一个属性TTAdDetailViewModel *viewModel;,我们hook它的set方法。
%hook ExploreDetailADContainerView
/*去除顶部广告*/
- (void)setAdModels:(NSArray *)adModels{
}
%end
去除置顶咨询和列表广告
上面两个去除都很简单,我们找到他的初始化方法或者启动数据模型,直接干掉就可以了。但是这个置顶的咨询和列表中的广告就不一样了。他是在数据源里面,因此我们找到数据源,删除数据源中的广告模型即可。这样既不影响App的正常使用,而且也非常便捷。
我们找到当前列表的dataSource,为ExploreMixedListBaseView,但是在ExploreMixedListBaseView的头文件里面没有看到任何数据和数据模型之类的,因此推测有一个专门管理数据的类,通过各个属性名的直接排除,我们看到@property(retain, nonatomic) ExploreFetchListManager *fetchListManager;
我们直接查看ExploreFetchListManager 的头文件
在ExploreFetchListManager的头文件中,我们看到一个数组@property(retain, nonatomic) NSArray *items;
,那我们直接打印这个数据,看看运行的时候,输出的是啥。
不难发现,这就是我们要找的数据。查看ExploreOrderedData的头文件,也不难发现我们之前抓包提取的特殊参数stick_label
到此,我们找到数据了,我们只要对数据进行判断,处理,然后重新返还给他即可
%hook ExploreFetchListManager
- (void)setItems:(NSArray *)items{
NSMutableArray *temArray = [NSMutableArray new];
NSMutableArray *adArray = [NSMutableArray new];
NSLog(@"****1items = %@",items);
if(items.count > 0){
for (ExploreOrderedData * model in items) {
[temArray addObject: model];
}
}
[temArray enumerateObjectsUsingBlock:^(ExploreOrderedData * model, NSUInteger idx, BOOL * _Nonnull stop) {
if([[model stickLabel] isEqualToString:@"置顶"] || [[model adIDStr] length] > 0){
[adArray addObject: model];
}
}];
if(adArray.count > 0){
[temArray removeObjectsInArray:adArray];
}
items = [temArray mutableCopy];
%orig;
}
%end
到此,所有的广告,都被去除了。
deb插件下载
上面这个是去广告的deb插件,越狱手机直接安装即可。安装完,重新打开软件,还你一个清爽的头条。
个人网站 十一同学 欢迎点评 只有浏览量,一直没评论😂😂