Модал с домашнего экрана закончил отображаться при запуске приложения из фона - PullRequest
1 голос
/ 12 февраля 2020

Фон

В приложении есть функция для запуска фона с использованием службы определения существенных изменений (https://developer.apple.com/documentation/corelocation/getting_the_user_s_location/using_the_significant-change_location_service).

Эта функция iOS, которая при приложение обнаруживает значительные изменения в местоположении, приложение запускается в фоновом режиме. Он запускается непосредственно в фоновом режиме, поэтому пользователь не заметит, что приложение запущено (если только не пишет код для уведомления пользователей. ie. Отправляет локальный pu sh или et c.), Однако приложение полностью запускается, поэтому Метод didFinishLaunchingWithOptions в App Delegate вызывается при запуске.

Ситуация

Когда наше приложение запускается с помощью функции «Изменение местоположения», мы отправляем локальное уведомление pu sh пользователю, уведомляющее, что расстояние пользователь недавно прошел (мы добавили шагомер в наше приложение). На этом этапе наше приложение запускается в фоновом режиме.

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

На контроллере домашнего просмотра мы наблюдаем UIApplication.didBecomeActiveNotification, и при обнаружении этого уведомления мы делаем запрос API. Ответ API может содержать поле вознаграждения (обнуляемое), и когда вознаграждение не равно нулю, мы показываем полученное вознаграждение модально.

// Observe app state changes to active

let center = NotificationCenter.default

center.addObserver(
  self,
  selector: #selector(callRewardAPI), // calls api when detecting notification
  name: UIApplication.didBecomeActiveNotification, // <- didBecomeActiveNotification
  object: nil
)
func callRewardAPI {
  usecase.callRewardAPI)()
}

// Show modal when received API response

extension: HomeViewController, HomeUseCaseOutput {
  func didReceiveReward() {
    let vc = RewardReceivedViewController()

    vc.modalTransitionStyle = .crossDissolve
    vc.modalPresentationStyle = .overFullScreen

    self.present(vc, animated: true, completion: nil)
  }
}


Задача

Ожидается

Мы ожидаем увидеть модальную анимацию RewardReceivedViewController.

Actual

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

Мы совершенно уверены, что модальное отображение было завершено при запуске, так как представление отображалось на анимации масштабирования при запуске нашего приложения (анимация iOS от яблока, представление приложения которого увеличивается, чтобы заполнить экран устройства при запуске приложения) показывает отображаемый модал.

Что-то, что нас смущает, так это то, что это происходит не всегда, а происходит несколько раз, а затем перестает происходить (ведет себя как должно) несколько раз. Мы проверили это на том же git коммите.

Что-то, что мы попробовали

Мы попытались смоделировать проблему, вызвав модальное отображение сразу после получения UIApplication.didBecomeActiveNotification.

func callRewardAPI {

  // Call didReceiveReward right away to show modal.
  self.ouptut.didReceiveReward()

  /*
  self.rewardAPI.request { [weak self] result in
    switch result {
      case .success(let reward):
        self.ouptut.didReceiveReward()
      case .failure:
        // error case
    }
  }
  */
}

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

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

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