3

关于 Apple 文档,在应用程序暂停时无法处理手机状态: https ://developer.apple.com/documentation/coretelephony/ctcallcenter

“当它被暂停时,您的应用程序不会收到呼叫事件”

“背景”状态也是如此吗?(因为关于 Apple 文档中描述的状态,背景状态与“暂停”应用程序状态不同)

https://web.archive.org/web/20140824215114/https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

我正在使用以下代码处理电话状态:

CTCallCenter *callCenter = [[CTCallCenter alloc] init];

callCenter.callEventHandler=^(CTCall* call)
{

  //call state

};

我已经在 callEventHandler 块中添加了一个本地通知,以检查当我的应用程序处于后台状态时是否会收到呼叫事件,但是否接缝未执行该块(我的应用程序具有后台支持和所有接收到的事件(通过TCP)在应用程序处于后台时被正确处理)

4

3 回答 3

4

callEventHandler当应用程序处于后台时,我所做的所有测试都无法使用。但是,当应用程序在前台时,一切都很好。

套接字有效,因为 iOS 会为您的应用程序处理它并相应地交付包。但为此,您需要创建一个 voip 套接字并添加voipUIBackgroundModes您的App-Info.plist 中

于 2012-09-11T12:56:11.523 回答
1

您将无法使用callEventHandler...

但是,根据apple dev forums中的这个帖子,您可以currentCalls在后台定期检查以确定呼叫是否正在进行中。

这是您应该使用的代码(每秒钟检查一次):

- (void)viewDidLoad {  
    [super viewDidLoad];

    _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(phoneDetection) userInfo:nil repeats:YES];  
}  

- (void)phoneDetection {
    _callCenter = [[CTCallCenter alloc] init]; // Here is the important part : instanciating a call center each time you want to check !  

    [_callCenter setCallEventHandler:^(CTCall *call) {  
        NSLog(@"Call detected");  
    }];  

    NSLog(@"%@", _callCenter.currentCalls);  
}
于 2016-08-30T14:50:09.043 回答
0

我知道有些应用程序会在后台运行无声的音频文件,以防止在 10 分钟不活动后关闭。

蓝牙、位置和音频可以防止应用程序被完全杀死。

我的应用程序能够在后台检测来电和去电,因为该应用程序通过位置更新保持活动状态。我们过去使用过音频/蓝牙。

如果没有某种“keepAlive”方法,操作系统将暂停您的应用程序,直到某些外部刺激重新激活它(推送通知、用户启动等......)

于 2014-11-13T05:46:28.370 回答