zoukankan      html  css  js  c++  java
  • 如何在Framework中读取bundle中的Res

    前因:

      因为公司上架前后的原因,外围的平台层部分提前上线,而我做的功能部分需要晚一些上线,是单独的一个工程在其他仓库开发。

    我的资源文件放在Bundle中。合到主工程中,资源文件不用改,直接拖进去。倒是代码部分因为重名较多,花了大半天时间来改名字。

      过一段时间,需要将我们的代码以Framework的形式,放入另一个项目的平台层中。我的做法是,将代码打包进入Framework,然后资源文件在Bundle中,两部分拖进平台层,资源文件调用等等也都不用改。

    因为Android就只有一个aar文件导入平台层。所以对方提出希望我也只提供一个Framework 包。

    所以现在就需要改资源文件调用方式了。

    以前的做法很简单:

    NS_INLINE UIImage * UIResourceBundleSubMove(NSString *strPath){
        return [UIImage imageNamed:[NSString stringWithFormat:@"XXXX.bundle/images/move/%@.png",strPath]];
    }

    现在就是

    #define FrameworkPath  [[NSBundle mainBundle] pathForResource:@"VivenSDK" ofType:@"framework"]
    #define FrameworkBundle  [NSBundle bundleWithPath:FrameworkPath]
    #define VivienBundle [NSBundle bundleWithPath:[FrameworkBundle pathForResource:@"Vivien" ofType:@"bundle"]] #define UIResourceBundleSubMove(imageName) [UIImage imageNamed:[NSString stringWithFormat:@"images/move/%@",imageName] inBundle:VivienBundle compatibleWithTraitCollection:nil]

    NS_INLINE UIImage * UIResourceBundleMore(NSString *imageName){ return [UIImage imageNamed:[NSString stringWithFormat:@"images/main/%@",imageName] inBundle:VivienBundle compatibleWithTraitCollection:nil]; }

    然后再把Framework再拖一份到主工程的Copy Bundle Resources

    如果报错,可以通过代码的方式查看报错:

        
        NSString *path = [[NSBundle mainBundle] pathForResource:@"VivienSDK" ofType:@"framework"];
        NSLog(@"path = %@", path);
        
        NSBundle *myBundle = [NSBundle bundleWithPath:path];
        NSLog(@"myBunlde = %@", myBundle);
        
        NSBundle *vivienResBundle= [NSBundle bundleWithPath:[myBundle pathForResource:@"Vivien" ofType:@"bundle"]];
        
        NSLog(@"vivienResBundle = %@", vivienResBundle);
        
        UIImage *iconImage = [UIImage imageNamed:[NSString stringWithFormat:@"Images/%@",@"icon_friend"] inBundle:vivienResBundle compatibleWithTraitCollection:nil];
        NSLog(@"iconImage = %@", iconImage);

    现在发现这样有问题,Archive的时候会报错:

     Failed to generate distribution items with error: Error Domain=DVTMachOErrorDomain Code=0 "Found an unexpected Mach-O header code: 0x72613c21" 
    UserInfo={NSLocalizedDescription=Found an unexpected Mach-O header code: 0x72613c21, NSLocalizedRecoverySuggestion=}

    因为,静态的framework不能打包进bundle。静态库会编译进二进制文件的。静态framework里面的资源需要重新打包一个bundle。工程里面链接下framework,加入资源bundle就ok了 

    如果改为动态库可以成功;

    1,Sandbox会验证动态库的签名,所以如果是动态从服务器更新的动态库,是签名不了的,因此应用插件化、软件版本实时模块升级等功能在iOS上无法实现;

    http://www.jianshu.com/p/f2ffe8325519 

  • 相关阅读:
    CKEditor 4 上传视频
    CKEditor 4 上传图片
    azure跨域问题(访问azure存储账户数据,blob)
    azure 上传blob到ams(CreateFromBlob)
    js 时间格式化成字符串
    js正则表达式替换HTML标签以及空格( )
    js 获取上传视频的时长、大小、后缀名
    webapi 跨域问题
    requests(二): json请求中固定键名顺序&消除键和值之间的空格
    requests(一): 发送一个json格式的post请求
  • 原文地址:https://www.cnblogs.com/developer-qin/p/6484527.html
Copyright © 2011-2022 走看看