我有一个关于objective-c和后台任务请求的问题。
仅限于ios 13的后台模式。
我的应用程序在后台运行的时间不超过30秒。
ios 13中的后台模式发生了变化。
我需要使用objective-c注册一个后台任务,如下所示:
BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.SO.apprefresh", using: nil) { task in
self.scheduleLocalNotification()
self.handleAppRefreshTask(task: task as! BGAppRefreshTask)
}我需要计划什么时候应用程序转到后台
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)")
}
}发布于 2019-09-29 04:54:09
注册函数如下所示。
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
}快速关闭签名从以下位置转换:
{ task in
//....
}到Objective-C块签名:
^(BGTask *task) {
//...
}另一个函数看起来像这样。
-(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
发布于 2020-05-08 01:24:22
在Objective-C中,几乎没有任何完整的BGProcessingTaskRequest示例。这是我的实现,它依赖于这个问题中的其他答案。
需要执行以下步骤。
在构建阶段-将二进制文件与库链接下,将BackgroundTasks.framework添加到您的应用程序
在签名和功能-后台模式下启用后台处理。我也启用了后台抓取和远程通知。
编辑您的Info.plist。输入新行“允许的后台任务计划程序标识符”。使用后台任务的标识符为该行添加项。在我的例子中: com.toolsforresearch.compress和第二个项目com.toolsforresearch.upload。
#import <BackgroundTasks/BackgroundTasks.h>在AppDelegate.m中
将此代码添加到AppDelegate.m中的willFinishLaunchingWithOptions:
if (@available(iOS 13.0, *)) {
NSLog(@"configureProcessingTask");
[self configureProcessingTask];
}将此代码添加到AppDelegate.m中的applicationDidEnterBackground中
if (@available(iOS 13.0, *)) {
NSLog(@"scheduleProcessingTask");
[self scheduleProcessingTask];
}最后,将此代码添加到AppDelegate.m中,在@end之前
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:
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中做任何处理,但是请求提交良好的事实是一个很好的起点。评论非常受欢迎,例如如何将完成处理程序添加到后台任务。
发布于 2019-10-21 17:35:31
此外,不要忘记将您的任务Id列入允许的后台任务计划程序标识符(BGTaskSchedulerPermittedIdentifiers)下的info.plist文件的白名单中。
https://stackoverflow.com/questions/58149980
复制相似问题