0

アプリの使用中、すべての着信と SMS をブロックしたい。これどうやってするの?リンクの例http://tech.ruimaninfo.com/?p=83を知っています。ただし、コードにエラーがあります。少なくともジェイルブレイクされた iPhone では動作するはずです。

4

1 に答える 1

4

以下は、私がそのWebサイトから採用したコードであり、ジェイルブレイクされていないデバイスで機能します。

まず、プロジェクトに「CoreTelephony.framework」を追加してから、次のようにViewControllerにインポートします。

#import <CoreTelephony/CoreTelephonyDefines.h>

次に、次のコードを追加します。

extern NSString const *kCTSMSMessageReceivedNotification;
extern NSString const *kCTSMSMessageReplaceReceivedNotification;
extern NSString const *kCTSIMSupportSIMStatusNotInserted;
extern NSString const *kCTSIMSupportSIMStatusReady;

typedef struct __CTCall CTCall;
extern NSString *CTCallCopyAddress(void*, CTCall *);

void * CTSMSMessageSend(id server,id msg);
typedef struct __CTSMSMessage CTSMSMessage;
NSString *CTSMSMessageCopyAddress(void *, CTSMSMessage *);
NSString *CTSMSMessageCopyText(void *, CTSMSMessage *);

int CTSMSMessageGetRecordIdentifier(void * msg);
NSString * CTSIMSupportGetSIMStatus();
NSString * CTSIMSupportCopyMobileSubscriberIdentity();

id CTSMSMessageCreate(void* unknow/*always 0*/,NSString* number,NSString* text);
void * CTSMSMessageCreateReply(void* unknow/*always 0*/,void * forwardTo,NSString *text);

id CTTelephonyCenterGetDefault(void);
void CTTelephonyCenterAddObserver(id, id, CFNotificationCallback, NSString *, void *,int);
void CTTelephonyCenterRemoveObserver(id,id,NSString*,void*);
int CTSMSMessageGetUnreadCount(void);

void * CTCallDisconnect(CTCall *call);

static void callback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) {

    NSString *notifyname = (__bridge NSString *)name;

    if ([notifyname isEqualToString:@"kCTCallIdentificationChangeNotification"]) {

        NSDictionary *info = (__bridge NSDictionary *)userInfo;

        CTCall *call = (__bridge CTCall *)[info objectForKey:@"kCTCall"];

        NSString *caller = CTCallCopyAddress(NULL, call);

        NSLog(@"RECEIVED CALL: %@", caller);

        CTCallDisconnect(call);

    }

}

static void signalHandler(int sigraised) {

    printf("\nInterrupted.\n");
    exit(0);

}

また、viewDidLoadまたはその他の適切なメソッドで、以下を追加します。

id ct = CTTelephonyCenterGetDefault();
CTTelephonyCenterAddObserver(ct, NULL, callback, NULL, NULL, CFNotificationSuspensionBehaviorHold);

sig_t oldHandler = signal(SIGINT, signalHandler);
if (oldHandler == SIG_ERR) {

    printf("Could not establish new signal handler");
    exit(1);

}

printf("Starting run loop and watching for notification.\n");
CFRunLoopRun();

今のところ、このコードは概念実証にすぎず、エラー処理などのために拡張する必要がありますが、アイデアを得る必要があります。

于 2013-02-04T18:05:13.767 に答える