Почему симулятор Xcode запускает приложение с вызовом didEnterRegion, а iPhone - нет? - PullRequest
0 голосов
/ 06 марта 2019

Я устраняю неполадки в цикле запуска приложения на основе определения местоположения, который прекрасно работает на симуляторе iOS, но, очевидно, не запускает приложение на реальном устройстве.

Я настроил уведомления для входных и выходных событий. И симулятор, и устройства регистрируют и отображают эти уведомления.

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

На симуляторе вызывается код didEnterRegion, и я могу пройти по следующему коду запуска с помощью отладчика - успех.

Однако, когда я вынимаю устройство (на прогулку), все, что я получаю, это UNNotifications и никакой запуск приложения (что я могу сказать из пользовательского интерфейса в приложении на реальном устройстве)

Я уверен, что мне нужно улучшить мою стратегию тестирования (добро пожаловать в предложения!), Но на этом этапе я должен быть в состоянии ожидать, что приложение должно вести себя одинаково на симуляторе и реальном устройстве - это не так.

Почему ожидаемый результат происходит на симуляторе, а не на устройстве?

LocationService.swift

func handleRegionEnterEvent (for region: CLRegion) {
    ApplicationController.sharedInstance.didEnterRegion(region)
}

func handleRegionExitEvent (for region: CLRegion) {
    ApplicationController.sharedInstance.didExitRegion(region)
}

ApplicationController.swift

func didEnterRegion (_ region: CLRegion) {
    // Present Alert
    delegate?.handleUNEvent(note: "ENTER: \(region.identifier)")

    // Start launch cycle

}

AppDelegate.swift

extension AppDelegate: AppControllerDelegate {
    func handleUNEvent(note: String?) {
        // Show an alert if application is active
        if UIApplication.shared.applicationState == .active {
            guard let message = note else { return }
            Alert().showAlert(withMessage: "Application received UN while active: \(message)", title: "UNNotification")
        } else {
            // Otherwise present a local notification
            guard let body = note else { return }
            let notificationContent = UNMutableNotificationContent()
            notificationContent.body = body
            notificationContent.sound = UNNotificationSound.default
            notificationContent.badge = UIApplication.shared.applicationIconBadgeNumber + 1 as NSNumber
            let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
            let request = UNNotificationRequest(identifier: "location_change",
                content: notificationContent,
                trigger: trigger)
            UNUserNotificationCenter.current().add(request) { error in
                if let error = error {
                    print("Error: \(error)")
                }
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Что произошло: код, выполненный на симуляторе, действительно зависал на устройстве, и я не просматривал журналы сбоев с устройства. Этот вопрос возник из-за проблемы, которая не связана ни с ios, ни с ядром.

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

Однако, когда я вынимаю устройство (на прогулку), все, что я получаю, это UNNotifications и никакой запуск приложения (что я могу сказать из пользовательского интерфейса в приложении на реальном устройстве)

Я ошибался, полагая, что a) пользовательские уведомления, которые появляются, когда приложение не запущено, представлены системой (в виде баннеров), и b) приложение запускается в другом процессе. На самом деле мой собственный код специально выполняет код, который заставляет эти уведомления появляться. Лицом к лицу: копирование кода из учебных пособий для достижения быстрых результатов тестирования, даже не пытаясь понять, что делает код, может привести к этому.

В Xcode подключите ваше устройство и нажмите command-shift-2, чтобы открыть окно «Устройства и симуляторы». Выберите устройство слева и нажмите кнопку «Просмотр журналов», чтобы открыть журнал аварий.

0 голосов
/ 06 марта 2019

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

Что-топроверьте, чтобы убедиться, что у вас есть описания для конкретных разрешений местоположения, которые вы запрашиваете в связи с настройкой местоположения.Для входа в регионы вы, вероятно, захотите убедиться, что у вас есть «всегда» доступ.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...