iOS: сохранение изображений в группе приложений для использования на Apple Watch

Фон:

В моем приложении для iPhone я получаю изображения и сохраняю их в каталог документов для быстрой загрузки. Я знаю, что для использования этих изображений на Apple Watch я должен поделиться ими с группой приложений.

Итак, я создаю группу приложений, обновляю свой профиль обеспечения, весь этот джаз. Теперь моя проблема в том, что я не знаю, как сохранить изображение в группе приложений и прочитать это изображение в моих файлах 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?

3 ответа

Решение

Если вы используете 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/

Отвечая на исходный вопрос, если вы хотите, чтобы несколько приложений имели доступ к одной и той же "песочнице", ваш вариант может включать AppGroups.

Используйте группы приложений, чтобы разрешить нескольким приложениям доступ к общим контейнерам и разрешить дополнительный межпроцессный обмен данными между приложениями

Здесь вы можете найти информацию о настройке группы приложений в разделе " Настройка групп приложений ".

После того как вы настроили 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
Другие вопросы по тегам