iOS:将图像保存在 App Group 中以在 Apple Watch 上使用

Posted

技术标签:

【中文标题】iOS:将图像保存在 App Group 中以在 Apple Watch 上使用【英文标题】:iOS: Save images in App Group for use on Apple Watch 【发布时间】:2015-10-16 20:10:59 【问题描述】:

背景:

在我的 iPhone 应用程序中,我检索图像并将它们保存到文档目录以便更快地加载。我知道要在 Apple Watch 上使用这些图像,我必须与应用组共享它们。

所以,我创建了一个应用组,更新了我的配置文件,所有这些都是爵士乐。现在我的问题是我不知道如何将图像保存到 App Group 并在我的 WatchKit 文件中读取该图像。

这是我尝试将图像保存到应用组的方法:

NSString *container = @"group.com.appName.watchdatasharing";

NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:container];

[defaults setValue:UIImagePNGRepresentation([FileManager readImageFromFileWithName:@"icon1_imgUrl"]) forKey:@"icon1_imgUrl"];
注意:我的 FileManager 类返回一个 UIImage

为了在我的 WatchKit 应用中检索图像,我使用以下代码:

NSString *container = @"group.com.fantrac.watchdatasharing";

NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:container];

NSData* imageData = [defaults valueForKey:@"icon1_imgUrl"];
UIImage* image = [UIImage imageWithData:imageData];

[tableRow.iconImage setImage:image];

问题:

我在 Apple Watch 上测试时没有显示图像。为了在我的应用和 Apple Watch 之间保存/检索图像,我需要做些什么不同的事情?

【问题讨论】:

您使用的是 watchOS 1 还是 2? watchOS 2 无法访问共享应用组。 我正在使用 watchOS 2.... 很奇怪,您能否建议另一种解决方案来使用保存在手表上我的应用程序的文档目录中的图像? 您必须使用WatchConnectivity 框架并使用WCSession 上的transferFile:metadata: 方法将文件从手机传输到手表,然后将文件保存在手表自己的文档目录中。 这听起来比我的其他方法更容易使用,谢谢!还有一件事 - 我需要将其设置为能够同时执行这两种方式...因为某些手表设备将具有 OS 1 和某些 OS 2? 如果您也有 watchOS 1 应用程序,那么是的,您应该继续将图像存储在应用程序组中,以便使用 watchOS 1 的人可以访问它们。 【参考方案1】:

如果您使用 watchOS 2,则可以使用 WatchConnectivity。我附上一个示例代码供您参考。

在 iPhone 上:

// Create a Watch Connectivity session
- (void)viewDidLoad

    [super viewDidLoad];

    self.applicationDict = @@"foo" : @"bar";

    if ([WCSession isSupported]) 
        WCSession *session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
    


// Transfer file to Apple Watch 
- (IBAction)fileTransferButtonTapped:(id)sender

    // File Transfer
    NSURL *url = 
    [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"sample" ofType:@"png"]];
    WCSessionFileTransfer *fileTransfer = 
    [[WCSession defaultSession] transferFile:url
                                    metadata:self.applicationDict];

观看:

// Receive file from iPhone
- (void)session:(nonnull WCSession *)session didReceiveFile:(nonnull WCSessionFile *)file

    // recieve file

参考。 http://www.kristinathai.com/watchos-2-how-to-communicate-between-devices-using-watch-connectivity/

【讨论】:

这太好了,watchOS 1 可以与 WatchConnectivity 一起使用吗?我发现的所有内容都只涉及 watchOS 2 的 WatchConnectivity 框架 WatchConnectivity 在 watchOS 1 中不可用。【参考方案2】:

如果您希望多个应用访问同一个“沙盒”,请回答原始问题,您的选项可能包括 AppGroups。

使用应用组允许多个应用访问共享容器并允许应用之间进行额外的进程间通信

here您可以在配置应用组部分找到如何配置应用组的信息。

一旦您配置了 AppGroup 并为您的应用添加了正确的权利,您就可以使用以下代码访问一个通用容器:

NSString * kSharedAppGroup = @"group.com.appName.watchdatasharing";

+ (NSURL*)commonStoreUrl 
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSURL *modelDestUrl = [[fileManager containerURLForSecurityApplicationGroupIdentifier:kSharedAppGroup] URLByAppendingPathComponent: kStoreName];
    return modelDestUrl;

用法:

NSURL *commonContainer = [Someclass commonStoreUrl];

如果您的应用程序需要访问公共数据库,这将很有用,无论如何,如果您的场景只是从手表到 ios 应用程序的琐碎信息,请使用 WCSession。 (仅从 watchkit 2.2 开始可用)

【讨论】:

【参考方案3】:

对于 Swift3

会-

let sharedFolderURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.your.app")! as URL

【讨论】:

以上是关于iOS:将图像保存在 App Group 中以在 Apple Watch 上使用的主要内容,如果未能解决你的问题,请参考以下文章

将相册中的照片添加到应用程序中以在 tableView 中显示 - IOS

IOS App 将图像保存在内存中

为啥我不能在 iOS 上离开键盘以在 React Native App 中发送帖子?

对于表中的行,将行保存在临时表中以在 plpgsql 的选择查询中使用其数据

如何在 ios 4 中以编程方式将图像数组添加到 Imageview?

在 iOS 中以编程方式将图像集添加到 images.xcassets 目录?