Nano Hash - криптовалюты, майнинг, программирование

Оповещения о геозонах / локальные уведомления не пробуждают заблокированный телефон при срабатывании

Я делаю приложение, которое использует круглые области для геозон. Когда телефон активен или приложение открыто, уведомления о геозонах работают нормально как в симуляторе, так и на устройстве (iPhone 6 под управлением 10.3.1).

В симуляторе работает нормально; Когда пользователь входит в регион, он просыпается, издает звук и показывает предупреждение на экране блокировки.

На телефоне звонки делегата "didEnterRegion" происходят при въезде в регион (логирую некоторые сообщения) но телефон не выдает оповещение и не просыпается. Когда я нажимаю кнопку «Домой» один раз, я вижу оповещение на экране блокировки, но я хочу, чтобы оно просыпалось и отображало оповещение мгновенно — например, когда я получаю сообщение. В симуляторе работает, поэтому интересно, что может быть не так? У меня это сработало несколько раз, когда оповещение показывалось как на телефоне, так и на моих часах, но в 95% случаев оно не работает — уведомления генерируются, но видны только в том случае, если я вручную разбудил телефон.

Как это исправить?

Вот код, который я использую для создания локального уведомления:

        // https://blog.codecentric.de/en/2016/11/setup-ios-10-local-notification/


        let location = CLLocation(latitude: item.coordinate.latitude, longitude: item.coordinate.longitude)
        GeoTools.decodePosition(location: location) {
            (address, city) in
            let content = UNMutableNotificationContent()
            content.title = "Camera nearby!"
            content.subtitle = item.id
            content.body = "\(address), \(city)"
            content.categoryIdentifier = Constants.notificationCategoryId
            content.sound = UNNotificationSound.default()
            content.threadIdentifier = item.id

            // FIXME make action for clicking notification

            let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 0.001, repeats: false) // FIXME HACK

            let request = UNNotificationRequest(identifier: "camNotification", content: content, trigger: trigger)

            let unc = UNUserNotificationCenter.current()
            unc.removeAllPendingNotificationRequests()
            unc.add(request, withCompletionHandler: { (error) in
                if let error = error {
                    print(error)
                }
                else {
                    print("completed")
                }

            })

        }

Ответы:


1

Вот некоторый код, который я только что проверил, будит устройство при представлении уведомления:

let message = "CLRegion event"
// Show an alert if application is active:
if UIApplication.shared.applicationState == .active {
    if let viewController = UIApplication.shared.keyWindow?.rootViewController {
        showSimpleAlertWithTitle(nil, message: message, viewController: viewController)
    }
}
else {
    // Otherwise app is in background, present a local notification:
    let content = UNMutableNotificationContent()
    content.body = message
    content.sound = UNNotificationSound.default()
    content.categoryIdentifier = "message"

    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1.0, repeats: false)
    let request = UNNotificationRequest(identifier: "com.foobar", content: content, trigger: trigger)
    UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}

На самом деле единственная разница в том, что я не вызываю removeAllPendingNotifications(), поэтому, если вы должны удалить уведомления, интересно, может ли removePendingNotificationRequests(withIdentifiers identifiers: [String]) быть более точным?

26.06.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..