| The iPhone Wiki is no longer updated. Visit this article on The Apple Wiki for current information. | 
Difference between revisions of "CoreTelephony"
|  (New page: CoreTelephony is the iPhone framework used for high-level cell modem interaction.  It handles SMS, MMS, phone calls, etc.  It is written in C, C++, and in 3.0, Objective-C portions were ad...) |  (Added example code to listen for incoming SMS messages) | ||
| Line 14: | Line 14: | ||
|   CFStringRef          CTSMSMessageCopyText(void *, CTSMSMessage *); |   CFStringRef          CTSMSMessageCopyText(void *, CTSMSMessage *); | ||
|   CTSMSMessage*        CTSMSMessageCreate(void*,CFStringRef number, CFStringRef name); |   CTSMSMessage*        CTSMSMessageCreate(void*,CFStringRef number, CFStringRef name); | ||
| − | |||
| ====Objective-C==== | ====Objective-C==== | ||
| Line 20: | Line 19: | ||
|   [[CTMessageCenter sharedMessageCenter]  sendSMSWithText:message serviceCenter:nil toAddress:number]; |   [[CTMessageCenter sharedMessageCenter]  sendSMSWithText:message serviceCenter:nil toAddress:number]; | ||
| where message and number are NSStrings filled with the correct data. | where message and number are NSStrings filled with the correct data. | ||
| + | |||
| + | =====Experimental code to listen for incoming SMS===== | ||
| + | <code> | ||
| + |   static void callback(CFNotificationCenterRef center, void *observer, NSString* name, const void *object, NSDictionary* info) { | ||
| + |   fprintf(stderr, "Notification intercepted: %s\n", [name UTF8String]); | ||
| + |   if([name isEqualToString:@"kCTMessageReceivedNotification"] && info) | ||
| + |   { | ||
| + |     NSNumber* messageType = [info valueForKey:@"kCTMessageTypeKey"]; | ||
| + |     if([messageType isEqualToNumber:[NSNumber numberWithInt:1/*empirically determined!*/]]) | ||
| + |     { | ||
| + |       NSNumber* messageID = [info valueForKey:@"kCTMessageIdKey"]; | ||
| + |       CTMessageCenter* mc = [CTMessageCenter sharedMessageCenter]; | ||
| + |       CTMessage* msg = [mc incomingMessageWithId:[messageID intValue]]; | ||
| + |       NSObject<CTMessageAddress>* phonenumber = [msg sender]; | ||
| + | |||
| + |       NSString *senderNumber = (NSString*)[phonenumber canonicalFormat]; | ||
| + |       NSString *sender = (NSString*)[phonenumber encodedString]; | ||
| + |       CTMessagePart* msgPart = [[msg items] objectAtIndex:0]; //for single-part msgs | ||
| + |       NSData *smsData = [msgPart data]; | ||
| + |       NSString *smsText = [[NSString alloc] initWithData:smsData encoding:NSUTF8StringEncoding]; | ||
| + |       fprintf(stderr, "SMS Message from %s / %s: \"%s\"\n",[senderNumber UTF8String],[sender UTF8String],[smsText UTF8String]); | ||
| + |     } | ||
| + |   } | ||
| + |   return; | ||
| + |   } | ||
| + | |||
| + |   int main(int argc, char **argv) | ||
| + |   { | ||
| + |   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; | ||
| + | |||
| + |   id ct = CTTelephonyCenterGetDefault(); | ||
| + |   CTTelephonyCenterAddObserver(ct, NULL, callback, NULL, NULL, CFNotificationSuspensionBehaviorHold); | ||
| + | |||
| + |   // Start the run loop. Now we'll receive notifications. | ||
| + |   [[NSRunLoop currentRunLoop] run]; | ||
| + |   [pool drain]; | ||
| + |   printf("Unexpectedly back from CFRunLoopRun()!\n"); | ||
| + |   [pool release]; | ||
| + |   } | ||
| + | </code> | ||
Latest revision as of 21:21, 18 August 2010
CoreTelephony is the iPhone framework used for high-level cell modem interaction. It handles SMS, MMS, phone calls, etc. It is written in C, C++, and in 3.0, Objective-C portions were added.
Contents
Usage
In order to use CoreTelephony, you need to set up your build environment to link against it. 
You also need a set of header files, which can be obtained by using the class-dump tool on the framework.
C functions/types
typedef struct __CTSMSMessage CTSMSMessage;
void* CTTelephonyCenterGetDefault(); void CTSMSMessageSend(void*,CTSMSMessage*); CFStringRef CTSMSMessageCopyAddress(void *, CTSMSMessage *); CFStringRef CTSMSMessageCopyText(void *, CTSMSMessage *); CTSMSMessage* CTSMSMessageCreate(void*,CFStringRef number, CFStringRef name);
Objective-C
The ObjC parts are much easier to work with because of the magic of class-dump. The only work I've done is getting an SMS message sent out. This can be accomplished in one line of code:
[[CTMessageCenter sharedMessageCenter] sendSMSWithText:message serviceCenter:nil toAddress:number];
where message and number are NSStrings filled with the correct data.
Experimental code to listen for incoming SMS
 static void callback(CFNotificationCenterRef center, void *observer, NSString* name, const void *object, NSDictionary* info) {
 fprintf(stderr, "Notification intercepted: %s\n", [name UTF8String]);
 if([name isEqualToString:@"kCTMessageReceivedNotification"] && info)
 {
   NSNumber* messageType = [info valueForKey:@"kCTMessageTypeKey"];
   if([messageType isEqualToNumber:[NSNumber numberWithInt:1/*empirically determined!*/]])
   {
     NSNumber* messageID = [info valueForKey:@"kCTMessageIdKey"];
     CTMessageCenter* mc = [CTMessageCenter sharedMessageCenter];
     CTMessage* msg = [mc incomingMessageWithId:[messageID intValue]];
     NSObject<CTMessageAddress>* phonenumber = [msg sender];
     
     NSString *senderNumber = (NSString*)[phonenumber canonicalFormat];
     NSString *sender = (NSString*)[phonenumber encodedString];
     CTMessagePart* msgPart = [[msg items] objectAtIndex:0]; //for single-part msgs
     NSData *smsData = [msgPart data];
     NSString *smsText = [[NSString alloc] initWithData:smsData encoding:NSUTF8StringEncoding];
     fprintf(stderr, "SMS Message from %s / %s: \"%s\"\n",[senderNumber UTF8String],[sender UTF8String],[smsText UTF8String]);
   }
 }
 return;
 }
 int main(int argc, char **argv)
 {
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
 id ct = CTTelephonyCenterGetDefault();
 CTTelephonyCenterAddObserver(ct, NULL, callback, NULL, NULL, CFNotificationSuspensionBehaviorHold);
 
 // Start the run loop. Now we'll receive notifications.
 [[NSRunLoop currentRunLoop] run];
 [pool drain];
 printf("Unexpectedly back from CFRunLoopRun()!\n");
 [pool release];
 }
