iOS Caller ID Получить - PullRequest
1 голос
/ 16 июня 2011

Я пытаюсь получить номер звонящего (для взломанных устройств) с помощью этого кода: extern CFTypeRef CTCallCopyName (void *, CTCall * call);

NSLog (@ "% @", CTCallCopyName (NULL), (CTCall *) вызов));

Я получаю сообщение об ошибке: «CTCallCopyName (void *, CTCall *)», ссылка на которую: ld: символ (ы) не найден для архитектуры armv6

У меня есть базовая телефония, связанная с моим проектом.Может быть, мой прототип не так ... я не знаю.Есть идеи?Xcode 3, SDK 4

1 Ответ

0 голосов
/ 30 октября 2013

Если вы вызываете этот 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 возможно одинаковы.

...