iOS动态模板加载

需求是这样子的,让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)

    }

    








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值