问题描述
很久以前写的一个支付工具的pod库,需要对他添加环境切换的选项。
那么问题就来了
- 1:该pod库没有提供切换环境的api
- 2:该pod库已经被别人升级了,主app不想升级,想在该app上继续使用
- 3:需要修改的文件没有被pod公开
- 4:还可以吧这个pod库直接放入本地使用。这个也是一个不错的办法,但是引起的后续问题就多了。。。
怎么办????怎么解决
文件没有公开,不能对其添加Category,更别说添加其他的匿名函数了!问题要解决,办法总的有。
代码具体如下
1:加上一个pod库中有这样一个类文件如下
URLConfig.h 文件
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface URLConfig : NSObject
@property (nonatomic, strong) NSString * URLHOST;
- (void)configURL;
@end
NS_ASSUME_NONNULL_END
URLConfig.m 文件
#import "URLConfig.h"
@implementation URLConfig
- (void)configURL {
self.URLHOST = @"www.osjoin.com";
}
@end
NOTICE:
该文件在pod库中没有对外公布,是不能添加Category
解决办法如下->
1:new一个全新的类HookConfig
文件
HookConfig.h文件
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface HookConfig : NSObject
// 方法可以根据你要求添加
+ (void)setupHookConfigURL;
@end
NS_ASSUME_NONNULL_END
重点来了!!!!
在HookConfig.m文件中处理问题,各位看官请注意!!!!
2:在HookConfig.m文件中添加对该没有暴露文件的扩展
#import "HookConfig.h"
#import "JRSwizzle.h"
@interface URLConfig : NSObject
@property (nonatomic, strong) NSString * URLHOST;
- (void)configURL;
@end
@interface URLConfig(helper)
@end
@implementation URLConfig(helper)
+(void)load {
[self jr_swizzleMethod:@selector(configURL) withMethod:@selector(jr_configURL) error:nil];
}
- (void)jr_configURL {
[self jr_configURL];
NSLog(@"---===-===");
}
@end
@implementation HookConfig
- (instancetype)init
{
self = [super init];
if (self) {
// 调用要Category的hook中的方法
[[URLConfig alloc] configURL];
}
return self;
}
+ (instancetype)hookConfig {
return [[HookConfig alloc] init];
}
// 调用该方法,hook
+ (void)setupHookConfigURL {
[HookConfig hookConfig];
}
@end
到此功能已经完成
问题和解释如下
- 1:在hookconfig.m中,同样声明了一个
@interface URLConfig : NSObject
@property (nonatomic, strong) NSString * URLHOST;
- (void)configURL;
@end
在编译的时候不会报重复定义的错误码?
解:从runtime说起,程序在编译的时只需要提供申明,即使没有实现程序也不会崩溃。但是在运行时,在真正的消息转发时,才会查找对应的实现,若没有则会走相应的流程。.h
文件只是将头文件案声明引入,在编译时期不管实现。所以在.m
文件中没有实现对应的方法时不会报错的。
在.m
文件中是实现问价,也会有私有的api,在运行时才会查找方法IMP列表。
- 2:在.m文件中为什么这样声明就可以调用了没有暴露的类的方法
解:在.m
文件引入了要hook的文件,通过runtiem就可以引用该文件。对其添加Category,就和正常使用一样了。(结合上面一个问题的答案)