应用扩展如何访问包含的应用图像/资产/资源数据

Posted

技术标签:

【中文标题】应用扩展如何访问包含的应用图像/资产/资源数据【英文标题】:how app extension can access the containing app images/assets/resource data 【发布时间】:2014-09-08 15:18:31 【问题描述】:

我自己实现了文档提供程序应用程序扩展功能 ios应用程序。问题是应用程序扩展无法访问 包含应用程序图像/资产或包含应用程序资源数据。 有谁知道如何实现它?。

【问题讨论】:

【参考方案1】:

扩展在您的 Xcode 项目中有自己的目标。为了访问扩展中的资源,您还需要将它们添加到该目标(在File Inspector 中,还要检查Target Membership 部分中的扩展目标)。请注意,这些资源也会被复制到扩展包中,这会增加您的整体应用大小。

旁注:在我的扩展程序中,我没有将我的默认图像资产目录 (Images.xcassets) 添加到扩展程序中,但仍然能够访问包含的图像。也许这是个例外。

【讨论】:

我只遵循这种方式。是的,应用程序的大小正在增加。如果我使用共享嵌入式框架(包含图像资产和公共代码),那么它会正常工作吗?它也不会增加应用程序的大小。 听起来不错。但请记住,嵌入式框架仅在 iOS 8 中受支持。 哦不...那么 ios7 发生了什么!!!?其实我想同时支持ios7和ios8。还有其他想法吗? 我也遇到了同样的问题。因为我没有很多资源,所以我现在坚持复制它们。我猜您的扩展程序没有使用应用程序使用的所有图像。因此,您可以通过将它们提取到另一个资产目录中来减小大小,并且只将此目录添加到您的扩展中。 当然,我现在将按照您的建议复制操作扩展所需的资产。感谢您的建议:-)。但是我怎样才能使公共代码路径在包含应用程序和扩展应用程序之间共享。有什么好的方法来实现它吗?。【参考方案2】:

更新 如果您支持 iOS 8 及更高版本,您可以创建一个框架以在您的应用程序及其扩展之间共享,并在其中嵌入资源、字符串等。确保使用 [UIImage imageNamed:inBundle:compatibleWithTraitCollection:]NSLocalizedStringFromTableInBundle 方法,传入作为框架的包。

以前的答案 鉴于扩展位于(并且希望始终会)在 /Plugins/PluginName 的主应用程序的子文件夹中,并且像主应用程序一样有权访问文件,您可以执行以下操作(我在我的一些商店中的应用程序):

// image
UIImage* image = [UIImage imageNamed:@"../../image_name.png"]

// data
NSString* path = [NSHomeDirectory() stringByAppendingPathComponent:@"../../file.json"];
NSData* data = [NSData dataWithContentsOfFile:path];

这将为您节省大量空间,尤其是在您的扩展程序使用大量图像时。

【讨论】:

以上是关于应用扩展如何访问包含的应用图像/资产/资源数据的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 资源文件 Adding assets and images

迁移到资产目录后,Storyboard 不显示资产

将 Flutter 应用迁移到 Flutter Web 时如何显示图像资产?

核心数据:将数据访问与应用程序和包含的扩展同步

扩展程序是不是可以访问包含应用程序的容器目录?

Angular 5:如何访问应用程序或资产文件夹之外的图像文件?