如何拦截在iOS中添加呼叫历史记录?

时间:2014-05-02 08:22:40

标签: ios iphone jailbreak core-telephony

我正在为越狱的iPhone进行调整。我正在尝试拦截呼叫添加到呼叫历史记录的过程。通过一点点搜索,我在CoreTelephony框架found here中找到了CTCallHistoryStoreAddCall函数。当我尝试使用它时,我收到一个错误:

Undefined symbols for architecture armv7: "_CTCallHistoryStoreAddCall"

我链接了CoreTelephony框架,我在代码中使用它的方式是:

typedef struct __CTCall * CTCallRef;
extern "C" void CTCallHistoryStoreAddCall(CTCallRef call);

我想这意味着这个功能不再存在,或者它确实存在,我没有以正确的方式使用它。 如何找到负责将来电添加到通话记录中的正确功能?

先谢谢。

我在Xcode 5上使用iOSOpenDev。

2 个答案:

答案 0 :(得分:1)

没有这样的功能。至少在iOS7中。

我在这里发布了iOS7的解决方案Hide a phone call completely in iOS (jailbreak device)

以下是代码:

//Private API from CoreTelephony.framework
void CTCallDeleteFromCallHistory(CTCallRef call);

%hook PHRecentCall

-(id)initWithCTCall:(CTCallRef)call
{
    if (IsCallShouldBeDeleted(call) == YES)
    {
        //Delete call from call history
        CTCallDeleteFromCallHistory(call);

        //Update MobilePhone app UI
        id PHRecentsViewController = [[[[[UIApplication sharedApplication] delegate] rootViewController] tabBarViewController] recentsViewController];
        if ([PHRecentsViewController isViewLoaded])
        {
            [PHRecentsViewController resetCachedIndexes];
            [PHRecentsViewController _reloadTableViewAndNavigationBar];
        }

        //Try uncommenting this, may be it will work. Should make the code faster.
        //return nil;
    }

    return %orig;
}

%end

在MobilePhone应用内部调整钩子类,因此束过滤器为com.apple.mobilephone

IsCallShouldBeDeleted是伪函数,用于确定是否应删除呼叫。您可以删除它或实现自己的。它只是为了使代码更清晰。

在iOS6上,类名不同,但代码完全相同 - Apple只是重命名了类。我从iOS4开始使用该解决方案。同样在iOS4上,它需要更多代码,因为没有CTCallDeleteFromCallHistory函数。

答案 1 :(得分:0)

您遇到此错误,因为CoreTelephony框架未链接到您的程序。要解决此问题,请将以下内容添加到makefile中:

PROJECT_NAME_PRIVATE_FRAMEWORKS = CoreTelephony

请注意,您必须将PROJECT_NAME替换为您自己的项目名称。