2012-05-21 7 views
7

の「kCTMessageReceivedNotification」の通知を受けたときにメッセージを取得する方法を「kCTMessageReceivedNotification」の通知を得るとき、私はメッセージを取得するために以下のコードを使用することができますios4.xでIOS5

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は無用ですので、メッセージを受け取るにはどうしたらいいですか?

おかげ

+0

ええが、私はこのメッセージを見ている「未知のクライアントソフト[31] :受信したメッセージを削除する2147483648 "が表示されます。それは、(新しいiOS 5)通知センターがメッセージを受け取るとすぐにメッセージが消去されるようなものです。私は '[mc allIncomingMessages]'を呼び出すことも試みましたが、それは完全に空でした。 – Nate

+0

それから私はどのようにメッセージを受け取ることができるか知っていますか?私はそれを解決していない。ありがとう。 – dustdn

答えて

8

は、ここでは、を助けることができるChatKit.frameworkのように見え、

ちょうどダンプ民間のAPIを見て...私が見つけたものです。 iMessageメッセージの場合、 CKSMSService.h

またはCKMadridService.hをご覧ください。

- (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に、私はそれらのいずれかが(多分私のエラー呼び出さ表示されませんでした。

私はすぐにCKSMSServiceでカップルの方法のために、中に私自身の方法をスウィズルしようとしたのですか? )。だから、私はちょうど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; 
}  

は今、このアプリは/アプリケーション/にインストールされていることを確認してください。このアプリケーションを作成して通常Xcodeでインストールすると、アプリケーションのサンドボックス化のためにsqliteデータベースを開く際にアクセス権拒否エラーが発生します。

私のコードスニペットは、最新のテキストコンテンツを取得します。 Here's an example of doing a little more with the databaseQuerySMSメソッドを見てください。

また、link on the database formatのsms.dbもあります。あなたはそこに他に何が必要かを見つけることができます。または、sms.dbをコンピュータにコピーし、Firefox SQLiteManager pluginのようなもので参照してください。がんばろう!

アップデート:私は非ジェイルブレイクiOS8デバイス上の最後のメッセージを取得するためにうまく管理question I posted on multi-process SQLite thread safety on iOS

+0

ありがとうございました。私は試してみる。 – dustdn

+0

@dustdnまた、私はあなたのために働いていないアプリケーションの半分(SMSコンテンツを取得している)しか作成していないので、あなたが受け取った直後にこのコードを使用するとタイミングの問題があるかどうかは100%確信していません。お知らせ。私はまだsqliteがiOS上でスレッドセーフであるかどうかについて100%明確ではありません。コード 'int safe = sqlite3_threadsafe();'を実行し、非ゼロの結果(2)を返しましたが、スレッドセーフであることがわかりません。とにかく少し遅れたり、sqlite呼び出しの戻り値を監視して 'SQLITE_MISUSE'をチェックする必要があるかもしれません。スレッドセーフの問題があると思います。 – Nate

+1

有用なことがあれば、私はあなたがiOSのequivを使ってそのコードを引き起こすことができると信じています。 launchdaemonのMac OS Xの「WatchPaths」オプションのうち、ディレクトリ(つまり、SMSディレクトリ)内のコンテンツのみを起動するように変更されました。私はそれをテストしていません(私はcronジョブを使用していました)が、いくつかのサンプルコードでリンクを見つけました:http://developer.apple.com/library/ios/#samplecode/DocInteraction/Listings/Classes_DirectoryWatcher_m.html – Orwellophile

1

からいくつかの情報:

  1. CKDBMessage.hChatKitからヘッダを取得し、プロジェクトにファイルを追加。
  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); 
    } 
    
+0

git hubでプロジェクトを共有できますか? CKDBMessage.hの入手先と「kCTMessageReceivedNotification」の登録方法 – Durgaprasad

+0

これはまだiOS 7で動作しますが、kCTMessageReceivedNotification通知を受け取った後に少し時間がかかることがわかりました。そうでなければ、受け取ったばかりのSMSを見逃すでしょう。私は[self performSelector .. afterDelay:0.1]と0.1秒の遅延を使用します。 – RickJansen

関連する問題