Если вы вызываете этот API в файле .mm, вы должны объявить его как extern "C" void foo (void); Насколько я знаю, на iOS 5 ~ 7 вы должны использовать вместо CTCallCopyAddress, прототип:
extern "C" CFStringRef CTCallCopyAddress(CFAllocatorRef, CTCallRef);
Обратите внимание, что вторым аргументом является 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 работать в SpringBoard на iOS 5, пока не разобрался или не пробовал в других системах. Надеюсь, эта информация поможет!
РЕДАКТИРОВАТЬ: просто попробуйте еще раз на iOS 5, CTCallGetID является правильной функцией для получения идентификатора вызывающего абонента в адресной книге, прототипом которой является ABRecordID CTCallGetID (CTCallRef). iOS 6 и 7 возможно одинаковы.