как получить сообщение при получении уведомления «kCTMessageReceivedNotification» на 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];} 

Но с ios5 я не могу это сделать, поскольку incMsg равно нулю, так что я могу сделать, чтобы получить сообщение?

благодаря

Вот что я нашел …

Просто глядя на сбрасываемые частные API, похоже, что ChatKit.framework может помочь. Взгляните на CKSMSService.h

или CKMadridService.h для сообщений iMessage.

Я быстро попытался выполнить мой собственный метод, для пары методов в CKSMSService :

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

но на iOS 5.0.1 я не видел ни одного из вызываемых (возможно, моей ошибки?). Итак, я попытался просто получить сообщение непосредственно из базы данных sqlite SMS. Примечание … Я не создал полное приложение для регистрации на уведомления. Я предполагаю, что ваш код получит kCTMessageReceivedNotification в порядке … он просто больше не дает вам контент для SMS. Итак, если вы поместите следующий код в обработчик уведомлений, вы сможете увидеть текст сообщения:

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

Теперь убедитесь, что это приложение установлено в / Applications / . Если вы просто создаете это приложение и обычно устанавливаете его с помощью Xcode, вы получите отказ в разрешении, открывающем базу данных sqlite, из-за песочницы приложения.

Мой fragment кода просто получает самый последний текстовый контент. Вот пример работы с базой данных . Посмотрите на метод QuerySMS .

Кроме того, вот ссылка на формат базы данных sms.db. Вы можете найти то, что вам нужно. Или просто скопируйте sms.db на свой компьютер и просмотрите его с помощью чего-то вроде плагина FirefoxiteiteManager . Удачи!

Обновление: некоторая информация из вопроса, который я отправил по многопроцессной безопасности streamов SQLite на iOS

Вы можете ссылаться ниже ссылки

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

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

  3. Как заблокировать входящие SMS-сообщения в джейлбрейке iPhone + код

  4. IOS Jailbreak Как перехватывать SMS / текстовые сообщения

Мне удалось получить последнее сообщение на неуправляемом iOS8 устройстве:

  1. Получите CKDBMessage.h из заголовков ChatKit и добавьте файл в свой проект.
  2. Подпишитесь на kCTMessageReceivedNotification через CTTelephonyCenterAddObserver
  3. Используйте эту функцию, чтобы получить информацию о последнем полученном сообщении:

     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); } 
  • Отправить SMS в android
  • Отправка SMS с веб-сайта ASP.NET
  • SMS-шлюз для Windows + C #
  • Отправка и получение текста с использованием эмулятора Android
  • Как отправить SMS на Java
  • Удаление программных продуктов Android SMS
  • Как отправить SMS более 160 символов?
  • Обнаружение входящих и исходящих SMS-сообщений
  • Как отправлять SMS-сообщения с моего компьютера через Android-телефон?
  • Android PendingIntent, не получаемый BroadcastReceiver
  • Android - приемник SMS-вещания
  • Давайте будем гением компьютера.