Закрытое приложение запускает событие: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 ответ
Согласно документации Xamarin по DidReceiveRemoteNotification:
[MonoTouch.Foundation.Export ("Применение:didReceiveRemoteNotification:fetchCompletionHandler:")]
DidReceiveRemoteNotification
в Xamarin так же, какapplication:didReceiveRemoteNotification:fetchCompletionHandler:
в родной. Итак, метод правильный.Если у вас принудительный выход из приложения, автоматическое уведомление не запустит ваше приложение, пока вы не перезапустите приложение или не перезапустите устройство. Вот соответствующая документация Apple:
Кроме того, если вы включили фоновый режим удаленных уведомлений, система запускает ваше приложение (или выводит его из приостановленного состояния) и переводит его в фоновое состояние при поступлении удаленного уведомления. Однако система не запускает ваше приложение автоматически, если пользователь принудительно завершил его. В этой ситуации пользователь должен перезапустить ваше приложение или перезапустить устройство, прежде чем система попытается снова запустить ваше приложение автоматически.
Мне не очень понятно в вашем описании о включении устройства (разблокировать устройство без открытия приложения? Или др.) Здесь:
но когда я включаю устройство и отправляю тихое уведомление
Но в соответствии с приложением (_:didReceiveRemoteNotification:fetchCompletionHandler:)
Как только вы закончите обработку уведомления, вы должны вызвать блок в параметре обработчика, иначе ваше приложение будет закрыто. Ваше приложение имеет до 30 секунд времени настенных часов для обработки уведомления и вызова указанного блока обработчика завершения. На практике вам следует вызывать блок обработчика, как только вы закончите обработку уведомления. Система отслеживает затраченное время, энергопотребление и стоимость данных для фоновых загрузок вашего приложения. Приложения, которые используют значительную мощность при обработке push-уведомлений, не всегда могут быть разбужены рано для обработки будущих уведомлений.
Вы должны реализовать
completionHandler
когда вы закончите обработку уведомления.добавлять
completionHandler()
вDidReceiveRemoteNotification
в соответствующих местах, таких какif
заявление:completionHandler(UIBackgroundFetchResult.NewData)
когда ты получишь то, что хочешь.completionHandler(UIBackgroundFetchResult.Failed)
когда есть проблемы с получением данных.completionHandler(UIBackgroundFetchResult.NoData)
когда нет данных.
Похоже, что это пропущено в вашем коде, что может повлиять на тихое уведомление.