iOS来电显示检索

时间:2011-06-15 23:41:15

标签: iphone objective-c function jailbreak

我正在尝试使用以下代码获取来电号码(对于越狱设备): extern CFTypeRef CTCallCopyName(void *,CTCall * call);

NSLog(@“%@”,CTCallCopyName(NULL,(CTCall *)call));

我收到错误:   “CTCallCopyName(void *,CTCall *)”,引自: ld:找不到架构armv6的符号

我的Core Telephony与我的项目相关联。 也许我的原型是错的......我不知道。有任何想法吗? Xcode 3,sdk 4

1 个答案:

答案 0 :(得分:0)

如果您在.mm文件中调用此API,则必须将其声明为extern “C” void foo(void);据我所知,在iOS 5~7上,您应该使用CTCallCopyAddress,原型是:

extern "C" CFStringRef CTCallCopyAddress(CFAllocatorRef, CTCallRef);

请注意,第二个arg是 CTCallRef 而不是 CTCall ,这意味着您无法向其发送CTCall类方法(尽管其中一些有效)。除了链接CoreTelephony.framework之外,您还可以动态加载此符号,如下所示:

static CFStringRef (*CTCallCopyAddress)(CFAllocatorRef, CTCallRef);

void Foo(CTCallRef call)
{
    void *libHandle = dlopen("/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony", RTLD_LAZY);
    CTCallCopyAddress = (CFStringRef (*)(CFAllocatorRef, CTCallRef))dlsym(libHandle, "CTCallCopyAddress");
    NSString *address = (NSString *)CTCallCopyAddress(kCFAllocatorDefault, call);
    NSLog(@"The caller's address is %@", address);
    [address release];
    dlclose(libHandle);
}
顺便说一句,我不能让CTCallCopyName在iOS 5上的SpringBoard中运行,还没有想出来或尝试过其他系统。希望这些信息有所帮助!

编辑:在iOS 5上再试一次,CTCallGetID是在通讯录中获取来电显示的正确功能,其原型是ABRecordID CTCallGetID(CTCallRef)。 iOS 6和7可能是相同的。