如何在IOS5上收到"kCTMessageReceivedNotification"通知时获取消息

dus*_*tdn 7 iphone sms jailbreak ios5

使用ios4.x我可以使用下面的代码获取"kCTMessageReceivedNotification"通知时的消息

CTTelephonyCenterAddObserver( ct, NULL, callback,NULL,NULL, CFNotificationSuspensionBehaviorHold); 

if ([notifyname isEqualToString:@"kCTMessageReceivedNotification"])//receive message
    {

        NSDictionary *info = (NSDictionary *)userInfo;
        CFNumberRef msgID = (CFNumberRef)[info objectForKey:@"kCTMessageIdKey"];
        int result;
        CFNumberGetValue((CFNumberRef)msgID, kCFNumberSInt32Type, &result);   
        Class CTMessageCenter = NSClassFromString(@"CTMessageCenter");
        id mc = [CTMessageCenter sharedMessageCenter];
        id incMsg = [mc incomingMessageWithId: result];}
Run Code Online (Sandbox Code Playgroud)

但是对于ios5我不能这样做因为incMsg是零,所以我该怎么做才能得到消息?

谢谢

Nat*_*ate 8

这是我发现的......

只是看看转储的私有API,它看起来像ChatKit.framework可以帮助.看看 CKSMSService.h

或者用于iMessage消息的CKMadridService.h.

对于以下两种方法,我很快就试图调整自己的方法CKSMSService:

- (void)_receivedMessage: (id)arg1 replace:(BOOL)arg2 replacedRecordIdentifier:(int)arg3 postInternalNotification:(BOOL)arg4;

- (void)_receivedMessage: (id)arg1 replace:(BOOL)arg2 postInternalNotification:(BOOL)arg3;
Run Code Online (Sandbox Code Playgroud)

但在iOS 5.0.1上,我没有看到其中任何一个被调用(也许是我的错误?).所以,我试图直接从sqlite SMS数据库中获取消息.注意...我没有构建完整的应用程序,注册通知.我假设你的代码kCTMessageReceivedNotification是正常的...它只是不再给你短信内容.因此,如果您将以下代码放在通知处理程序中,您应该能够看到消息文本:

- (NSString *) mostRecentSMS  { 
    NSString *text = @"";

    sqlite3 *database;
    if(sqlite3_open([@"/private/var/mobile/Library/SMS/sms.db" UTF8String], &database) == SQLITE_OK) {
        sqlite3_stmt *statement;

        // iOS 4 and 5 may require different SQL, as the .db format may change
        const char *sql4 = "SELECT text from message ORDER BY rowid DESC";  // TODO: different for iOS 4.* ???
        const char *sql5 = "SELECT text from message ORDER BY rowid DESC";

        NSString *osVersion =[[UIDevice currentDevice] systemVersion];         
        if([osVersion hasPrefix:@"5"]) {
            // iOS 5.* -> tested
            sqlite3_prepare_v2(database, sql5, -1, &statement, NULL);
        } else {
            // iOS != 5.* -> untested!!!
            sqlite3_prepare_v2(database, sql4, -1, &statement, NULL);
        }

        // Use the while loop if you want more than just the most recent message
        //while (sqlite3_step(statement) == SQLITE_ROW) {
        if (sqlite3_step(statement) == SQLITE_ROW) {
            char *content = (char *)sqlite3_column_text(statement, 0);
            text = [NSString stringWithCString: content encoding: NSUTF8StringEncoding];
            sqlite3_finalize(statement);
        }

        sqlite3_close(database);
    }
    return text;
}    
Run Code Online (Sandbox Code Playgroud)

现在,确保此应用程序安装在/ Applications /中.如果您只是构建此应用程序,并使用Xcode正常安装,那么由于应用程序沙盒,您将获得打开sqlite数据库的权限被拒绝错误.

我的代码段只是获取最新的文本内容. 以下是使用数据库进行更多操作的示例.看看这个QuerySMS方法.

另外,这是sms.db 数据库格式链接.你可以在那里找到你需要的其他东西.或者,只需将sms.db复制到您的计算机,然后使用Firefox SQLiteManager插件等浏览它.祝好运!

更新:我在iOS上发布的多进程SQLite线程安全问题中的一些信息