【发布时间】:2015-02-12 13:21:31
【问题描述】:
我正在尝试做的是一个在来电时运行代码的应用程序。我知道我无法获得来电者的任何详细信息,这很好。
到目前为止,我的问题是它仅在应用程序处于前台时才有效。
这是我的代码:
#import <CoreTelephony/CoreTelephonyDefines.h>
#import <CoreTelephony/CTCallCenter.h>
#import <CoreTelephony/CTCall.h>
CTCallCenter *callCenter = [[CTCallCenter alloc] init];
[callCenter setCallEventHandler:^(CTCall *call) {
ONLog(@"Event handler called");
if ([call.callState isEqualToString: CTCallStateConnected]) {
ONLog(@"Connected");
} else if ([call.callState isEqualToString: CTCallStateDialing]) {
ONLog(@"Dialing");
} else if ([call.callState isEqualToString: CTCallStateDisconnected]) {
ONLog(@"Disconnected");
} else if ([call.callState isEqualToString: CTCallStateIncoming]) {
ONLog(@"Incomming");
}
}];
有人可以帮我把它作为后台任务运行吗?
编辑:
我这样使用 Richas 的代码:
__block UIBackgroundTaskIdentifier yourBackgroundTaskName;
yourBackgroundTaskName = [application beginBackgroundTaskWithExpirationHandler:^{
// CODE FOR EXPIRATION HANDLER BLOCK
[application endBackgroundTask: yourBackgroundTaskName];
yourBackgroundTaskName = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// DO YOUR STUFF HERE. START OF BACKGROUND TASK.
NSLog(@"Background time Remaining: %f",[[UIApplication sharedApplication] backgroundTimeRemaining]);
self.callCenter = [[CTCallCenter alloc] init];
[self.callCenter setCallEventHandler:^(CTCall *call) {
ONLog(@"Event handler called");
if ([call.callState isEqualToString: CTCallStateConnected]) {
ONLog(@"Connected");
} else if ([call.callState isEqualToString: CTCallStateDialing]) {
ONLog(@"Dialing");
} else if ([call.callState isEqualToString: CTCallStateDisconnected]) {
ONLog(@"Disconnected");
} else if ([call.callState isEqualToString: CTCallStateIncoming]) {
ONLog(@"Incomming");
}
}];
//WHEN YOU ARE DONE WITH YOUR TASK, TELL THAT TO SYSTEM
[application endBackgroundTask: yourBackgroundTaskName];
yourBackgroundTaskName = UIBackgroundTaskInvalid;
});
- 它只为我买了 180 秒的后台运行...
- 它不工作 :) 未检测到呼叫
【问题讨论】:
-
你能确保它不会落入最后一个没有写的
else。只是一个想法。 -
您打算在 Appstore 中发布您的应用吗?有一个简单的解决方案 - 不要让您的应用程序被暂停。为此,您可以使用非常流行的技巧 - 在后台播放静音音频文件,这将使设备和您的应用程序不会进入睡眠状态。但这意味着您必须有正当理由这样做,否则您的应用将被拒绝。
标签: objective-c core-telephony