como receber a mensagem ao receber a notificação “kCTMessageReceivedNotification” no IOS5

Com ios4.x eu posso usar o código abaixo para receber a mensagem quando receber a notificação “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];} 

Mas com o ios5 eu não posso fazer isso porque o incMsg é nulo, então o que posso fazer para obter a mensagem?

obrigado

    Aqui está o que eu encontrei …

    Apenas olhando para as APIs privadas despejadas, parece que o ChatKit.framework pode ajudar. Dê uma olhada no CKSMSService.h

    ou CKMadridService.h para mensagens do iMessage.

    Rapidamente CKSMSService meu próprio método, para alguns methods no CKSMSService :

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

    mas no iOS 5.0.1 eu não vi nenhum desses ser chamado (talvez o meu erro?). Então, eu tentei apenas pegar a mensagem diretamente do database SMS sqlite. Nota … Eu não criei o aplicativo completo para me registrar para receber notifications. Estou supondo que o seu código para obter o kCTMessageReceivedNotification está ok … ele simplesmente não fornece mais o conteúdo do SMS. Portanto, se você colocar o seguinte código no seu manipulador de notificação, poderá ver o texto da mensagem:

     - (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; } 

    Agora, verifique se este aplicativo está instalado em / Applications / . Se você acabou de criar este aplicativo e instalá-lo normalmente com o Xcode, receberá um erro de permissão negada ao abrir o database sqlite, devido ao sandbox de aplicativo.

    Meu trecho de código apenas obtém o conteúdo de texto mais recente. Aqui está um exemplo de fazer um pouco mais com o database . Veja o método QuerySMS .

    Além disso, aqui está um link no formato de database do sms.db. Você pode encontrar o que mais precisa lá. Ou copie o arquivo sms.db para o seu computador e navegue com algo como o plugin Firefox SQLiteManager . Boa sorte!

    Atualização: algumas informações de uma pergunta que eu postei sobre segurança de threads SQLite multiprocessos no iOS

    Você pode consultar abaixo links

    1. http://tech.ruimaninfo.com/?p=83

    2. http://www.ifans.com/forums/threads/coretelephony-cttelephonycenterremoveobserver.232745/

    3. Como bloquear SMS recebidos no iPhone jailbreak + código

    4. IOS Jailbreak Como interceptar SMS / mensagens de texto

    Gerenciei para obter a última mensagem em um dispositivo iOS8 não jailbroken:

    1. Obtenha o CKDBMessage.h dos headers do ChatKit e adicione o arquivo ao seu projeto.
    2. Inscreva-se em kCTMessageReceivedNotification por meio de CTTelephonyCenterAddObserver
    3. Use esta function para obter as informações da última mensagem recebida:

       void SmsReceived() { NSLog(@"GOT SMS"); //open IMDPersistence framework void *libHandle = dlopen("/System/Library/PrivateFrameworks/IMDPersistence.framework/IMDPersistence", RTLD_NOW); //make/get symbol from framework + name IMDMessageRecordGetMessagesSequenceNumber = (int (*)())dlsym(libHandle, "IMDMessageRecordGetMessagesSequenceNumber"); // get id of last SMS from symbol int lastID = IMDMessageRecordGetMessagesSequenceNumber(); NSLog(@"%d", lastID); // close (release?) framework -> needed?? dlclose(libHandle); // get message object dlopen("/System/Library/PrivateFrameworks/ChatKit.framework/ChatKit", RTLD_LAZY); Class CKDBMessageClass = NSClassFromString(@"CKDBMessage");// objc_getClass("CKDBMessage"); CKDBMessage *msg = [[CKDBMessageClass alloc] initWithRecordID:lastID]; NSString *text = msg.text; NSLog(@"text: %@", text); }