如何从主程序中检索iOS框架包中的文件/资源​​?

时间:2014-08-06 11:14:23

标签: ios objective-c xcode

我使用有关为iOS开发创建通用二进制框架以分发库的方法。我还想在框架中添加文件,并将它们加载到主程序中(实际是SSL证书)。这与this StackOverflow question有关,主要区别在于我想要包含除XIB之外的其他内容。

如果我们阅读与链接帖子相关的帖子,似乎是不可能的。但是,提到了以下blog article;我们可以读到:

  

"静态框架不是标准框架的完全替代品    - 访问框架资源的标准方法(例如+[NSBundle bundleForClass:])不会返回预期的捆绑包。通过查询dyld获取库路径来确定包路径   对应于符号地址 - 在静态链接的情况下,   这将返回静态库所在的二进制文件的路径   有联系。此外,NSBundle/CFBundle将检查之前的内容   堆栈从返回地址,并使用该返回地址   确定调用代码的dyld二进制路径。鉴于这些   限制,一些解决办法是可能的,例如使用-[NSBundle privateFrameworkPath]   找到嵌入式框架的路径。"

我是iOS开发的初学者,我很难使用这样的机制。使用privateFrameworksPath确实返回了一个路径,但我不知道下一步该做什么来找到我想要加载的文件。

就是这样:

NSBundle * bundle = [NSBundle bundleForClass:[self class]];
NSString * path = [bundle privateFrameworksPath]; // Works, return something like .../Frameworks
NSString * file = [path stringByAppendingPathComponent:@"MyFramework.framework/Versions/A/my-cert.der"]; 
NSData * trustedCertData = [NSData dataWithContentsOfFile:file]; // Returns nil

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

以下代码在类似情况下适用于我

NSBundle * bundle = [NSBundle bundleForClass:[self class]];
NSString * file = [bundle pathForResource:@"my-cert" ofType:@"der"];; 
NSData * trustedCertData = [NSData dataWithContentsOfFile:[file stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

NSBundle bundleForClass:方法返回当前类框架的包。因此,如果您在MyFramework中调用此方法,则无法再次使用MyFramework.framework附加路径,但如果这是您的问题,您可能会接受调试。

此外,my-cert.der中的短划线可能需要替换为%equivelent。因此stringByReplacingPercentEscapesUsingEncoding:电话。

答案 1 :(得分:0)

访问框架包

关键是传递属于框架的类的任何metatype[About]

//Objective-C
NSBundle *someBundle = [NSBundle bundleForClass:[SomeFrameworkClass class]];

//Swift

//via public framework's class
let frameworkBundle = Bundle(for: SomeFrameworkClass.self)
//or via Bundle Identifier(PRODUCT_BUNDLE_IDENTIFIER)
let frameworkBundle = Bundle(identifier: "com.someid") 
//or if it is called from the framework
let frameworkBundle = Bundle(for: type(of: self))
let frameworkBundle = Bundle(for: Self.self)

//working with bundle as usual

[Vocabulary]