これが私が見つけたものです...
ダンプされたプライベート 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;
しかし、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 データベースを開くときにアクセス許可が拒否されたというエラーが発生します。
私のコード スニペットは、最新のテキスト コンテンツを取得するだけです。 これは、データベースをもう少し処理する例です。QuerySMS
メソッドを見てください。
また、ここにsms.dbのデータベース形式に関するリンクがあります。他に必要なものはそこにあります。または、sms.db をコンピューターにコピーし、Firefox SQLiteManager プラグインなどで参照します。幸運を!
更新: iOS のマルチプロセス SQLite スレッド セーフに投稿した質問からの情報