gpt4 book ai didi

iOS 后台位置更新最佳实践

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:22:46 35 4
gpt4 key购买 nike

概览

我的公司要求我发布一个可以每两小时检查一次设备位置的应用程序。该应用程序将通过 TCP/IP 套接字将这些位置数据发送到我的服务器,然后根据这些数据接收相应的信息(直接通过相同的 TCP/IP 套接字)。所以我试图让我的应用程序持续在后台模式下运行(实际上,这似乎是 iOS 中的热门话题,而且它也不适合我的项目)。

问题

为了可靠,实现这一目标的最佳做法是什么?所以,我想知道:

  • 由于我的应用已暂停(= 不活动),Apple 是否允许在被 didUpdateToLocation 唤醒时打开套接字以发送位置?
  • 我需要多长时间才能通过套接字执行发送/接收任务?
  • 我是否应该使用 beginBackgroundTaskWithExpirationHandler 创建一个真正的后台任务,并使用 Cocoa 允许的 10 分钟来执行我的发送/接收任务?
  • 是否可以(Apple 允许)每 2 小时请求一次 10 分钟的后台任务,而无需人工交互(即用户应重新打开应用等)?

到目前为止我取得/发现了什么

  • 我在我的 Info.plist 中添加了 location 键,以便能够在我的应用处于非事件状态时运行 didUpdateToLocation 处理程序。<
  • 当我的应用程序处于前台(= 事件状态)时,我能够通过打开的套接字发送和接收数据。
  • 我尝试在调用 didUpdateToLocation 时检查 backgroundTimeRemaining。我得到了一个非常大的结果数字,这似乎是正常的,因为此时 applicationState 不在 UIApplicationStateBackground 中,而是在 UIApplicationStateActive 中。

这些点在官方文档中不是很清楚,我也没有找到与我的具体案例相关的topic。

感谢您的帮助。

最佳答案

根据 Apple's documentation ,您可以通过使用与您描述的方法非常相似的方法来实现这些。我要做的是类似于 this post by mindsizzlers 中解释的内容。 :

  • 作为一项建议,当应用程序进入后台时打开重要的位置更新,这样可以节省电量。当应用程序进入后台时,您可以执行此操作:

    - (void) applicationDidEnterBackground:(UIApplication *) application
    {
    // Create the location manager if you do not already have one.
    if (nil == locationManager)
    locationManager = [[CLLocationManager alloc] init];

    locationManager.delegate = self;
    [locationManager startMonitoringSignificantLocationChanges];
    }

    然后,系统将在位置更改时唤醒您的应用,如 documentation 中所述.

    If you leave this service running and your app is subsequently suspended or terminated, the service automatically wakes up your app when new location data arrives. At wake-up time, your app is put into the background and given a small amount of time to process the location data. Because your app is in the background, it should do minimal work and avoid any tasks (such as querying the network) that might prevent it from returning before the allocated time expires. If it does not, your app may be terminated.

    为了避免将新位置发送到服务器的操作高度不可靠(有时它可能会工作)你应该提前告诉 iOS 你正在执行一个应该允许运行完成的后台任务。

  • 更改您的位置管理器委托(delegate) (didUpdateToLocation) 以处理后台位置更新。

    - (void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation
    fromLocation:(CLLocation *)oldLocation
    {
    if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) {
    // Send the new location to your server in a background task
    // bgTask is defined as an instance variable of type UIBackgroundTaskIdentifier
    bgTask = [[UIApplication sharedApplication]
    beginBackgroundTaskWithExpirationHandler:
    ^{
    [[UIApplication sharedApplication] endBackgroundTask:bgTask];
    }];

    // Make a SYNCHRONOUS call to send the new location to our server

    // Close the task
    if (bgTask != UIBackgroundTaskInvalid) {
    [[UIApplication sharedApplication] endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
    }

    } else {
    // Handle location updates in the normal way
    }
    }

这样,您就不需要运行计时器了。因为每次发生重大变化时,您都会被自动唤醒并向您的服务器发送更新后的位置。

当然,如果您想确保这种情况在特定时间间隔内发生,您仍然可以采用设置定时器的方法来开始接收位置更新,并在收到后立即将其发送到服务器。看看this post谈论 iOS 中的后台模式(部分:接收位置更新)和这个 other questions详细了解如何执行此操作。

关于iOS 后台位置更新最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17967222/

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