gpt4 book ai didi

ios - 后台任务有时在模拟器上失败/在设备上总是失败

转载 作者:行者123 更新时间:2023-11-29 04:21:20 25 4
gpt4 key购买 nike

如果用户更改了与推送通知相关的设置,我将在 -applicationDidEnterBackground 中启动一个后台任务,将数据上传到我的服务器。当用户更改设置时,我将静态 BOOL 设置为 YES,并且仅在应用程序进入后台时发送更改。我将结束任务的 block 传递给该方法,因此当到达 connectionDidFinishLoading 时,它会调用它并结束任务。

它在模拟器上大部分时间都有效,但在实际设备上不起作用。

相关代码:

self.bgTask = [application beginBackgroundTaskWithExpirationHandler:^
{
[application endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
}];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
{
[PushInfo checkDirty:^{
NSLog(@"push info sent");
[application endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
}];
});
...
// in PushInfo.m :
typedef void (^VoidBlock)();
static BOOL dirty;

+ (void) checkDirty:(VoidBlock)endBlock
{
if(dirty)
{
PushInfo *pi = [[PushInfo alloc] init];
NSLog(@"sending pushinfo"); // This code is always reached
[pi setEndBlock:endBlock];
[pi updatePushInfo];
}
else
endBlock();
}

- (void) updatePushInfo
{
...
// Create a NSURLConnection to send the data
...
}

- (void) connectionDidFinishLoading:(NSURLConnection *)connection
{
...
NSLog(@"sent push info");
dirty = NO;
if(endBlock)
{
endBlock();
}
}

我错过了什么吗?编辑:即使它确实将信息发送到模拟器上的服务器,由于某种原因静态变量仍然是 YES...

最佳答案

尝试将代码移至:

-(void) applicationWillResignActive:(UIApplication *)application

我相信将其放在 applicationDidEnterBackground 中已经太晚了。

检查了文档,你是对的,在 applicationDidEnterBackground 中应该没问题。

另一个建议,尝试将 beginBackgroundTaskWithExpirationHandler 移到dispatch_async block 内。它可能必须在同一线程中启动,但在文档中没有看到明确说明。

关于ios - 后台任务有时在模拟器上失败/在设备上总是失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12956231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com