我正在创建一个地理定位应用,我想自动启动一个每次都向我发送坐标的服务。
在互联网上看,我从技术上讲它在ios上是不可能的,但是有一些方法可以解决这个问题。
我想采用无声通知。
我实现了该方法,当应用程序在backgorund中时,一切正常,但是当我打开设备并发送静默通知时,事件: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;
}
但不行,如果我发送无声通知,我只运行第一次飞行,并且只有当应用程序在backgorund中时才会运行。
如果我打开手机并通知通知将无效。
答案 0 :(得分:0)
根据Xamarin关于DidReceiveRemoteNotification的文档:
Xamarin中的[MonoTouch.Foundation.Export(&#34;应用:didReceiveRemoteNotification:fetchCompletionHandler:&#34)]
DidReceiveRemoteNotification
与原生中的application:didReceiveRemoteNotification:fetchCompletionHandler:
相同。所以,方法是正确的。
如果你强制退出应用,除非重新启动你的应用或重启设备,否则无声通知将无法启动你的应用。这是Related Apple documentation:
此外,如果您启用了远程通知后台模式,系统会启动您的应用程序(或将其从暂停状态唤醒),并在远程通知到达时将其置于后台状态。但是,如果用户强行退出,系统不会自动启动您的应用。在这种情况下,用户必须重新启动您的应用程序或重新启动设备,然后系统才会再次尝试自动启动您的应用。
关于打开设备的说明我不太清楚(在不打开应用程序的情况下解锁设备?或其他。):
但是当我打开设备并发送无声通知时
但根据application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
一旦完成处理通知,您必须在处理程序参数中调用该块,否则您的应用程序将被终止。您的应用程序有最多30秒的挂钟时间来处理通知并调用指定的完成处理程序块。 实际上,您应该在处理完通知后立即调用处理程序块。系统会跟踪应用程序后台下载的已用时间,电量使用情况和数据成本。 处理推送通知时使用大量电量的应用可能无法提前唤醒以处理未来的通知。
完成处理通知后,您必须实施completionHandler
。
在completionHandler()
的{{1}}添加DidReceiveRemoteNotification
相应位置,例如if
声明:
completionHandler(UIBackgroundFetchResult.NewData)
当你得到你想要的东西时。 completionHandler(UIBackgroundFetchResult.Failed)
在获取数据时遇到任何问题。 completionHandler(UIBackgroundFetchResult.NoData)
没有数据的时候。您的代码中似乎遗漏了它,这可能会影响无声通知。