• 如何在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 

  • 相关阅读:
    CS224n, lec 10, NMT & Seq2Seq Attn
    CS231n笔记 Lecture 11, Detection and Segmentation
    CS231n笔记 Lecture 10, Recurrent Neural Networks
    CS231n笔记 Lecture 9, CNN Architectures
    CS231n笔记 Lecture 8, Deep Learning Software
    CS231n笔记 Lecture 7, Training Neural Networks, Part 2
    pytorch坑点排雷
    Sorry, Ubuntu 17.10 has experienced an internal error
    VSCode配置python插件
    tmux配置与使用
  • 原文地址:https://www.cnblogs.com/developer-qin/p/6484527.html
Copyright © 2020-2023  润新知