除了使用推送通知来触发应用程序以定期运行某些代码(特别是:从服务器拉取新消息)之外,是否有苹果认可的良好替代方案?
- 伪装成 VoIP 应用程序不是一个好的选择(不会被批准,请参阅iPhone:重复后台任务)
- 我不能使用位置更新,如果用户不四处走动,它应该可以工作
在模拟器中,使用beginBackgroundTaskWithExpirationHandler
withdispatch_async
会给你 10 分钟的后台时间,我发现如果后台“自行重启”,该backgroundTimeRemaining
属性似乎总是被重置为 10 分钟。这是代码。
- (void) work
{
UIApplication *application = [UIApplication sharedApplication];
NSLog(@"bg %@ (T-%.1f seconds)",
[NSDate date],
[application backgroundTimeRemaining]);
sleep(10);
[application endBackgroundTask:_bgTask];
_bgTask = UIBackgroundTaskInvalid;
[self startTask];
}
- (void)startTask
{
UIApplication *application = [UIApplication sharedApplication];
_bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"expired at %@", [NSDate date]);
[application endBackgroundTask:_bgTask];
_bgTask = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,
0),
^{ [self work]; });
}
- (BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
/* ... */
[self startTask];
/* ... */
}
在后台运行某些东西是一种公认的做法吗?我的意思是,大多数时候我只是sleep(...)
想重复一个网络请求或做一些有用的事情,但应用程序永远不会真正进入完全后台模式。有没有人有这种方法的经验?提示:仅在模拟器上测试,没有其他正在运行的应用程序。