Есть ли способ, чтобы мое приложение WatchKit работало в фоновом режиме?

Я новичок в Swift и WatchKit framework. Я изучаю это всего месяц. Теперь мой вопрос: возможно ли запустить приложение в фоновом режиме на Apple Watch? Я прочитал в документации, что расширения WatchKit не поддерживают режимы фонового выполнения. Но если это правда, как работать с такими приложениями, как приложение для здоровья? Я имею в виду, что на часах есть приложение под названием здоровье, которое в каждый момент времени измеряет частоту вашего пульса, даже если приложение не на переднем плане. Я бы сделал то же самое более или менее. В моем приложении я бы обнаружил ускорение пользователя только тогда, когда пользователь перемещает часы, даже если приложение не находится на переднем плане. Как я могу это сделать? Пожалуйста, опубликуйте мне необходимую документацию для этого. Большое спасибо!

Пс. Извините за мой английский!


person Joe    schedule 02.03.2017    source источник


Ответы (4)


Да, ваша может. Есть несколько способов:

  1. Начните тренировку с помощью HKWorkoutSession — наиболее эффективного способа, однако вам необходимо использовать HealthKit и только 1 приложение на Apple Watch может работать таким образом.
  2. Воспроизведение звука в фоновом режиме с помощью WKAudioFilePlayer — только для звука.
  3. WKURLSessionRefreshBackgroundTask подходит для коротких фоновых обновлений.
  4. Есть и другие фоновые задачи, например WKSnapshotRefreshBackgroundTask или WKURLSessionRefreshBackgroundTask. Они перечислены в разделе «Фоновые задачи» этой статьи.
  5. performExpiringActivity(withReason:using:) можно использовать для кратковременного продления жизни приложения, когда оно выходит из строя. на задний план.

Также прочитайте Использование технологий iOS.

person kelin    schedule 06.03.2017

В WatchOS 6+ ваше приложение для часов может запросить WKExtendedRuntimeSession (см. документацию) если он попадает в один из следующих 5 вариантов использования:

  • самостоятельное лечение
  • внимательность
  • физиотерапия
  • будильники
  • мониторинг здоровья

Соответствующее видео WWDC, объясняющее WKExtendedRuntimeSession: https://developer.apple.com/videos/play/wwdc2019/251/

person Lars Blumberg    schedule 03.10.2019
comment
Что делать, если мое приложение не попадает в эти категории? Если да, то что произойдет, если я все же выберу один из них в качестве фонового режима? - person Michael Ozeryansky; 04.02.2020
comment
Если вы выберете неподходящую категорию для своего приложения только для того, чтобы иметь возможность запускать его в фоновом режиме, я думаю, наиболее вероятно, что ваше приложение будет отклонено в процессе проверки для магазина приложений. Есть причина, по которой Apple в первую очередь выбрала эти категории, они не хотят, чтобы какой-либо разработчик приложений использовал их неправильно. - person Lars Blumberg; 04.02.2020

В watchOS 3 приложения для тренировок могут работать в фоновом режиме. У меня нет личного опыта, но посмотрите видео WWDC 2016 Создание отличных приложений для тренировок.

person Marián Černý    schedule 02.03.2017

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

  1. импортировать CoreLocation
  2. Добавить CLLocationManagerDelegate в класс
  3. Добавьте следующий код в метод willActive.

    locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.requestWhenInUseAuthorization()
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.distanceFilter = kCLDistanceFilterNone
    if #available(watchOSApplicationExtension 3.0, *) {
        locationManager.startUpdatingLocation()
    } else {
        // Fallback on earlier versions
    }
    
    if #available(watchOSApplicationExtension 4.0, *) {
        locationManager.allowsBackgroundLocationUpdates = true
    } else {
       print("Location not updated")
    }
    
  4. И в последнем просто добавьте CLLocationManagerDelegate

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    print("Location updated\(locations)")
}

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
    print("Location_update_error\(error)")
}

Возможно, это решит вашу проблему.

person gurmeet kaur    schedule 22.06.2018