在应用和扩展程序之间共享捆绑资产

dai*_*dai 19 objective-c ios8

我的照片共享扩展程序计划使用相同的设计资产(用于导航以及为照片添加"图章/贴纸").

如App Sandbox设计指南中所述,需要共享文件和其他信息的沙盒应用程序组可以请求容器目录作为其权利的一部分.这些目录存储在〜/ Library/Group Containers /中.https://developer.apple.com/documentation/foundation/nsfilemanager/1412643-containerurlforsecurityapplicati

目前,资产被捆绑或下载并添加到Documents文件夹中.如果我想使用照片共享扩展程序中的资产,是否有意义将所有内容放入~/Library/Group Containers/容器应用程序和扩展程序中从那里获取资产?

det*_*man 37

关于共享数据:

如果要在iOS8扩展和Containing应用程序之间共享文件,则需要将文件写入共享容器或使用共享用户默认值.

来自Apple的iOS8当前文档:

默认情况下,您的应用及其扩展程序无法直接访问彼此的容器

您想要创建一个应用程序组,并将包含应用程序及其扩展名添加到该组.使用Xcode 6非常简单,这里是如何在xcode中完成的:

如何使用xcode 6创建应用程序组

在应用程序组名称中,输入一个常量,如:

group.com.bundle.app.soething
Run Code Online (Sandbox Code Playgroud)

这将为您的包含应用和扩展创建一个共享容器,它允许:

编辑这将打印出我们拥有的所有路径组合:

// App group's path

NSURL  *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.test.app"];

NSLog(@"App group: %@", containerURL.path);



// Bundle path

NSLog (@"Bundle: %@", [[NSBundle mainBundle] bundlePath]);



// Good old Documents path

NSArray *Paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *path = [Paths objectAtIndex:0];

NSLog(@"Documents: %@ ", path);
Run Code Online (Sandbox Code Playgroud)

编辑 - 和Swift:

我希望这可以帮助你 :)

资源:Apple的iOS8.0扩展程序开发指南 - https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW1

Apple的iOS8.0 NSFileManager类参考 - https://developer.apple.com/documentation/foundation/nsfilemanager/1412643-containerurlforsecurityapplicati


gre*_*heo 8

我需要在应用和扩展程序之间共享捆绑资源.起初,我想我可以在首次启动时将它们复制到共享组区域,但是如果用户调用扩展并且从不启动应用程序呢?

正如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
Run Code Online (Sandbox Code Playgroud)

或者在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)!
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,由于上面的代码框架,但将在"app space"中运行,因此您需要指定bundle.

然后,您的应用或扩展程序可以只在框架中链接,并调用[AssetService frameworkImageNamed:@"myimage"]AssetService.frameworkImageNamed("myimage").

警告:尽管返回一个可选UIImage?代码,如果代码找不到已命名的图像并且会崩溃,代码会非常生气.但如果它是你自己的框架,你应该知道那里有什么,并抓住这种bug.


Ste*_*ber 2

听起来您想改用框架。但是,您的框架主要是资源而不是代码:

\n\n
\n

OS X 广泛使用框架来分发共享代码和资源,例如系统本身的接口。您可以创建自己的框架,为您公司的一个或多个\xe2\x80\x99s 应用程序提供共享代码和资源。您还可以创建包含类库或附加模块的框架,以便将它们分发给其他开发人员。

\n
\n\n

https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPFrameworks/Frameworks.html#//apple_ref/doc/uid/10000183i

\n