我需要在应用程序和扩展程序之间共享捆绑的资源。起初,我想我可以在第一次启动时将它们复制到共享组区域,但如果用户调用扩展程序并且从未启动应用程序怎么办?
正如 mxcl 所说,您可以在两个目标中包含资产,但这会扩大最终提交的二进制文件的大小。
我已经确认将资产放入框架中可以在 Xcode 6.1 中使用(它以前可能有效,但我现在只是在尝试):
您可以在框架或资产目录中拥有独立的图像。两者都可以。
在框架中,只需设置一个具有返回UIImage 对象的访问器方法的类。像这样的东西(Objective-C):
@implementation AssetService
+ (UIImage *)frameworkImageNamed:(NSString *)name {
return [UIImage imageNamed:name
inBundle:[NSBundle bundleForClass:[self class]]
compatibleWithTraitCollection:nil];
}
@end
或者在 Swift 中:
public class AssetService {
public init() {
}
// class method version
public class func frameworkImageNamed(name: String) -> UIImage? {
return UIImage(named: name,
inBundle: NSBundle(forClass: AssetService.self),
compatibleWithTraitCollection: nil)!
}
}
请注意,由于上述代码在框架内,但将在“应用程序空间”中运行,因此您需要指定捆绑包。
然后,您的应用或扩展程序只需在框架中链接,并调用[AssetService frameworkImageNamed:@"myimage"] 或AssetService.frameworkImageNamed("myimage")。
警告:尽管返回了可选的UIImage?,但如果找不到命名的图像,代码会非常生气并且会崩溃。但如果它是你自己的框架,你应该知道里面有什么并抓住这种错误。