如何在框架内读取资源文件?

Lin*_*ong 5 macos xcode objective-c

我在Mac OS X中构建了一个框架和一个cocoa应用程序.该框架动态链接到应用程序.在框架的一个类中,我需要读取此框架的resources文件夹中的资源文件.下面的代码

NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
NSString *characterCodeTable = [resourcePath stringByAppendingPathComponent:@"pymb.txt"];
Run Code Online (Sandbox Code Playgroud)

不起作用,因为"resourcePath"是应用程序资源文件夹的路径,而不是框架的路径.

那么如何在这个框架本身的代码中访问框架的资源文件夹呢?

顺便说一句:在框架/应用程序包中组织杂项文件有什么最佳做法吗?

mip*_*adi 13

而不是打电话+[NSBundle mainBundle],拨打+[NSBundle bundleWithIdentifier:]+[NSBundle bundleForClass:].前者NSString对框架的标识符进行了论证; 后者采用Class框架提供的类的参数.然后,您可以NSBundle根据需要调用常用路径.

完整的文档可以在这里找到.


lor*_*isi 5

使用类似解决方案时有几种反作用和副作用

[NSBundle mainBundle]
Run Code Online (Sandbox Code Playgroud)

要么

NSBundle *localBundle  = [NSBundle bundleForClass:[myObject class]]
Run Code Online (Sandbox Code Playgroud)

当你的app结构就像

MyContainerApp
  |------Frameworks/
        |-----------------MyFramework.framwork/
                                |-------------------Resources/
                                                           |-------------mydata.json
Run Code Online (Sandbox Code Playgroud)

因此,如果您可以创建捆绑文件并将其提供给容器应用程序(作为第三方框架开发人员),则可以提供此API

+ (NSBundle *)frameworkBundle {
    static NSBundle* frameworkBundle = nil;
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        NSString* mainBundlePath = [[NSBundle mainBundle] resourcePath];
        NSString* frameworkBundlePath = [mainBundlePath stringByAppendingPathComponent:@"YourFrameworkBundle.bundle"];
        frameworkBundle = [NSBundle bundleWithPath:frameworkBundlePath];
    });
    return frameworkBundle;
}
Run Code Online (Sandbox Code Playgroud)

但是,一个非常超级简单,让我们说超高效的解决方案是带有hexdump的旧C头

xxd -i mydata.json >> mydata.json.h
Run Code Online (Sandbox Code Playgroud)

此hexdump将生成包含这些定义的头文件

unsigned char mydata_json[] = {
   // hex array
};
Run Code Online (Sandbox Code Playgroud)

unsigned int mydata_json_len = 32227;
Run Code Online (Sandbox Code Playgroud)

因此,在您的框架或静态库中,您只需访问它

 unsigned char *rawBytes = mydata_json;
 NSUInteger dataLen = mydata_json_len;
 NSData *serializedData = [NSData dataWithBytesNoCopy:rawBytes length:dataLen freeWhenDone:NO];
Run Code Online (Sandbox Code Playgroud)

那么你可能想把它变成文本:

NSString* myString = [NSString stringWithUTF8String:[rawBytes bytes]];
Run Code Online (Sandbox Code Playgroud)

就是这样.快乐的编码!