Сохранить / Удалить в HealthKit с WatchKit и виджетом (расширение на сегодня)?
Вот вопрос, на который я знаю, есть ответ, так как я вижу приложения, которые выполняют эту функцию. Я пытался (писать напрямую, используя фоновую выборку), но ничего не работает. Я нашел приложение, которое в настоящее время находится в магазине приложений, с той функциональностью, которую я ищу. С Background Fetch, установленным на OFF, и основное приложение НЕ работает в фоновом режиме. Я иду на виджет и добавить элемент. Я открываю HealthKit и вижу данные там, как и ожидалось.
Я хотел бы сделать то же самое для моего приложения. Я хотел бы, чтобы мои сегодняшние расширения (виджеты) и / или расширения WatchKit записывали в хранилище HealthKit, даже если приложение не работает в фоновом режиме. Как я уже говорил, я протестировал приложение, которое выполняет эту функцию, хотя в документации Apple говорится следующее:
Доступ к магазину HealthKit может получить только авторизованное приложение. Вы не можете получить доступ к HealthKit из расширений (например, из представления "Сегодня") или из приложения WatchKit.
Поскольку хранилище HealthKit зашифровано, ваше приложение не может читать данные из хранилища, когда телефон заблокирован. Это означает, что ваше приложение может не иметь доступа к магазину, когда оно запускается в фоновом режиме. Тем не менее, приложения могут записывать данные в магазин, даже если телефон заблокирован. Хранилище временно кэширует данные и сохраняет их в зашифрованном хранилище, как только телефон разблокирован.
Любые ответы или идеи приветствуются. Спасибо всем.
2 ответа
Комментарий Lehn0058 об авторизации был верным. Я должен был явно запросить авторизацию у WatchKit и Today Extension, хотя авторизация уже была предоставлена в приложении. После этого оба могут написать в Health Store. Комментарий от Apple выше имеет отношение только к чтению из магазина здоровья и НЕ к записи в магазине здоровья. Вот пример кода для всех, кто сталкивается с той же проблемой. Еще раз спасибо.
В WatchKit InterfaceController.m
- (void)awakeWithContext:(id)context {
[super awakeWithContext:context];
// Configure interface objects here.
[[HealthKitManager sharedManager] requestHealthKitAccess];
}
В расширении Today TodayViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
[[HealthKitManager sharedManager] requestHealthKitAccess];
}
Хранилище данных о работоспособности действительно зашифровано, пока устройство заблокировано. Заблокированный определяется как требующий пароль на устройстве, и экран был выключен (поэтому требуется пароль или идентификатор касания, прежде чем вы сможете вернуться на главный экран). Несмотря на то, что хранилище зашифровано, из него невозможно прочитать какие-либо данные, независимо от того, работает приложение в фоновом режиме или нет. Даже настройка запросов наблюдателя во время работы приложения не позволит продолжить чтение из него. Я полагаю, что этот уровень защиты осуществляется просто с помощью возможности защиты данных с опцией NSFileProtectionComplete.
Какие функциональные возможности HealthKit вы наблюдали в этом другом приложении? Если он отображал данные шага и расстояния, то они, вероятно, получают эти данные непосредственно с шагомера ( CMPedometer), который не ограничен, когда устройство заблокировано.