Расширение WatchKit не видит данные, сохраненные в NSUserDefaults с группой приложений

Я просмотрел массу сообщений SO, и это ИСПОЛЬЗОВалось для работы, но перестало работать. Не знаю, что случилось. Я разработал это приложение для iPhone + WatchKit с watchOS 1.0, и все работало нормально.

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

  1. Группы приложений включены в Xcode в главном приложении и в расширении WatchKit. Я даже пробовал включить его для приложения WatchKit.

  2. Имя моей группы называется «group.com.mycompany.myapp» (с моим настоящим названием компании и названием приложения), и оно выбрано для всех целей.

  3. Я подтвердил, что настройки сборки для моего хост-приложения и расширения WatchKit ссылаются на файлы прав, и я проверил, что эти файлы прав содержат параметр безопасности групп приложений для выбранной мной группы приложений.

  4. Я убедился, что идентификаторы пакетов различны для хост-приложения, расширения watchkit и приложения watchkit. Я использую com.mycompany.myapp, com.mycompany.myapp.watchkitextension и com.mycompany.myapp.watchkitapp соответственно.

Вот несколько снимков экрана моей конфигурации Xcode для хост-приложения, расширения watchkit и приложения watchkit, на всякий случай:

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

Вот код в моем хост-приложении, который может правильно читать данные:

NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kAppGroupName];
NSLog(@"app defaults: %@", [defaults dictionaryRepresentation]);

Это производит это в моей консоли, где kKeyEmployeeId и kKeyStoreNumber - это данные, которые я пытаюсь передать между хостом и часами.

2015-12-13 13:51:35.618 MyApp[27516:16126253] app defaults: {
    AppleLanguages =     (
        "en-US",
        en
    );
    INNextHearbeatDate = "472211882.83309";
    NSInterfaceStyle = macintosh;
    NSLanguages =     (
        "en-US",
        en
    );
    "com.apple.content-rating.AppRating" = 1000;
    "com.apple.content-rating.ExplicitBooksAllowed" = 1;
    "com.apple.content-rating.ExplicitMusicPodcastsAllowed" = 1;
    "com.apple.content-rating.MovieRating" = 1000;
    "com.apple.content-rating.TVShowRating" = 1000;
    kKeyEmployeeId = Kenny;
    kKeyStoreNumber = 001;
}

В моем расширении WatchKit у меня такой же код, но он не предоставляет мне две пары ключ: значение, которые мне нужны:

- (void)awakeWithContext:(id)context {
    [super awakeWithContext:context];

    NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kAppGroupName];
    NSLog(@"defaults: %@", [defaults dictionaryRepresentation]);

}

Он производит это, что очень похоже на приведенное выше, но без двух ключей, которые мне действительно нужны:

2015-12-13 13:28:29.840 MyApp WatchKit Extension[720:322804] defaults: {
    AppleLanguages =     (
        en
    );
    INNextHearbeatDate = "472434306.599217";
    NSInterfaceStyle = macintosh;
    NSLanguages =     (
        en
    );
    "com.apple.content-rating.AppRating" = 1000;
    "com.apple.content-rating.ExplicitBooksAllowed" = 1;
    "com.apple.content-rating.ExplicitMusicPodcastsAllowed" = 1;
    "com.apple.content-rating.MovieRating" = 1000;
    "com.apple.content-rating.TVShowRating" = 1000;
}

kAppGroupName и другие константы определены так:

NSString * const kAppGroupName = @"group.com.inadaydevelopment.MyApp";
NSString * const kKeyStoreNumber = @"kKeyStoreNumber";
NSString * const kKeyEmployeeId = @"kKeyEmployeeId";

person Kenny Wyland    schedule 13.12.2015    source источник


Ответы (3)


В Watch OS1 это сработало, но в Watch OS2 произошли некоторые изменения. Вам нужно использовать что-то под названием WatchConnectivity, чтобы отправить данные, которые вы хотите сохранить, на часы. Затем, когда часы получат отправленные вами данные, сохраните их в NSUserDefaults по умолчанию для часов Apple.

WCSession.defaultSession() вернет WCSession синглтон для передачи данных между iOS и приложением Watch.

Вот руководство и пример.

person Rashwan L    schedule 13.12.2015

Поскольку приложения watch os 2 работают на часах, а не на iPhone, я не думаю, что у вас есть доступ к NSUserDefaults или группам приложений. Вам нужно будет использовать платформу WatchConnectivity для передачи данных на часы и обратно.

person rounak    schedule 13.12.2015

Вы можете выполнить следующие действия

1) установить сеанс

if ([WCSession isSupported])
{
    [[WCSession defaultSession] setDelegate:self];
    [[WCSession defaultSession] activateSession];
}

2) Подготовьте словарь данных и отправьте его с помощью метода ниже

[WCSession defaultSession] sendMessage:dataDict replyHandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) {

            //You task on completion

        } errorHandler:^(NSError * _Nonnull error) {

            if (error)
            {
                //Handle the error
            }
        }];

3) И в коде приложения для часов вы можете установить метод делегата

 - (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message replyHandler:(void(^)(NSDictionary<NSString *, id> *replyMessage))replyHandler
    {
          //Handle the response
    }
person Hitesh Sultaniya    schedule 04.12.2017