2017-01-17 3 views
0

Я запускаю свое приложение и планирую локальные уведомления. Это упрощенная версия кода, я использую:Локальные уведомления после перезагрузки устройства

let content = UNMutableNotificationContent() 
content.body = "Wild IBEACON appeared!" 
let region = CLBeaconRegion(proximityUUID: uuid, identifier: "iBeacon region") 
let trigger = UNLocationNotificationTrigger(region: region, repeats: true) 
let request = UNNotificationRequest(identifier: "iBeacon notification", content: content, trigger: trigger) 
notificationCenter.add(request) 

Они срабатывать, мое приложение работает в фоновом режиме. Все идет нормально.

Затем я перезапускаю устройство. Я не принуждаю к закрытию приложения.
И теперь уведомления больше не запускаются. Мне нужно снова открыть приложение.

Есть ли способ, чтобы мои расписания выдержали перезапуск?

+1

Невозможно сделать это – Vyacheslav

+0

Перезагрузив устройство, вы вынуждены покинуть приложение. Как только приложение будет закрыто, местные уведомления больше не будут работать. Для этого сценария необходимо использовать Push-уведомления. – dlbuckley

+0

вы забыли упомянуть, какая часть вашего приложения_ устанавливает уведомление; и я предполагаю, что ваше приложение __is not__ устанавливает локальное уведомление в случае завершения вашего приложения - __ только когда оно переходит на задний план. было бы здорово, если бы вы расширили свой ОП и прояснили это, пожалуйста. – holex

ответ

1

UNLocationNotificationTrigger - это новые классы-помощники, добавленные в iOS10, чтобы упростить запуск уведомлений на основе сигналов маяка или геозондирования. Согласно документации, он предназначен для использования только тогда, когда приложение находится в использовании:

приложение должно запросить доступ к услугам, и должны иметь разрешение, когда в своем использовании, чтобы использовать этот класс. Чтобы запросить разрешение на использование служб определения местоположения, вызовите метод requestWhenInUseAuthorization() CLLocationManager перед планированием любых триггеров на основе местоположения.

https://developer.apple.com/reference/usernotifications/unlocationnotificationtrigger

Исходя из вышеуказанных разрешений, приложение будет запускаться только при использовании. В документации прямо не указано, что она не будет работать в фоновом режиме, поэтому вы можете попробовать запросить всегда разрешение на размещение с requestAlwaysAuthorization() вместо requestWhenInUseAuthorization() (убедитесь, что вы положили правильный ключ в свой plist, если вы это сделаете) , чтобы узнать, помогает ли это.

Альтернативой было бы не использовать этот вспомогательный класс, а вместо этого вручную запустить CoreLocation и мониторинг радиомаяка, а затем создать свой собственный UILocalNotification вручную, когда вы получаете въездную область обратного вызова:

func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) { 
    if let region = region as? CLBeaconRegion { 
    let notificationMessage = "Wild IBEACON appeared!" 
    let notification = UILocalNotification() 
    notification.alertBody = notificationMessage 
    notification.alertAction = "OK" 
    UIApplication.shared.presentLocalNotificationNow(notification) 
    } 
} 

выше подход известен для работы через перезагрузки приложений.

+0

КогдаInUseAuthorization достаточно, потому что триггер уведомления не запускает приложение , И мой код уже работает после перезапуска _app_, но не после перезапуска _device_. В этом случае ни мой, ни ваш код не работают. –

+0

Наконец, он работает, но он нестабилен.Иногда это занимает несколько минут, а некоторые запреты Bluetooth отключены до тех пор, пока они не активируются. –

Смежные вопросы