美文网首页
iOS动态更新

iOS动态更新

作者: 暖羊羊_d603 | 来源:发表于2018-06-08 18:13 被阅读0次

iOS 可以使用本地库来加载代码 实现更新,只是需要将部分初始化写好;

将打包的的framework 下载在 新的工程的 NSDocumentDirectory路径下 
测试的话 可以直接打开路径 将打包好的 framework 放在对应的路径下面 

这里有个问题,
1.打包的库中,加载的资源文件 统一放在一个NSbundle中,并且使用 路径的方式加载,
(1)要么统一命名一个当前bundle 在初始化的时候 对这个bundle进行初始化,
(2)最方便的 就是创建bundle的时候 修改一下方式 则可以访问当前bundle中的资源

  // 加载资源文件  主要是 bundle的创建方式
    self.imageView.image = [UIImage imageNamed:@"data.png"
                                      inBundle:[NSBundle bundleForClass:[self class]]
                 compatibleWithTraitCollection: nil];

下面就是根据路径 加载bundle获取对应的 ViewController
如果直接暴露的是 控制器的名字 也可以直接获取控制器

+ (UIViewController *)readFramework {

    NSString *bundlePath = [self getFrameworkFilePath];
    if (![[NSFileManager defaultManager] fileExistsAtPath:bundlePath]) {
        NSLog(@"file not exist ,now  return");
        return nil;
    }
    NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];
    if (!bundle || ![bundle load]) {
        NSLog(@"bundle load error");
        return nil;
    }
    
//    void *lib = dlopen([bundlePath cStringUsingEncoding:NSUTF8StringEncoding], RTLD_NOW);
//    if (!lib) {
//        NSLog(@"bundle load error");
//        return nil;
//    }
    
    Class loadClass = [bundle classNamed:@"WYJUIM"];
    if (!loadClass) {
        NSLog(@"get bundle class fail");
        return nil;
    }
    
    NSObject *bundleObj = [[loadClass alloc] init];
    UIViewController *vc = [bundleObj performSelector:@selector(getVC)];
    return vc;
    
}

相关文章

网友评论

      本文标题:iOS动态更新

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