iOS越狱如何拦截短信/文本消息?

12

我目前正在尝试编写一个应用程序,拦截文本消息并根据该消息的内容做出反应。 我尝试钩入CKSMSService类中的_receivedMessage:(struct__CKSMSRecord *)message replace:(BOOL)replace方法,但似乎根本不会被调用。

请问有人能告诉我需要钩入哪个函数/类吗?我需要在文本消息显示和存储到数据库之前拦截它。 我使用的是IOS 5.0.1。

非常感谢您的任何帮助!


如果您对这个问题感兴趣,为什么不支持 Area 51 的提案,建立一个越狱 Stack Exchange 网站呢?(http://area51.stackexchange.com/proposals/18154/ios-jailbreaking-development?referrer=EuWVi6IpN0_KzzEhC7I-Qw2) - Richard Stelling
3个回答

10

这段代码片段可以拦截短信消息-您可以将其扩展到其他类型的通知。也适用于iOS 5.0.1。不过,它不能用于iMessages。需要使用CoreTelephony框架链接(其中有一堆私有标题,您可以对其进行类转储)

#include <dlfcn.h>

#define CORETELPATH "/System/Library/PrivateFrameworks/CoreTelephony.framework/CoreTelephony"
id(*CTTelephonyCenterGetDefault)();

void (*CTTelephonyCenterAddObserver) (id,id,CFNotificationCallback,NSString*,void*,int);


static void telephonyEventCallback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
{
    NSString *notifyname=(NSString *)name;
    if ([notifyname isEqualToString:@"kCTMessageReceivedNotification"])//received SMS
    {
        NSLog(@" SMS Notification Received :kCTMessageReceivedNotification");
        // Do blocking here. 
    }
}

-(void) registerCallback {

 void *handle = dlopen(CORETELPATH, RTLD_LAZY);
    CTTelephonyCenterGetDefault = dlsym(handle, "CTTelephonyCenterGetDefault");
    CTTelephonyCenterAddObserver = dlsym(handle,"CTTelephonyCenterAddObserver");
    dlclose(handle);
    id ct = CTTelephonyCenterGetDefault();

    CTTelephonyCenterAddObserver(
                                 ct, 
                                 NULL, 
                                 telephonyEventCallback,
                                 NULL,
                                 NULL,
                                 CFNotificationSuspensionBehaviorDeliverImmediately);
}

你如何查看私有头文件并将它们转储为类? - brianestey
嗨@rajagp,你知道如何在接收通知后阻止消息吗? - RVN
有没有其他的方法可以做到这一点。我正在使用Coretelephony.h头文件。我能否使用此头文件实现短信通知。 - Ahad Khan
我正在使用iOS 7.0.6和Xcode 5。我已经实现了这段代码,它可以在收到短信时给我通知,但是无法获取短信内容。 - Ahad Khan

1

尽管海报已经接受了rajagp的答案,但我非常确定它并没有做到问题实际要求的iOS 5。对于iOS 5,我不再看到内容消息,尽管我确实收到通知有新消息。

所以,我做的是采用rajagp的kCTMessageReceivedNotification通知处理程序,并在其中使用此处发布的代码实际上获取文本消息的内容,从短信数据库中获取。


0

这个方法在iOS 7上仍然可用,但我发现在收到kCTMessageReceivedNotification通知后需要稍微延迟一下。否则你可能会错过刚刚接收到的短信。我使用了0.1秒的延迟,并使用了[self performSelector .. afterDelay:0.1];


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接