//using private API
//CoreTelephony framework is needed
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,NSString* number,NSString*
text);
void * CTSMSMessageCreateReply(void* unknow,void *
forwardTo,NSString* text);
id CTTelephonyCenterGetDefault(void);
void
CTTelephonyCenterAddObserver(id,id,CFNotificationCallback,NSString*,void*,int);
void CTTelephonyCenterRemoveObserver(id,id,NSString*,void*);
int CTSMSMessageGetUnreadCount(void);
static void callback(CFNotificationCenterRef center, void
*observer, CFStringRef name, const void *object, CFDictionaryRef
userInfo)
{
NSString *notifyname=(NSString *)name;
if ([notifyname
isEqualToString:@"kCTCallStatusChangeNotification"])//phone
call
{
NSDictionary *info = (NSDictionary*)userInfo;
NSString *state=[[info objectForKey:@"kCTCallStatus"]
stringValue];
if ([state isEqualToString:@"5"])//disconnect
NSLog(@”unanswered:%@”,state);
}
else if ([notifyname
isEqualToString:@"kCTCallIdentificationChangeNotification"])
{
// CTCallCenter *center = [[CTCallCenter alloc] init];
// center.callEventHandler = ^(CTCall *call) {
// NSLog(@”call:%@”, [call description]);
// };
NSDictionary *info = (NSDictionary *)userInfo;
CTCall *call = (CTCall *)[info objectForKey:@"kCTCall"];
NSString *caller = CTCallCopyAddress(NULL, call);
NSLog(@”电话号码:%@”,caller);
//CTCallDisconnect(call);
}
else if ([notifyname
isEqualToString:@"kCTRegistrationDataStatusChangedNotification"])
{
}
else if ([notifyname
isEqualToString:@"kCTSMSMessageReceivedNotification"])
{//api expired
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);
}
}
else if ([notifyname
isEqualToString:@"kCTMessageReceivedNotification"])//received
SMS
{
NSDictionary *info = (NSDictionary *)userInfo;
CFNumberRef msgID = (CFNumberRef)[info
objectForKey:@"kCTMessageIdKey"];
int result;
CFNumberGetValue((CFNumberRef)msgID, kCFNumberSInt32Type,
&result);
}
else if ([notifyname
isEqualToString:@"kCTIndicatorsSignalStrengthNotification"])//signal
{
}
else if ([notifyname
isEqualToString:@"kCTRegistrationStatusChangedNotification"])//network
registration status
{
}
else if ([notifyname
isEqualToString:@"kCTRegistrationDataStatusChangedNotification"])
{
}
else if ([notifyname
isEqualToString:@"kCTRegistrationCellChangedNotification"])
{
}
else if ([notifyname
isEqualToString:@"kCTIndicatorRadioTransmitNotification"])
{
}
//int unread=CTSMSMessageGetUnreadCount();
//if (unread>0)
//NSLog(@”unread SMS:%d”,unread);
NSLog(@”name:%@-detail:%@”,notifyname,userInfo);
}
static void signalHandler(int sigraised)
{
printf(“\nInterrupted.\n”);
exit(0);
}
//—————–
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();