iOS:长期运行的任务

时间:2017-03-07 07:39:14

标签: ios objective-c long-running-processes

这是developer.apple.com

的示例
  

有限长度任务
  在退出时启动后台任务

- (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的例子。我可以在应用程序启动时启动它,并在app处于前台或后台时连续运行吗?我怎么做?

我是一名反应原生的开发者,我刚刚开始学习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分钟内终止的唯一因素是我是否获得了许可?

谢谢!

1 个答案:

答案 0 :(得分:1)

对于术语长时间运行任务表示在应用程序被杀之前处于活动状态的任务,我给出了LocationManager

的简单示例

当您设置应用程序以接收位置更新并初始化LocationManager时,应用程序将受到接收位置更新,直到您在前台停止更新,与BLE的情况相同。

参见示例,

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

上面的代码启动了应用程序接收GPS位置更新的LocationManager,如果用户已授权应用程序接收GPS位置,并且如果应用程序的GPS设置为ON以接收更新,则以下方法将被调用您的应用位于前景

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

BLE

也是如此

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

enter image description here

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

希望以上清除你的怀疑。

干杯。