一、thoes 加载图片资源
音乐开关和退出登录的图片未替换如上图所示,我们还没将音乐开关
和退出登录
的 icon 替换掉,接下来完善我们的项目。
- 思路一
- 将文件放到 iPhone 的
QQ
所在 ipa 包中。 -
[cell.imageView setImage:[UIImage imageNamed:@"carrot_skull.png"]];
这样给 cell 加载图片 - 发现成功了,有效果。
- 思路二介绍,思路一存在侵入性比较强,我们更希望图片资源跟随插件打包,
- 在
theos
项目中创建layout
文件夹,这个文件夹的资源将被 thoes 读取,对应放在 iPhone 的/
目录下。 - 我们把图片放入 theos 项目的
layout/Library/PreferenceLoader/Preferences/WechatTweakCarrot/carrot_skull@2x.png
路径下。 - 然后在 tweak 代码中,使用如下代码读取
[cell.imageView setImage:[UIImage imageWithContentsOfFile:@"/Library/PreferenceLoader/Preferences/WechatTweakCarrot/carrot_skull@2x.png"]];
- 目录结构比较复杂,是为了避免与其他插件冲突。
二、thoes 安装 tweak 项目到手机的过程
make 过程三、thoes 安装 tweak 项目多文件开发
-
qqtweak_FILES = Tweak.x
在makefile
中找到改指令 - 可以像下面一样修改改指令,来支持分目录,分文件开发 tweak 项目。
// 情况一,同时加载 Person.m,用空格分隔
qqtweak_FILES = Tweak.x Person.m
// 情况二,同时加载增加目录层级结构
qqtweak_FILES = scr/Tweak.x scr/model/Person.m
// 情况三,使用通配符
qqtweak_FILES = scr/*.x scr/model/*.m
- 另外可以用
make package debug=0
,来发布 release 版本的插件。
四、补充前面day06文章去除广告的部分知识
需要把图中广告去掉下面提供了三种思路,渐进式的优雅方式,完美剔除广告。
// 方案一:直接让 XMAdCell 初始化值返回 nil,因为喜马拉雅内部有判断,所以不会将 nil 添加到 tableView中,存在侥幸的成功.
// %hook XMAdCell
// + (id)cellObjectWithAdCellModel:(id)arg1 {
// return nil;
// }
// %end
//方案二:hook UITableview 的高度设置方法,如果是 XMAdCell 类型的 cell,就让高度返回 0,虽说达到目的,但是 cell 还是创建了,不够完美.
// @class XMTableViewDataSource;
// @class XMAdCell;
// @interface XMTableViewDelegate
// @property(readonly, nonatomic) XMTableViewDataSource *dataSource;
// @end
// @interface XMTableViewDataSource
// - (id)tableView:(id)arg1 cellForRowAtIndexPath:(id)arg2;
// @end
// %hook XMTableViewDelegate
// - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
// UITableViewCell *cell= [self.dataSource tableView:tableView cellForRowAtIndexPath:indexPath];
// if ([cell isKindOfClass:%c(XMAdCell)]) {
// return 0;
// } else {
// return %orig;
// }
// }
// %end
// 方案三:从源头上把和 ad 有关的 model 去掉,这样就不会创建 cell.是比较理想的解决方法.
@interface XMTableViewDataSource
@property(nonatomic, copy) NSMutableArray *dataSource;
@property(retain, nonatomic) id cellModel;
@end
@class XMAdCllModel;
%hook XMTableViewDataSource
- (long long)tableView:(id)arg1 numberOfRowsInSection:(long long)arg2 {
NSMutableArray * mutableArray = [NSMutableArray array];
for (id obj in self.dataSource) {
if ([[obj cellModel] isKindOfClass:NSClassFromString(@"XMAdCellModel")] || [[obj cellModel] isKindOfClass:NSClassFromString(@"XMAdModel")]) {
[mutableArray addObject:obj];
}
}
[self.dataSource removeObjectsInArray:mutableArray];
return %orig;
}
%end
三种方案都能达到毫无痕迹的效果
网友评论