【问题标题】:How to intercept adding calls to call history in iOS?如何拦截在 iOS 中添加通话到通话记录?
【发布时间】:2014-06-18 21:07:20
【问题描述】:

我正在为越狱的 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。

【问题讨论】:

  • 没有这个功能。至少在iOS7中。我在这里发布了 iOS7 的解决方案 stackoverflow.com/questions/22729003/… 在 iOS6 上,类名不同但代码完全相同 - Apple 只是重命名了这些类。我的挂钩电话应用程序类的解决方案有效,我从 iOS4 开始使用它。
  • 我测试了你所做的,但它只是冻结并在列表中显示调用。在我关闭手机应用程序并再次打开它之后,它就可以工作了。有没有办法在不冻结的情况下拦截它?
  • 我没有看到冻结。即使我在电话应用程序中,我的代码也适用于我。我取消了隐藏呼叫,但呼叫列表中没有任何显示,即使在电话应用程序处于前台时取消隐藏呼叫也是如此。
  • 我发现它为什么很慢。问题是调用历史记录中的每个调用都会调用initWithCTCall,因此该函数中的任何进程都可能导致应用程序 UI 暂停。我删除了所有通话记录并稍微简化了代码,现在它可以工作了!发布您的答案,以便我接受作为答案。谢谢!

标签: ios iphone jailbreak core-telephony


【解决方案1】:

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

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

代码如下:

//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 应用程序中的 hooks 类,使捆绑过滤器为 com.apple.mobilephone

IsCallShouldBeDeleted 是一个伪函数,用于确定是否应该删除调用。您可以删除它或实施您自己的。它只是为了让代码更清晰。

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

【讨论】:

    【解决方案2】:

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

    PROJECT_NAME_PRIVATE_FRAMEWORKS = CoreTelephony
    

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

    【讨论】:

    • 我正在使用 iOSOpenDev,我已经链接了框架,但它给了我错误。不管怎样,谢谢你的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多