Below is some code that I've adapted from that website, and works for me on my non jailbroken device:
Firstly add "CoreTelephony.framework" to your project then import it into your view controller like so:
#import <CoreTelephony/CoreTelephonyDefines.h>
Next, add the following code:
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);}
And in viewDidLoad or some other appropriate method, add the following:
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();
For now this code is merely a proof of concept and would have to be expanded upon for error handling and whatnot, but you should get the idea.