我目前正在尝试编写一个拦截文本消息的应用程序,并根据该消息的内容做出反应。
我试图在CKSMSService类中挂钩_receivedMessage:(struct __CKSMSRecord *)message replace:(BOOL)replace
方法,但这似乎根本没有被调用。
有人可以告诉我我要挂钩的功能/课程吗?我需要在文本消息显示并存储到数据库之前拦截它。我在IOS 5.0.1上。
真的很感激任何帮助。
答案 0 :(得分:10)
此代码段应拦截SMS消息 - 您可以将其扩展为其他类型的通知。也适用于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);
}
答案 1 :(得分:1)
虽然海报已被接受rajagp's answer,但我很确定它没有按照实际问题提出要求,在iOS 5上。对于iOS 5,我不再看到消息内容,但我收到通知,告知有新消息。
所以,我所做的是从SMS数据库中获取kCTMessageReceivedNotification
及其内部use the code posted here to actually get the content of the text message的rajagp通知处理程序。
答案 2 :(得分:0)
这仍适用于iOS 7,但我发现在收到kCTMessageReceivedNotification通知后需要稍微延迟。否则你会错过收到的短信。我使用0.1秒的延迟,使用[self performSelector .. afterDelay:0.1];