我正在尝试使用这(CocoaAsyncSocket)来实现这(为VoIP使用配置套接字)。据我所知,我已经完成了步骤1,将VOIP添加到plist中的后台服务中,下面应该是步骤2(为VoIP使用配置应用程序的一个套接字)。
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)connectedPort
{
[CCV setLocalMode:FALSE];
[socket performBlock:^{
[socket enableBackgroundingOnSocket];
}];但剩下的步骤我想不出来。如果我做了
- (void)applicationDidEnterBackground:(UIApplication *)application
{
expirationHandler = ^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
bgTask = [app beginBackgroundTaskWithExpirationHandler:expirationHandler];
};
bgTask = [app beginBackgroundTaskWithExpirationHandler:expirationHandler];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
while (1) {
sleep(1);
//NSLog(@"BGTime left: %f", [UIApplication sharedApplication].backgroundTimeRemaining);
if ([rootViewController isIncomingCall] && showedCall != TRUE) {
UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif) {
localNotif.alertBody = [NSString stringWithFormat:@"Incoming Call."];
localNotif.alertAction = NSLocalizedString(@"Accept Call", nil);
localNotif.soundName = @"alarmsound.caf";
// localNotif.applicationIconBadgeNumber = 1;
[application presentLocalNotificationNow:localNotif];
[localNotif release];
}
showedCall = TRUE;
}
}
});
}我的当事人会听10分钟然后停下来。我需要做两件事:监视特定的(来电)数据包,并每5秒发送一次“保持活动”。但我看不出这些东西是在哪里配置的。此外,上面对苹果链接的定义是:“为了防止失去连接,VoIP应用程序通常需要周期性地醒来,并与其服务器联系。为了方便这种行为,iOS允许您使用UIApplication__的setKeepAliveTimeout:handler:方法安装一个特殊的处理程序”,据我所知,这种超时应该只做保持活动,但这没有意义,因为最短的时间是600秒?就像我上面说的,我找不到我告诉它要寻找什么包,以及当它被发现时该做什么。
发布于 2012-01-06 21:04:52
因此,我相信我已经解决了这个问题,但需要进一步的测试,以百分之百肯定。目前,我使用此代码运行了一个测试,测试时间为21分钟,并正常工作。
步骤2:
[socket performBlock:^{
[socket enableBackgroundingOnSocket];
}];步骤3:
- (void)applicationDidEnterBackground:(UIApplication *)application {
inProgram = FALSE;
showedCall = FALSE;
BOOL backgroundAccepted = [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{ [self backgroundHandler]; }];
if (backgroundAccepted)
{
NSLog(@"VOIP backgrounding accepted");
}
}这似乎使我的客户端保持运行,因此从这里开始,我添加了一个观察者来等待我的来电包,并在看到该数据包时启动一个通知。
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"currentDigitalJoin"])
{
switch ([[cClient currentDigitalJoin]intValue])
{
case 1000:
{
if (showedCall != TRUE && inProgram != TRUE) {
NSLog(@"incoming audio call");
UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif) {
localNotif.alertBody = [NSString stringWithFormat:@"Incoming Call."];
localNotif.alertAction = NSLocalizedString(@"Accept Call", nil);
localNotif.soundName = @"alarmsound.caf";
[app presentLocalNotificationNow:localNotif];
[localNotif release];
showedCall = TRUE;
}
}
break;
}
case 602:
{
if (showedCall != TRUE && inProgram != TRUE) {
NSLog(@"incoming audio call");
UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif) {
localNotif.alertBody = [NSString stringWithFormat:@"Incoming Call."];
localNotif.alertAction = NSLocalizedString(@"Accept Call", nil);
localNotif.soundName = @"alarmsound.caf";
[app presentLocalNotificationNow:localNotif];
[localNotif release];
showedCall = TRUE;
}
}
break;
}
case 513:
{
showedCall = FALSE;
break;
}
}
}else if([keyPath isEqualToString:@"currentDigitalJoin"])
{
switch ([[cClient currentDigitalJoin]intValue])
{
case 602:
{
showedCall = FALSE;
break;
}
}
}
}注:所示的“步骤”指的是苹果文档中指明的步骤。
此外,不要忘记在plist文件中设置请求无线。
发布于 2012-02-09 08:40:43
我知道这是个老问题--但你应该打电话给我。
BOOL backgroundAccepted = [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{ [self backgroundHandler]; }];
if (backgroundAccepted)
{
NSLog(@"VOIP backgrounding accepted");
}在应用程序启动和使用它的所有时间-原因是,正如你会发现,是当应用程序是前瞻,但屏幕是锁定的,你没有收到didEnterBackground电话,你的应用程序会在屏幕锁定后10-15分钟进入睡眠,即使你是前瞻。
https://stackoverflow.com/questions/8748874
复制相似问题