iOS解决无法适配模拟器的问题
2019-01-18 本文已影响10人
fortitude1990
最近要进行全面屏的适配,但是又没有全面屏手机,全面屏手机价格太高,申请一个全面屏测试机估计也没有希望,所以只能使用模拟器来适配全面屏了。
使用模拟器来适配全面屏,第一个要解决的问题就是去除不支持X86架构的第三方静态库。如果直接删除,就要注销掉所有依赖这个库的代码,等适配完之后再一一修改回来,很显然这个方法不可行的,如果逻辑很复杂的话,这个过程一定会出现问题。所以我就打算模拟一个静态库,让这个模拟静态库拥有原有静态库的API,同时支持X86架构。
首先建立一个静态库工程,命名为SimulateYSBLib(假如原来静态库文件为YSBLib.a)。
创建一对.h、.m文件,命名为YSBDeviceAPI(这里必须和YSBDeviceAPI.a的public文件名相同)。然后拷贝YSBLib.a对应的YSBDeviceAPI.h的内容,粘贴到SimulateYSBLib.a对应的YSBDeviceAPI.h中。将YSBDeviceAPI.h设置为public header。
文件目录.png 设置为public.png为了解决调用方法不存在导致闪退的问题,可以采取以下方案:
在SimulateYSBLib写一个实例方法:
#import <Foundation/Foundation.h>
@interface SimulateYSBLib : NSObject
- (id)commonMethod;
@end
#import "SimulateYSBLib.h"
@implementation SimulateYSBLib
- (id)commonMethod{
return nil;
}
@end
在YSBDeviceAPI.m重写methodSignatureForSelector、forwardInvocation:
#import "YSBDeviceAPI.h"
#import "SimulateYSBLib.h"
@implementation YSBDeviceAPI
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{
if (aSelector == @selector(commonMethod)) {
return [super methodSignatureForSelector:aSelector];
}
return [[[SimulateYSBLib alloc] init] methodSignatureForSelector:@selector(commonMethod)];;
}
-(void)forwardInvocation:(NSInvocation *)anInvocation{
if (anInvocation.selector == @selector(commonMethod)) {
[anInvocation invokeWithTarget:[[SimulateYSBLib alloc] init]];
}
}
@end
调用YSBDeviceAPI.h的方法时,统一走SimulateYSBLib类的commonMethod方法。