Закрытое приложение запускает событие:didReceiveRemoteNotification:

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

Глядя в интернет, я читал, что технически это невозможно на ios, но есть несколько способов преодолеть проблему.

Я хотел принять молчаливое уведомление.

Я реализовал метод, и когда приложение находится в фоновом режиме, все работает, но когда я включаю устройство и отправляю тихое уведомление, событие: didReceiveRemoteNotification: не срабатывает. или даже когда я закрываю приложение из переключателя приложений и затем отправляю уведомление, не срабатывает.

Я хотел знать, если что-то не так, если вы можете сделать это.

PS: я использую: didReceiveRemoteNotification: и нет приложения: didReceiveRemoteNotification: fetchCompletionHandler: (это может быть проблема?)

Мой код в AppDelegate:

 public override async   void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> 
   completionHandler)
        {

             await Manager.SendPosition(completionHandler);
        }

в моем FinishedLaunching:

if (Convert.ToInt16(UIDevice.CurrentDevice.SystemVersion.Split('.')[0].ToString()) < 8)
            {
                UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | 
                UIRemoteNotificationType.Sound;
                UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes);
            }
            else
            {
                UIUserNotificationType notificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound;
                var settings = UIUserNotificationSettings.GetSettingsForTypes(notificationTypes, new NSSet(new string[] { }));
                UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
                UIApplication.SharedApplication.RegisterForRemoteNotifications();
            }

и в моем info.plist:

   <key>UIBackgroundModes</key>
      <array>
        <string>location</string>
        <string>remote-notification</string>
      </array>

ОБНОВИТЬ:

public async Task<bool> SendPosition(Action<UIBackgroundFetchResult> completionHandler = null)
        {
            StartLocationUpdates();
            var setting = ConnectDb()?.Table<Settings>().FirstOrDefault() ?? new Settings();
            _currentLong = 14.52538;
            _currentLat = 36.82842;
            if (_currentLong != 0 && _currentLat != 0)// && setting.TimeNotification != 0)
            {
                var objectSend = new
                {
                    unique_key = setting.UniqueKey, 
                    lat = _currentLat,
                    lng = _currentLong, 
                    idPlayerOneSignal = setting.IdPlayerOneSignal,
                    token = "" 
                };

                var client = new HttpClient { BaseAddress = new Uri("http://amywebservice.com/") };
                var data = JsonConvert.SerializeObject(objectSend);

                var content = new StringContent(data, Encoding.UTF8, "application/json");
                var response = await client.PostAsync("api/setPosition", content);
                if (response.IsSuccessStatusCode)
                {
                    var successResult = response.Content.ReadAsStringAsync().Result;
                    Debug.WriteLine("k", successResult);
                    if (completionHandler != null)
                    {
                        completionHandler(UIBackgroundFetchResult.NoData);
                    }
                    return true;
                }
                else
                {
                    var failureResulr = response.Content.ReadAsStringAsync().Result;
                    Debug.WriteLine("f", failureResulr);
                    if (completionHandler != null)
                    {
                        completionHandler(UIBackgroundFetchResult.NoData);
                    }
                    return false;
                }
            }
            return false;
        }

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

Если я включу телефон и уведомлю, уведомление не будет работать.

1 ответ

  1. Согласно документации Xamarin по DidReceiveRemoteNotification:

    [MonoTouch.Foundation.Export ("Применение:didReceiveRemoteNotification:fetchCompletionHandler:")]

    DidReceiveRemoteNotification в Xamarin так же, как application:didReceiveRemoteNotification:fetchCompletionHandler: в родной. Итак, метод правильный.

  2. Если у вас принудительный выход из приложения, автоматическое уведомление не запустит ваше приложение, пока вы не перезапустите приложение или не перезапустите устройство. Вот соответствующая документация Apple:

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

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

    но когда я включаю устройство и отправляю тихое уведомление

    Но в соответствии с приложением (_:didReceiveRemoteNotification:fetchCompletionHandler:)

    Как только вы закончите обработку уведомления, вы должны вызвать блок в параметре обработчика, иначе ваше приложение будет закрыто. Ваше приложение имеет до 30 секунд времени настенных часов для обработки уведомления и вызова указанного блока обработчика завершения. На практике вам следует вызывать блок обработчика, как только вы закончите обработку уведомления. Система отслеживает затраченное время, энергопотребление и стоимость данных для фоновых загрузок вашего приложения. Приложения, которые используют значительную мощность при обработке push-уведомлений, не всегда могут быть разбужены рано для обработки будущих уведомлений.

    Вы должны реализовать completionHandler когда вы закончите обработку уведомления.

    добавлять completionHandler() в DidReceiveRemoteNotification в соответствующих местах, таких как if заявление:

    • completionHandler(UIBackgroundFetchResult.NewData) когда ты получишь то, что хочешь.
    • completionHandler(UIBackgroundFetchResult.Failed) когда есть проблемы с получением данных.
    • completionHandler(UIBackgroundFetchResult.NoData) когда нет данных.

    Похоже, что это пропущено в вашем коде, что может повлиять на тихое уведомление.

Другие вопросы по тегам