我使用有关为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
有什么想法吗?
答案 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