繁体   English   中英

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

[英]How to retrieve a file/resource in a iOS framework bundle from a main program?

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

如果我们阅读与链接帖子相关的主题,似乎是不可能的。 但是,提到了以下博客文章 我们可以阅读:

“静态框架不能完全替代标准框架——访问框架资源的标准方法,例如+[NSBundle bundleForClass:]不会返回预期的包。包路径是通过查询 dyld 对应的库路径来确定的符号地址——在 static 链接的情况下,这将返回 static 库链接到的二进制文件的路径。此外, 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

有任何想法吗?

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

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:调用。

访问框架包

关键点是传递属于框架的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

[词汇]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM