需求是这样子的,让iOS前端写一个页面的类文件,然后打包给后台,前端下载这个文件,再加载出页面。动态化模板。
这种需求是不科学的,因为Swift的方法都是静态的,也就是说工程在编译的时候就加载好了所需要的类文件。
后来查了查资料,还真能做,就是有点麻烦。并且不能上线。
静态库:链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝。
动态库:链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework
等),节省内存。但是苹果不让使用自己的动态库,否则审核就无法通过。
动态库,顾名思义就是动态加载的。
我们可以写一个类页面,打包成动态库,然后给后台,这样就是OK了。
动态库的打包百度上多的是,这里就不介绍了。下面开始使用动态库。有OC和Swift2中方式
先上OC代码的使用。
-(void)testFramework
{
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSLog(@"%@",paths);
NSString *documentDirectory = nil;
if ([paths count] != 0)
documentDirectory = [paths objectAtIndex:0];
//拼接我们放到document中的framework路径
NSString *libName = @"oneView.framework";
NSString *destLibPath = [documentDirectory stringByAppendingPathComponent:libName];
//判断一下有没有这个文件的存在 如果没有直接跳出
NSFileManager *manager = [NSFileManager defaultManager];
if (![manager fileExistsAtPath:destLibPath]) {
NSLog(@"There isn't have the file");
return;
}
//复制到程序中
NSError *error = nil;
//加载方式二:使用NSBundle加载动态库
NSBundle *frameworkBundle = [NSBundle bundleWithPath:destLibPath];
if (frameworkBundle && [frameworkBundle load]) {
NSLog(@"bundle load framework success.");
}else {
NSLog(@"bundle load framework err:%@",error);
return;
}
/*
*通过NSClassFromString方式读取类
*PacteraFramework 为动态库中入口类
*/
Class pacteraClass = NSClassFromString(@"oneViewController");
if (!pacteraClass) {
NSLog(@"Unable to get TestDylib class");
return;
}
UIViewController *pacteraObject = [pacteraClass new];
[self.view addSubview:pacteraObject.view];
}
Swift写的时候是从后台服务器拿的,所以需要加压用的解压库是 SSZipArchive
func btnclick(btn:UIButton){
btn.hidden = true
let pathStr = self.cachePath("textTwo")+"textTwo.zip"
let toPath = self.cachePath("proName")
SSZipArchive .unzipFileAtPath(pathStr, toDestination: toPath)
let libName = cachePath("textTwo.framework")+"/textTwo.framework"
let frameworkBoundle = NSBundle(path: libName)
if frameworkBoundle!.load(){
print("打开成功")
}else {
return;
}
let pacterClass:AnyClass = NSClassFromString("oneViewController")!
if let viewClass = pacterClass as? UIViewController.Type {
let vc = viewClass.init() as UIViewController
self.presentViewController(vc, animated: true, completion: nil)
}
}
func getData(){
Alamofire.request(.GET, "http://www.baidu.com/textTwo.zip").responseData { (response) in
if response.result.isSuccess {
self.saveDataToCache("textTwo",data:response.data!)
}else{
print(response.result.error)
}
}
}
/**
* 获取沙盒路径
*/
var arr = NSMutableArray()
func cachePath(proName:String)-> String {
let cachePath = NSHomeDirectory() + "/Documents/"
let FM:NSFileManager = NSFileManager.defaultManager()
//判断当前路径是否存在
print("存储存路劲-->\(cachePath)")
if !FM.fileExistsAtPath(cachePath, isDirectory: nil)
{
do {
try FM.createDirectoryAtPath(cachePath, withIntermediateDirectories: true, attributes: nil)
} catch let error as NSError {
print(error)
}
}
return cachePath
}
/**
* 存缓存
*/
func saveDataToCache(pictureDic:String,data:NSData) -> (){
let pathStr = self.cachePath(pictureDic)+"\(pictureDic).zip"
data.writeToFile(pathStr, atomically: true)
}