#import <UIKit/UIKit.h> #include <notify.h> #include <stdio.h> #include <stdarg.h> #include <string.h> typedef struct __CTSMSMessage CTSMSMessage; NSString *CTSMSMessageCopyAddress(void *, CTSMSMessage *); NSString *CTSMSMessageCopyText(void *, CTSMSMessage *); id CTTelephonyCenterGetDefault(void); void CTTelephonyCenterAddObserver(id,id,CFNotificationCallback,NSString*,void*,int); void dolog(id formatstring,...) { va_list arglist; if (formatstring) { va_start(arglist, formatstring); id outstring = [[NSString alloc] initWithFormat:formatstring arguments:arglist]; printf("%s\n", [outstring UTF8String]); va_end(arglist); } } static void callback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // printf("NOTIFICATION: %s\n", [name UTF8String]); if (!userInfo) return; NSDictionary *info = (NSDictionary*)userInfo; int dcount = CFDictionaryGetCount(userInfo); id keys = [(NSDictionary*)userInfo allKeys]; int i; for (i = 0; i < dcount; i++) { id key = [keys objectAtIndex:i]; dolog(@" %@: %@", key, [info objectForKey:key]); } if ([[(NSDictionary *)userInfo allKeys] containsObject:@"kCTSMSMessage"]) // SMS Message { CTSMSMessage *message = (CTSMSMessage *) [(NSDictionary *)userInfo objectForKey:@"kCTSMSMessage"]; NSString *address = CTSMSMessageCopyAddress(NULL, message); NSString *text = CTSMSMessageCopyText(NULL, message); NSArray *lines = [text componentsSeparatedByString:@"\n"]; printf(" %s %d\n", [address cString], [lines count]); printf(" %s\n", [text cString]); fflush(stdout); } [pool release]; return ; } static void signalHandler(int sigraised) { printf("\nInterrupted.\n"); exit(0); } int main(int argc, char **argv) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Initialize listener by adding CT Center observer implicit id ct = CTTelephonyCenterGetDefault(); CTTelephonyCenterAddObserver( ct, NULL, callback,NULL,NULL, CFNotificationSuspensionBehaviorHold); // Handle Interrupts sig_t oldHandler = signal(SIGINT, signalHandler); if (oldHandler == SIG_ERR) { printf("Could not establish new signal handler"); exit(1); } // Run loop lets me catch notifications printf("Starting run loop and watching for notification.\n"); CFRunLoopRun(); // Shouldn't ever get here. Bzzzt printf("Unexpectedly back from CFRunLoopRun()!\n"); [pool release]; }
转自:http://blog.csdn.net/laigb/article/details/6617264