【问题标题】:iOS: Long-Running taskiOS:长时间运行的任务
【发布时间】:2017-03-07 07:39:13
【问题描述】:

这是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 编写的示例。我可以在应用程序启动时启动它并连续运行它,无论应用程序是在前台还是后台?我怎么做?

我是一名 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 分钟内终止的唯一因素是我是否获得了许可?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    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 更新,您需要从应用的项目设置中打开相关的后台模式,如下图所示

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

    希望以上内容可以消除您的疑虑。

    干杯。

    【讨论】:

    • 那么,如果它在 Capabilities 中具有权限,那么任何进程都会成为 Long-Running-Task 吗?例如。如果我在某个地方有 BLE 扫描过程,它会在应用程序进入后台时继续工作,如果我在功能中启用了“使用蓝牙 LE 附件”并获得用户许可?并且没有任何类型的特定方法或标记可以将 Long-Running Task 与另一个进程(或函数或您在 Objective-c 中调用的任何内容)区分开来?
    • 是的,执行列出的长时间运行任务没有什么特别的,但可以通过上面的设置来控制。
    • omg...这是我脑海中缺失的谜题。从苹果的文档中绝对不清楚,因为首先他们在解释 finit-lentgth 任务,这有​​点复杂,然后在下面描述长时间运行的任务,所以看起来有某种逻辑联系......谢谢!
    • @stkvtflw 你应该删除stackoverflow.com/questions/42723116/… 我猜这是同一个问题。
    猜你喜欢
    • 1970-01-01
    • 2014-10-26
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多