背景:
在越狱状态下,iOS9及以下版本,均可通过调用动态库的方法,实现电话的拨打、接听、挂机及监听动作。本文拟探寻在非越狱下能否实现。
结论:方法在iOS6.1.4之前非越狱的版本下生效;在iOS7.1.2之后必须要在越狱的状态下起作用,非越狱下失效。
方法:
(一)函数
void *handle = dlopen(CORETELPATH, RTLD_LAZY);
CTTelephonyCenterGetDefault = (id (*)())dlsym(handle, "CTTelephonyCenterGetDefault");
CTTelephonyCenterAddObserver = (void(*)(id,id,CFNotificationCallback,NSString*,void*,int))dlsym(handle,"CTTelephonyCenterAddObserver");
CTCallCopyAddress = (NSString* (*)(void*, CTCall *))dlsym(handle, "CTCallCopyAddress");
CTCallDisconnect = (void (*)(CTCall *))dlsym(handle, "CTCallDisconnect");
CTCallAnswer = (void (*)(CTCall *))dlsym(handle, "CTCallAnswer");
dlclose(handle);
(二)签名
需要codesign,内容为com.apple.coretelephony.Calls.allow
原因分析:自从iOS7之后,调用接、挂、打,需要签名受限。App因没有有效地签名方法,导致不起作用。在越狱状态下,功能是能正常起作用的。
关键词:github上CallHandler有类似功能。