ios 13 target c запросом фоновой задачи - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть вопрос с целью c и запросом фоновой задачи.

Ограничен фоновыми режимами с ios 13.

Мое приложение не работает в фоновом режиме более 30 секунд.

Режимы фона изменены с помощью ios 13.

Мне нужно зарегистрировать фоновое задание с целью 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)")
}
}

кто-нибудь может мне помочь?

спасибо

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

Я добавил блок кода, который вы написали.Но у меня есть некоторые проблемы.

xcode screenshot

все коды в appdelegate.m:

#import "AppDelegate.h"
#import "MainViewController.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    self.viewController = [[MainViewController alloc] init];
    return [super application:application didFinishLaunchingWithOptions:launchOptions];

}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    NSLog(@"The code runs through here!");
}





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
}


-(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);
    }
}


@end

Как я могу объявить Backgroundprocess?или Что мне написать в appdelegate.h?

Большое спасибо

0 голосов
/ 28 сентября 2019

Функция регистра выглядит следующим образом.

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

...