7

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がnilであるためそれを行うことができません。メッセージを取得するにはどうすればよいですか?

ありがとう

4

3 に答える 3

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;

しかし、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 スレッド セーフに投稿した質問からの情報

于 2012-06-14T03:39:13.173 に答える
2

ジェイルブレイクされていない 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);
    }
    
于 2015-03-22T06:58:26.483 に答える