美文网首页iOS 开发 Objective-C
iOS 底层原理 day07 tweak 图片 多文件 re

iOS 底层原理 day07 tweak 图片 多文件 re

作者: 望穿秋水小作坊 | 来源:发表于2020-08-01 13:41 被阅读0次

一、thoes 加载图片资源

音乐开关和退出登录的图片未替换

如上图所示,我们还没将音乐开关退出登录的 icon 替换掉,接下来完善我们的项目。

  1. 思路一
  • 将文件放到 iPhone 的 QQ 所在 ipa 包中。
  • [cell.imageView setImage:[UIImage imageNamed:@"carrot_skull.png"]]; 这样给 cell 加载图片
  • 发现成功了,有效果。
效果图
  1. 思路二介绍,思路一存在侵入性比较强,我们更希望图片资源跟随插件打包,
  • 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.xmakefile 中找到改指令
  • 可以像下面一样修改改指令,来支持分目录,分文件开发 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
三种方案都能达到毫无痕迹的效果

相关文章

网友评论

    本文标题:iOS 底层原理 day07 tweak 图片 多文件 re

    本文链接:https://www.haomeiwen.com/subject/iszlrktx.html