iOS: 将图像保存在 App Group 中以便在 Apple Watch 上使用
iOS: Save images in App Group for use on Apple Watch
背景:
在我的 iPhone 应用程序中,我检索图像并将它们保存到文档目录以便更快地加载。我知道要在 Apple Watch 上使用这些图片,我必须将它们分享给 App Group。
所以,我创建了一个应用程序组,更新了我的配置文件,所有这些爵士乐。现在我的问题是我不知道如何将图像保存到 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 class returns 一个 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 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/
如果您希望多个应用访问相同的内容,请回答原始问题"sandbox"您的选项可能包括 AppGroups。
Use app groups to allow multiple apps access to shared containers and allow additional interprocess communication between apps
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 起可用)
对于 Swift3
会是-
let sharedFolderURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.your.app")! as URL
背景:
在我的 iPhone 应用程序中,我检索图像并将它们保存到文档目录以便更快地加载。我知道要在 Apple Watch 上使用这些图片,我必须将它们分享给 App Group。
所以,我创建了一个应用程序组,更新了我的配置文件,所有这些爵士乐。现在我的问题是我不知道如何将图像保存到 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 class returns 一个 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 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/
如果您希望多个应用访问相同的内容,请回答原始问题"sandbox"您的选项可能包括 AppGroups。
Use app groups to allow multiple apps access to shared containers and allow additional interprocess communication between apps
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 起可用)
对于 Swift3
会是-
let sharedFolderURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.your.app")! as URL