Итак, я хочу создать iOS, я новичок в мире объективных c, и одна функция, которую я хочу реализовать, - это возможность отправлять запросы API и выполнять небольшую фоновую обработку, пока приложение не находится «в фокусе / в фоновом режиме». В течение пары дней я исследовал этот BGTask API для iOS 13 и создал проект, чтобы увидеть, могу ли я получить «фоновую выборку». Я не могу. Я почти уверен, что все настроено правильно, но я не могу запустить функцию фоновой выборки на моем iPhone, ни разу за последние пару дней.
- Я использую фактический iOS устройство, чтобы проверить это с помощью iOS 13.4.1
- «Разрешенные идентификаторы планировщика фоновых задач» правильно настроены в Info.plist
- Приложение подписано
- Фоновая обработка и фон выборка проверяется в Фоновых режимах
- Я ждал 15-минутный интервал согласно документации Apple
Вот мой код. Все это просто пустой проект iOS с использованием objective- c. Я редактировал только AppDelegate.m и Info.plist
AppDelegate.m
#import "AppDelegate.h"
#import <BackgroundTasks/BackgroundTasks.h>
static NSString* TaskID = @"com.myapp.task";
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[[BGTaskScheduler sharedScheduler] registerForTaskWithIdentifier:TaskID
usingQueue:nil
launchHandler:^(BGProcessingTask *task) {
[self handleAppRefreshTask:task];
}];
return YES;
}
#pragma mark - UISceneSession lifecycle
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
}
- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
-(void)handleAppRefreshTask:(BGProcessingTask *)task {
//do things with task
NSLog(@"Process started!");
task.expirationHandler = ^{
NSLog(@"WARNING: expired before finish was executed.");
};
NSString *targetUrl = @"https://webhook.site/1b274a6f-016f-4edf-8e31-4ed7058eaeac";
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setHTTPMethod:@"GET"];
[request setURL:[NSURL URLWithString:targetUrl]];
[[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:
^(NSData * _Nullable data,
NSURLResponse * _Nullable response,
NSError * _Nullable error) {
NSString *myString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"Data received: %@", myString);
}] resume];
task.expirationHandler = ^{
NSLog(@"WARNING: expired before finish was executed.");
};
[task setTaskCompletedWithSuccess:YES];
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSLog(@"Entering background");
BGProcessingTaskRequest *request = [[BGProcessingTaskRequest alloc] initWithIdentifier:TaskID];
request.requiresNetworkConnectivity = true;
request.requiresExternalPower = false;
request.earliestBeginDate = [NSDate dateWithTimeIntervalSinceNow:60];
@try {
[[BGTaskScheduler sharedScheduler] submitTaskRequest:request error:nil];
}
@catch(NSException *e){
NSLog(@" Unable to submit request");
}
}
@end
Не работает ли фоновая выборка в iOS 13? Даже нажатие на «Simulate background fetch» в меню отладки Xcode не работает. Приложение просто закрывается, и ничего не происходит. Кто-нибудь может помочь / дать совет?