我是越狱调整开发场景的新手。我试图弄清楚'钩'的适当方法,这样我就可以拦截来电(然后运行一些代码)。
我已经转储了CoreTelephony框架的头文件,但没有任何方法可以显示钩子。我试过了:
- (void)broadcastCallStateChangesIfNeededWithFailureLogMessage:(id)arg1;
- (BOOL)setUpServerConnection;
但两项都没有奏效。通过工作我的意思是 - 当iPhone接到电话时被叫。
关于挂钩的适当方法的任何指针?谢谢:))
注意: 这将是一个使用私有API的越狱调整,因此它不会被提交到App Store。
答案 0 :(得分:2)
我没有测试您的代码,但我认为您的问题可能是您需要使用Core Telephony通知中心注册该事件(而不是您在评论中的代码中所拥有的内容)。像这样:
// register for all Core Telephony notifications
id ct = CTTelephonyCenterGetDefault();
CTTelephonyCenterAddObserver(ct, // center
NULL, // observer
telephonyEventCallback, // callback
NULL, // event name (or all)
NULL, // object
CFNotificationSuspensionBehaviorDeliverImmediately);
并且您的回调函数是
static void telephonyEventCallback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
{
NSString *notifyname = (NSString*)name;
if ([notifyname isEqualToString:@"kCTCallIdentificationChangeNotification"])
{
NSDictionary* info = (NSDictionary*)userInfo;
CTCall* call = (CTCall*)[info objectForKey:@"kCTCall"];
NSString* caller = CTCallCopyAddress(NULL, call);
if (call.callState == CTCallStateDisconnected)
{
NSLog(@"Call has been disconnected");
}
else if (call.callState == CTCallStateConnected)
{
NSLog(@"Call has just been connected");
}
else if (call.callState == CTCallStateIncoming)
{
NSLog(@"Call is incoming");
}
else if (call.callState == CTCallStateDialing)
{
NSLog(@"Call is Dialing");
}
else
{
NSLog(@"None of the conditions");
}
}
}
我提供了另一种技术in this similar question here。另外,请注意我在该问题中的评论,该问题是关于未将UIApplication
中的通知置于后台。
更新:请参阅下面的cud_programmer关于在iOS 6而不是kCTCallStatus
上使用kCTCall
的评论。