gpt4 book ai didi

ios - 应用程序在几秒钟后被 ios7 中的操作系统杀死 - 编辑

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:28:47 26 4
gpt4 key购买 nike

我正在为 iOS 7 创建基于导航的应用程序,为此我正在获取用户位置数据,使用 CoreLocation 框架,

应用程序要求在特定时间开始在后台获取用户位置,为此我使用 didReceiveRemoteNotification fetchCompletionHandler: 方法实现了静默推送通知,

我已经成功实现这个使用Silent Pushnotification & 它调用startUpdatingLocation,我能够在委托(delegate)方法中获取位置数据:

使用这个负载:

{"aps": {"content-available": 1},"SilentPush": "4"}

我已经为后台模式启用了位置远程通知:

enter image description here

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler
{
__block UIBackgroundTaskIdentifier bgTask =0;
UIApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[self.locationManager startUpdatingLocation];

}];

didUpdateLocations

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
lastLoc=[locations lastObject];
[logFile addLocObject:[NSString stringWithFormat:@"Loc: %@",lastLoc]];
}

但问题是:

几秒钟后,位置类的委托(delegate)方法停止,如果设备正在移动,它不会发送任何数据,当我将应用程序发送到前台时,它会调用“didFinishLaunhing”方法,所以我猜操作系统会终止应用程序,即使位置是更新, 在设备 Diagnostics & usage 中,我收到以下崩溃报告:

Application Specific Information:
MockUpApp2[390] has active assertions beyond permitted time:
{(
<BKProcessAssertion: 0x145ac790> identifier: Called by MockUpApp2, from -[AppDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:] process: MockUpApp2[390] permittedBackgroundDuration: 40.000000 reason: finishTaskAfterBackgroundContentFetching owner pid:390 preventSuspend preventIdleSleep preventSuspendOnSleep
)}

昨天我问过this question现在我可以通过推送通知在后台启动位置管理器,

所以请任何人都可以解决这个问题。

谢谢。

注意:如果我在 Debug模式下运行应用程序,意味着我通过 XCode 运行应用程序并且没有停止它或没有断开连接,应用程序将运行。在这种情况下,应用程序不会被操作系统停止。

编辑 1

根据@Stephen Darlington 的回答,如果我删除所有 backgroundfacher喜欢,

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler
{
[self.locationManager startUpdatingLocation];

}

现在应用程序不会调用 didUpdateLocations 一次,:(

这个方法应该写什么?

编辑 2

根据 Apple Doc说:

如果您的应用挂起或未运行,系统会在调用该方法之前唤醒或启动您的应用并将其置于后台运行状态。

那么,只要我启用了位置背景模式,应用程序是否应该在后台运行?

最佳答案

我不认为 iOS 上的后台处理以您期望的方式工作。它不像在 Mac 或 Windows 上那样可以在后台无限期运行(即使 iOS 7 发生了变化)。

因此,直接回答您的问题:您启动了一个可以在后台继续运行的任务。有两个“但是”。

  1. 代码块是过期处理程序。它不是您要在后台运行的代码。此代码将在后台任务超时之前执行(因此在您的情况下,它会在您的应用程序被终止之前不久执行)。 Apple 并没有真正记录那是多长时间,但看起来好像你得到了大约 40 秒。您要在后台运行的代码是 after beginBackgroundTaskWithExpirationHandler 行。完成后说 endBackgroundTask:
  2. 其次,位置更新在后台工作,无需所有 beginBackgroundTaskWithExpirationHandler: 东西。即使应用程序在后台,也会调用委托(delegate)方法

总结一下:删除 beginBackgroundTaskWithExpirationHandler: 语句。您只需添加 startUpdatingLocation:

关于ios - 应用程序在几秒钟后被 ios7 中的操作系统杀死 - 编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21626286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com