首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ios 13 objective-c后台任务请求

ios 13 objective-c后台任务请求
EN

Stack Overflow用户
提问于 2019-09-29 04:15:38
回答 4查看 5.2K关注 0票数 9

我有一个关于objective-c和后台任务请求的问题。

仅限于ios 13的后台模式。

我的应用程序在后台运行的时间不超过30秒。

ios 13中的后台模式发生了变化。

我需要使用objective-c注册一个后台任务,如下所示:

代码语言:javascript
复制
BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.SO.apprefresh", using: nil) { task in
    self.scheduleLocalNotification()
    self.handleAppRefreshTask(task: task as! BGAppRefreshTask)
}

我需要计划什么时候应用程序转到后台

代码语言:javascript
复制
func scheduleAppRefresh() {
    let request = BGAppRefreshTaskRequest(identifier: "com.SO.apprefresh")
    request.earliestBeginDate = Date(timeIntervalSinceNow: 2 * 60) // App Refresh after 2 minute.
    do {
        try BGTaskScheduler.shared.submit(request)
    } catch {
        print("Could not schedule app refresh: \(error)")
    }
}
EN

回答 4

Stack Overflow用户

发布于 2019-09-29 04:54:09

注册函数如下所示。

代码语言:javascript
复制
static NSString* TaskID = @"com.SO.apprefresh";

-(void)configure {
    [[BGTaskScheduler sharedScheduler] registerForTaskWithIdentifier:TaskID
                                                          usingQueue:nil
                                                       launchHandler:^(BGTask *task) {
        [self scheduleLocalNotifications];
        [self handleAppRefreshTask:task];
    }];
}

-(void)scheduleLocalNotifications {
    //do things
}

-(void)handleAppRefreshTask:(BGTask *)task {
    //do things with task
}

快速关闭签名从以下位置转换:

代码语言:javascript
复制
{ task in
 //....
}

到Objective-C块签名:

代码语言:javascript
复制
^(BGTask *task) {
  //...
}

另一个函数看起来像这样。

代码语言:javascript
复制
-(void)scheduleAppRefresh {
    BGAppRefreshTaskRequest *request = [[BGAppRefreshTaskRequest alloc] initWithIdentifier:TaskID];
    request.earliestBeginDate = [NSDate dateWithTimeIntervalSinceNow:2*60];
    NSError *error = NULL;
    BOOL success = [[BGTaskScheduler sharedScheduler] submitTaskRequest:request error:&error];
    if (!success) {
        NSLog(@"Failed to submit request: %@",error);
    }
}

Swift中的任何抛出函数

func submit(_ taskRequest: BGTaskRequest) throws

将始终转换为返回BOOL并通过引用传递错误的函数。

- (BOOL)submitTaskRequest:(BGTaskRequest *)taskRequest error:(NSError **)error

票数 3
EN

Stack Overflow用户

发布于 2020-05-08 01:24:22

在Objective-C中,几乎没有任何完整的BGProcessingTaskRequest示例。这是我的实现,它依赖于这个问题中的其他答案。

需要执行以下步骤。

在构建阶段-将二进制文件与库链接下,将BackgroundTasks.framework添加到您的应用程序

在签名和功能-后台模式下启用后台处理。我也启用了后台抓取和远程通知。

编辑您的Info.plist。输入新行“允许的后台任务计划程序标识符”。使用后台任务的标识符为该行添加项。在我的例子中: com.toolsforresearch.compress和第二个项目com.toolsforresearch.upload。

代码语言:javascript
复制
#import <BackgroundTasks/BackgroundTasks.h>

在AppDelegate.m中

将此代码添加到AppDelegate.m中的willFinishLaunchingWithOptions:

代码语言:javascript
复制
if (@available(iOS 13.0, *)) {
    NSLog(@"configureProcessingTask");
    [self configureProcessingTask];
}

将此代码添加到AppDelegate.m中的applicationDidEnterBackground中

代码语言:javascript
复制
if (@available(iOS 13.0, *)) {
    NSLog(@"scheduleProcessingTask");
    [self scheduleProcessingTask];
}

最后,将此代码添加到AppDelegate.m中,在@end之前

代码语言:javascript
复制
static NSString* uploadTask = @"com.toolsforresearch.upload";

-(void)configureProcessingTask {
    if (@available(iOS 13.0, *)) {
        [[BGTaskScheduler sharedScheduler] registerForTaskWithIdentifier:uploadTask
                                                              usingQueue:nil
                                                           launchHandler:^(BGTask *task) {
            [self scheduleLocalNotifications];
            [self handleProcessingTask:task];
        }];
    } else {
        // No fallback
    }
}

-(void)scheduleLocalNotifications {
    //do things
}

-(void)handleProcessingTask:(BGTask *)task API_AVAILABLE(ios(13.0)){
    //do things with task
}

-(void)scheduleProcessingTask {
    if (@available(iOS 13.0, *)) {
        NSError *error = NULL;
        // cancel existing task (if any)
        [BGTaskScheduler.sharedScheduler cancelTaskRequestWithIdentifier:uploadTask];
        // new task
        BGProcessingTaskRequest *request = [[BGProcessingTaskRequest alloc] initWithIdentifier:uploadTask];
        request.requiresNetworkConnectivity = YES;
        request.earliestBeginDate = [NSDate dateWithTimeIntervalSinceNow:5];
        BOOL success = [[BGTaskScheduler sharedScheduler] submitTaskRequest:request error:&error];
        if (!success) {
            // Errorcodes https://stackoverflow.com/a/58224050/872051
            NSLog(@"Failed to submit request: %@", error);
        } else {
            NSLog(@"Success submit request %@", request);
        }
    } else {
        // No fallback
    }
}

当我运行我的应用程序并将其推送到后台时,这些消息是NSLogged:

代码语言:javascript
复制
2020-05-07 19:12:45.179834+0200 SessionVideo[819:171719] scheduleProcessingTask
2020-05-07 19:12:45.219117+0200 SessionVideo[819:171719] Success submit request <BGProcessingTaskRequest: com.toolsforresearch.upload, earliestBeginDate: 2020-05-07 17:12:50 +0000, requiresExternalPower=0, requiresNetworkConnectivity=1>

我还没有在BGProcessingTask中做任何处理,但是请求提交良好的事实是一个很好的起点。评论非常受欢迎,例如如何将完成处理程序添加到后台任务。

票数 3
EN

Stack Overflow用户

发布于 2019-10-21 17:35:31

此外,不要忘记将您的任务Id列入允许的后台任务计划程序标识符(BGTaskSchedulerPermittedIdentifiers)下的info.plist文件的白名单中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58149980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档