gpt4 book ai didi

iphone - setKeepAliveTimeout 和 BackgroundTasks

转载 作者:太空狗 更新时间:2023-10-30 03:30:26 25 4
gpt4 key购买 nike

这个话题让我很头疼。我正在开发一个需要定期轮询网络服务器以检查新数据的应用程序。根据返回的信息,我希望向用户推送一个本地通知。

我知道这种方法与 Apple 描述的方法略有不同,在 Apple 中,远程服务器完成工作,基于 APNS 推送远程通知。但是,有很多原因我无法考虑这种方法。其中之一就是用户身份验证机制。出于安全原因,远程服务器无法考虑用户凭据。我所能做的就是将登录和获取核心移动到客户端 (iPhone)。

我注意到 Apple 为应用程序提供了唤醒并保持打开 Socket 连接的机会(即 VoIP 应用程序)。

所以,我就这样开始了调查。在 plist 中添加了所需的信息,我可以“唤醒”我的应用程序,在我的 appDelegate 中使用类似这样的东西:

[[UIApplication sharedApplication] setKeepAliveTimeout:1200 handler:^{ 
NSLog(@"startingKeepAliveTimeout");
[self contentViewLog:@"startingKeepAliveTimeout"];
MyPushOperation *op = [[MyPushOperation alloc] initWithNotificationFlag:0 andDataSource:nil];
[queue addOperation:op];
[op release];
}];

NSOperation,然后使用以下 block 代码启动后台任务:

#pragma mark SyncRequests
-(void) main {
NSLog(@"startSyncRequest");
[self contentViewLog:@"startSyncRequest"];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"exipiration handler triggered");
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
[self cancel];
}];


dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSMutableURLRequest *anURLRequest;
NSURLResponse *outResponse;
NSError *exitError;
NSString *username;
NSString *password;

NSLog(@"FirstLogin");
anURLRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:webserverLogin, username, password]]];
[anURLRequest setHTTPMethod:@"GET"];
[anURLRequest setTimeoutInterval:120.00];
[anURLRequest setCachePolicy:NSURLRequestReloadIgnoringCacheData];

exitError = nil;
NSData *tmpData = [NSURLConnection sendSynchronousRequest:anURLRequest returningResponse:&outResponse error:&exitError];
[anURLRequest setTimeoutInterval:120.00];
if(exitError != nil) { //somethings goes wrong
NSLog(@"somethings goes wrong");
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
[self cancel];
return;
}

//do some stuff with NSData and prompt the user with a UILocalNotification

NSLog(@"AlltasksCompleted");
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
[self cancel];
});
}
}

上面的代码似乎(有时)有效,但其他许多代码使我的应用程序崩溃,日志信息如下:

Exception Type:  00000020
Exception Codes: 0x8badf00d
Highlighted Thread: 3

Application Specific Information:
DemoBackApp[5977] has active assertions beyond permitted time:
{(
<SBProcessAssertion: 0xa9da0b0> identifier: UIKitBackgroundCompletionTask process: DemoBackApp[5977] permittedBackgroundDuration: 600.000000 reason: finishTask owner pid:5977 preventSuspend preventIdleSleep
)}

Elapsed total CPU time (seconds): 0.010 (user 0.010, system 0.000), 100% CPU
Elapsed application CPU time (seconds): 0.000, 0% CPU

对于那些提问的人,是的。我也尝试过 Async NSURLConnection 方法。不管。即使我使用带有超时处理程序和 didFinishLoading:WithError 的异步方法,它也会同样崩溃。

我卡住了。非常感谢任何提示。

最佳答案

这是一个旧线程,但可能需要更新。

从 iOS 6 开始,这是我在该线程中讨论的 VoIP 计时器后台方法所看到的行为:

  • 通过 App Review Process 仍然严格禁止 AppStore 应用使用 VoIP BackgroundMode
  • 最短 KeepAlive 时间为 600 秒;低于此值的任何内容都会导致处理程序无法安装(并向 NSLog 发送警告)
  • 将 keepAlive 时间设置为明显大于 600 秒的值通常会导致处理程序以每 time/2 间隔的频率被触发。奖励事实:这与 SIP REGISTER 请求一致,其中建议的重新注册间隔为 .5* 重新注册时间。
  • 当您的 keepAlive 处理程序被调用时,我观察到以下情况:
    • 您获得大约 10 秒 的“前台”执行时间,其中剩余的后台时间是无限的(由 backgroundTimeRemaining 返回)
    • 如果您从 keepAlive 处理程序中启动了一个 beginBackgroundTask,我观察到您有 60 秒 的后台执行时间(由 backgroundTimeRemaining< 返回)/强>)。 这与当用户从您的应用程序处于事件状态过渡到后台时您得到的 600 秒 不同。我还没有找到任何方法来延长这段时间(不使用其他技巧例如位置等)

希望对您有所帮助!

关于iphone - setKeepAliveTimeout 和 BackgroundTasks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4777499/

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