5

我编写了一个基本的位置跟踪应用程序,它将在后台运行。(不仅仅是一个后台线程,而是当设备变暗时。)我设置了 UIBackgroundModes 键,这部分可以很好地将位置写入屏幕。

接下来,我需要处理这些位置。根据位置和其他一些标准,应用程序有时需要通过 HTTP get 或 post 向服务器发送一些信息。有几个挑战:

  1. 即使应用程序在后台,消息也需要发送到服务器。

  2. 即使在生成消息时设备处于离线状态,消息也需要发送到服务器(用户在获取 gps 位置时通常会超出小区范围)。当然,这些消息不必立即发送,但应该在设备重新联机时存储和发送。

  3. 如果该消息没有使其成为第一次尝试,则应在放弃之前重新发送几次。

我正在寻求帮助计划如何处理这三件事。

该应用程序将针对 iOS6+。

我是一名新的 iOS 开发人员,但我为 android 开发了一个非常相似的应用程序。我正在寻找一般的建议和策略——除非碰巧已经有一些,否则不要代码。我只是不太了解 iOS / Objective C,不知道是否已经有类或框架来处理这个问题或帮助它的各个方面。我看过很多“如何将数据发送到服务器”的例子,这不是我想要的。相反,我想指出哪些类或系统可能有助于管理重试连接/命令,如何在后台处理它等等。此外,警告要注意的问题也很有帮助。非常感谢您的任何建议。

4

3 回答 3

2

你会很快发现,当应用程序在后台运行时,你能做什么和不能做什么受到了更多的限制。你最好的资源是 iOS 开发者库中的App States and Multitasking Guide。从文档:

对于需要更多执行时间来实现的任务,您必须请求特定权限才能在后台运行它们而不会被挂起。在 iOS 中,只允许特定类型的应用程序在后台运行:

  • 在后台向用户播放有声内容的应用程序,例如音乐播放器应用程序
  • 让用户随时了解其位置的应用程序,例如导航应用程序
  • 支持互联网协议语音 (VoIP) 的应用程序
  • 需要下载和处理新内容的报亭应用
  • 从外部配件接收定期更新的应用程序

实现这些服务的应用程序必须声明它们支持的服务并使用系统框架来实现这些服务的相关方面。声明服务让系统知道您使用了哪些服务,但在某些情况下,实际上是系统框架阻止了您的应用程序被挂起。

听起来您的应用可能符合位置项目符号项的条件。您可以通过在 info.plist 文件中包含密钥来启用后台位置服务UIBackgroundModes,并且您必须将应用程序设计为与后台模式和后台提取(系统将提供的回调,在您的应用程序委托中处理)很好地配合使用。阅读多任务指南的“跟踪用户位置”部分。

此外,iOS 7 中还有一些新的考虑因素需要研究。如果您有权访问会员中心,我建议您查看 WWDC 视频以获取更多信息。

于 2013-08-29T22:53:42.690 回答
2

我设置了 UIBackgroundModes 键,这部分可以很好地将位置写入屏幕。

由于您已经在使用后台模式,因此 GPS 功能有望正常工作。

即使应用程序在后台,消息也需要发送到服务器。

该应用程序获得大约 10 分钟的后台运行时间,然后被 iOS 强制暂停。

//Check if device supports multi-tasking
    if ([[UIDevice currentDevice] isMultitaskingSupported]) { 
        //Get the shared application instance
        UIApplication *application = [UIApplication sharedApplication]; 
        //Create a task object
        __block UIBackgroundTaskIdentifier background_task; 
        background_task = [application beginBackgroundTaskWithExpirationHandler: ^ {
            //Tell the system that we are done with the tasks
            [application endBackgroundTask: background_task]; 
            //Set the task to be invalid
            background_task = UIBackgroundTaskInvalid; 
            //System will be shutting down the app at any point in time now
        }];
        //Background tasks require you to use asynchronous tasks
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            //Perform your tasks that your application requires
            NSLog(@"\n\nRunning in the background!, here we can send the request to server for 10 minutes.");
            //End the task so the system knows that you are done with what you need to perform
            [application endBackgroundTask: background_task]; 
            //Invalidate the background_task
            background_task = UIBackgroundTaskInvalid; 
        });
    }

即使在生成消息时设备处于离线状态,消息也需要发送到服务器(用户在获取 gps 位置时通常会超出小区范围)。当然,这些消息不必立即发送,但应该在设备重新联机时存储和发送。

对于这个功能,创建一个 HTTP Singleton 类,并检查互联网是否可用。同时激活网络变化通知,这样,如果应用程序在使用过程中获得网络连接,应用程序可以将记录上传到服务器。对于在服务器上上传记录,您可以在 GCD 中创建自己的 NSURLConnections 以支持多连接,也可以使用GCDAsyncSocket第三方开源库。

于 2013-09-10T10:21:52.283 回答
0

首先,您应该在项目中定义后台模式,以便执行后台操作。

阅读本快速教程

如果您已经完成了这一步,那么您只需将一些代码添加到您的 locationManager 的回调方法中。如果要发送数据,则添加一些行以执行对服务器的请求。您应该避免经常执行请求。

如果请求失败,您可以将数据存储在数组或某种队列中。每次您执行发送操作时,您都可以尝试发送整个保存的数据。

于 2013-08-29T22:47:55.453 回答