iOS后台提取自定义时间间隔

我读了所有有关后台获取的Apple文档,目前我正在使用它:

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:minimumBackgroundFetchInterval]; 

我让OS决定何时执行后台获取,但如果我这样设置:

 [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:21600]; 

这是否意味着每6个小时会发生一次?

不,这意味着您正在向iOSbuild议在执行后台提取之前至less要经过六个小时,但是此属性的文档声明 –

可以启动另一个后台提取之前必须经过的最less秒数。 该值仅供参考,并不表示获取操作之间所需的确切时间量。

所以,执行后台提取可能需要六个多小时,但可能不会太less。 iOS还会logging您通过完成处理程序返回的值,指示是否有新数据或尝试确定一天中可能有新数据的时间。

我在iOS10和iPhone6Plus上做了一些实验,给出了“UIApplicationBackgroundFetchIntervalMinimum”间隔。 (当然,我调用了一些networking相关的方法,给iOS提示应用程序真的在工作…并调用completionHandler(UIBackgroundFetchResultNewData);)

我得到了:(整夜运行)

00:35 01:03 01:31 01:59 02:27 02:55 03:13 03:23 03:51 04:19 04:35 05:04 05:25 05:59 06:27 06:56

所以三angular洲从10到34分钟不等。

请求的广告代码:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // You must invoke setMinimumBackgroundFetchInterval:. [application setMinimumBackgroundFetchInterval: UIApplicationBackgroundFetchIntervalMinimum]; // default, iOS decides. seems between 5 and 15 minutes. // you cannot go below that time. /* ADC: (You can also enable this support by including the UIBackgroundModes key with the fetch value in your app's Info.plist file.) Enabling this mode is not a guarantee that the system will give your app any time to perform background fetches. The system must balance your app's need to fetch content with the needs of other apps and the system itself. After assessing that information, the system gives time to apps when there are good opportunities to do so. When a good opportunity arises, the system WAKES or LAUNCHES your app into the background and calls the app delegate's application:performFetchWithCompletionHandler: method. Use that method to check for new content and initiate a download operation if content is available. */ // UIApplicationState state = application.applicationState; NSString * s = [NSString stringWithFormat:@"background=%d (didFinishLaunchingWithOptions)", application.applicationState == UIApplicationStateBackground]; return YES; } 

回电话:

 -(void)application:(UIApplication *)application performFetchWithCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler { NSInteger n = application.applicationIconBadgeNumber; application.applicationIconBadgeNumber = n+1; // we invoke an sync method, so we should call handler AFTER getting answer... BOOL isIpad = [self isIpad]; NSString * ID = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; NSString* msg = [NSString stringWithFormat: @"PFCH=%ld-ipad%d-%@", (long)n, isIpad, ID]; // call a method on my server to send me back a mail. I add an ID for every device I tested in a battery of iPhone/iPads. [self getTime: msg]; // if ok... completionHandler(UIBackgroundFetchResultNewData); // or completionHandler(UIBackgroundFetchResultNoData); // or completionHandler(UIBackgroundFetchResultFailed); } 

其他方法:

 -(void) getTime:(NSString*)msg { NSString* urlS = [NSString stringWithFormat: @"https://www.ingconti.com/PFCH.php?msg=%@", msg]; NSURL * URL = [NSURL URLWithString: urlS]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSString * s = [[NSString alloc]initWithData:data encoding: NSUTF8StringEncoding]; NSLog(@"%@", s); } ]; [task resume]; } -(BOOL)isIpad; { UIUserInterfaceIdiom deviceType = [[UIDevice currentDevice] userInterfaceIdiom]; if (deviceType == UIUserInterfaceIdiomPad) return YES; return NO; } 

我确实使用了服务器,因为我的设备可能处于hibernate状态,并且我想要在我的Mac上重新发送邮件。

在服务器上的PHP代码简单地parsingGET并发送回我的设备ID的邮件,所以我可以parsing我的Mac上的结果。