iOS:长时间运行的任务

标签 ios objective-c long-running-processes

这是来自 developer.apple.com 的示例

Finite-Length Tasks
Starting a background task at quit time

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
        // Clean up any unfinished task business by marking where you
        // stopped or ending the task outright.
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    // Start the long-running task and return immediately.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // Do the work associated with the task, preferably in chunks.

        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    });
}

我想执行长时间运行的任务,而不是“有限长度”任务。我没有找到任何用 objective-c 为当前版本的 sdk 编写的示例。我可以在应用程序启动时启动它并在应用程序处于前台或后台时连续运行它吗?我怎么做?

我是一名 React-Native 开发人员,我刚刚开始学习 Objective-C。因此,我可能只需要简单的示例即可。我已经实现了 Cocoa Touch Class 的桥接实例,它工作正常。我只需要在这个类中启动长时间运行的任务。我需要它用于 BLE,但为了简单起见,我想说,让我们使用位置跟踪,因为它的测试更容易、更快捷。

我的 LongRunningTask.m:

#import "LongRunningTask.h"

@implementation LongRunningTask

RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD(start:(RCTResponseSenderBlock)callback)
{
  // start the Long-Running Task here
  callback(@[@"done"]);
}

我不明白,如何定义长时间运行的任务?似乎没有特定的方法或任何标记可以将任务声明为长时间运行。所以,从技术上讲,如果我获得用户的许可来运行特定类型的长时间运行的任务,我可以在 applicationDidEnterBackground 中连续运行我想要的任何代码?即使它与我获得的许可毫无共同之处?

唯一影响此任务是否会在 10 分钟内终止的因素是我是否获得许可?

谢谢!

最佳答案

Long-Running Task 是指在应用程序被终止之前一直处于事件状态的任务,我给你一个 LocationManager 的简单示例

当您将您的应用设置为接收位置更新并初始化 LocationManager 时,该应用会一直接收位置更新,直到您在前台停止更新,BLE 也是如此。

查看示例,

_locationManager=[[CLLocationManager alloc] init];
_locationManager.delegate=self;
 if ([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
        [_locationManager requestWhenInUseAuthorization];
        [_locationManager requestAlwaysAuthorization];
 }
[_locationManager startUpdatingLocation];

如果用户允许应用程序接收 GPS 位置,并且如果应用程序的 GPS 设置为 ON 以接收更新,上面的代码将启动应用程序的 LocationManager 以接收 GPS 位置更新,下面的方法将被调用直到您的应用在前台

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations

BLE

也是如此

如果您希望您的应用能够在后台接收 GPS 或 BLE 更新,您需要从应用的项目设置中打开相关的后台模式,如下图所示

enter image description here

该图显示了应用程序在后台运行时可以运行的服务列表,除了列表之外,您还可以执行某些网络事件,例如您在示例中显示的下载和上传,这将运行一个长时间运行的任务,直到你杀死了应用程序,或者服务被用户手动设置中断。

希望以上能消除您的疑虑。

干杯。

关于iOS:长时间运行的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42642750/

相关文章:

ios - 如何在 tableView 之前添加 "Loading" View Controller

.NET 自动测试长时间运行的进程

java - Spring、MVC、Java,让单例 bean 每 5 秒执行一次操作?

objective-c - UIImagePickerController 不会录制视频

android - React Native PushNotification onNotification 方法

ios - 如何在应用程序外部的屏幕底部显示特定于应用程序的状态栏?

ios - 在 iPhone 中使用陀螺仪来确定距离

objective-c - NSComboBoxCell 禁用打字?

objective-c - Objective-C 中的选择器是向对象发送消息的另一种方式吗?

java - 长时间运行的应用程序(类似尾部)