iOS 开发 Objective-C

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

2020-08-01  本文已影响0人  望穿秋水小作坊

一、thoes 加载图片资源

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

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

  1. 思路一
效果图
  1. 思路二介绍,思路一存在侵入性比较强,我们更希望图片资源跟随插件打包,

二、thoes 安装 tweak 项目到手机的过程

make 过程

三、thoes 安装 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

四、补充前面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
三种方案都能达到毫无痕迹的效果
上一篇 下一篇

猜你喜欢

热点阅读