美文网首页专注iOS开发(OC/Swift)
给没有暴露的pod库文件添加category和hook方法

给没有暴露的pod库文件添加category和hook方法

作者: 洲洲哥 | 来源:发表于2019-05-24 16:16 被阅读8次

问题描述

很久以前写的一个支付工具的pod库,需要对他添加环境切换的选项。

那么问题就来了

  • [x] 1:该pod库没有提供切换环境的api
  • [x] 2:该pod库已经被别人升级了,主app不想升级,想在该app上继续使用
  • [x] 3:需要修改的文件没有被pod公开
  • [x] 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
到此功能已经完成

问题和解释如下

  • [x] 1:在hookconfig.m中,同样声明了一个
@interface URLConfig : NSObject

@property (nonatomic, strong) NSString * URLHOST;
- (void)configURL;
@end

在编译的时候不会报重复定义的错误码?

解:从runtime说起,程序在编译的时只需要提供申明,即使没有实现程序也不会崩溃。但是在运行时,在真正的消息转发时,才会查找对应的实现,若没有则会走相应的流程。.h文件只是将头文件案声明引入,在编译时期不管实现。所以在.m文件中没有实现对应的方法时不会报错的。
.m文件中是实现问价,也会有私有的api,在运行时才会查找方法IMP列表。

  • [x] 2:在.m文件中为什么这样声明就可以调用了没有暴露的类的方法

解:在.m文件引入了要hook的文件,通过runtiem就可以引用该文件。对其添加Category,就和正常使用一样了。(结合上面一个问题的答案)

  • 如有问题可添加QQ群:234812704
  • 欢迎各位一块学习,提高逼格!
  • 也可以添加洲洲哥的微信公众号

可以来微信公众号(洲洲哥)后台给我留言。 快来扫码关注我们吧!

公众号二维码

相关文章

网友评论

    本文标题:给没有暴露的pod库文件添加category和hook方法

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