12

私は現在、テキスト メッセージを傍受し、そのメッセージの内容に応じて反応するアプリケーションを作成しようとしています。CKSMSService クラスのメソッドにフックしようとしまし_receivedMessage:(struct __CKSMSRecord *)message replace:(BOOL)replaceたが、これはまったく呼び出されないようです。

フックする必要がある関数/クラスを教えてください。テキスト メッセージが表示されてデータベースに保存される前に、テキスト メッセージをインターセプトする必要があります。私は IOS 5.0.1 を使用しています。

どんな助けでも本当に感謝しています。

4

3 に答える 3

10

このコード スニペットは SMS メッセージをインターセプトする必要があります。他の種類の通知用に拡張できます。iOS 5.0.1 でも動作します。ただし、iMessages では機能しません。CoreTelephony フレームワークとのリンク (クラスダンプできるプライベート ヘッダーがたくさんあります)

#include <dlfcn.h>

#define CORETELPATH "/System/Library/PrivateFrameworks/CoreTelephony.framework/CoreTelephony"
id(*CTTelephonyCenterGetDefault)();

void (*CTTelephonyCenterAddObserver) (id,id,CFNotificationCallback,NSString*,void*,int);


static void telephonyEventCallback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
{
    NSString *notifyname=(NSString *)name;
    if ([notifyname isEqualToString:@"kCTMessageReceivedNotification"])//received SMS
    {
        NSLog(@" SMS Notification Received :kCTMessageReceivedNotification");
        // Do blocking here. 
    }
}

-(void) registerCallback {

 void *handle = dlopen(CORETELPATH, RTLD_LAZY);
    CTTelephonyCenterGetDefault = dlsym(handle, "CTTelephonyCenterGetDefault");
    CTTelephonyCenterAddObserver = dlsym(handle,"CTTelephonyCenterAddObserver");
    dlclose(handle);
    id ct = CTTelephonyCenterGetDefault();

    CTTelephonyCenterAddObserver(
                                 ct, 
                                 NULL, 
                                 telephonyEventCallback,
                                 NULL,
                                 NULL,
                                 CFNotificationSuspensionBehaviorDeliverImmediately);
}
于 2012-01-12T16:10:24.070 に答える
1

ポスターはすでにrajagp の回答を受け入れていますが、 iOS 5では、質問が実際に尋ねたことを実行しないと確信しています。iOS 5 の場合、メッセージの内容は表示されなくなりましたが、新しいメッセージがあることは通知されます。

そこで、rajagp の通知ハンドラーを取得しkCTMessageReceivedNotification、その内部で、ここに投稿されたコードを使用して、SMS データベースからテキスト メッセージの内容を実際に取得しました。

于 2012-06-14T06:53:55.400 に答える
0

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

于 2016-02-15T22:45:41.947 に答える