天天看點

電話事件整理

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); 

static void callback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) 
{
    NSString *notifyname=(NSString *)name;
    if ([notifyname isEqualToString:@"kCTCallStatusChangeNotification"])//電話
    {
        NSDictionary *info = (NSDictionary*)userInfo;
        
        NSString *state=[[info objectForKey:@"kCTCallStatus"] stringValue];
        if ([state isEqualToString:@"5"])//disconnect
            NSLog(@"未接:%@",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);
        /* or one of the following functions: CTCallAnswer
         CTCallAnswerEndingActive
         CTCallAnswerEndingAllOthers
         CTCallAnswerEndingHeld
        */
        
    }
    else if ([notifyname isEqualToString:@"kCTRegistrationDataStatusChangedNotification"])
    {
        
    }
    else if ([notifyname isEqualToString:@"kCTSMSMessageReceivedNotification"])
    {//api 已過期
        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"])//收到短信
    {
        /*
         kCTMessageIdKey = "-2147483636";
         kCTMessageTypeKey = 1; 
        */
        
        NSDictionary *info = (NSDictionary *)userInfo;
        CFNumberRef msgID = (CFNumberRef)[info objectForKey:@"kCTMessageIdKey"];
        int result;
        CFNumberGetValue((CFNumberRef)msgID, kCFNumberSInt32Type, &result);
        
        /*
        Class CTMessageCenter = NSClassFromString(@"CTMessageCenter");
        id mc = [CTMessageCenter sharedMessageCenter];
        id incMsg = [mc incomingMessageWithId: result];
        
        int msgType = (int)[incMsg messageType];
        
        if (msgType == 1) //experimentally detected number
        {
            id phonenumber = [incMsg sender];
            
            NSString *senderNumber = (NSString *)[phonenumber canonicalFormat];
            id incMsgPart = [[incMsg items] objectAtIndex:0];
            NSData *smsData = [incMsgPart data];
            NSString *smsText = [[NSString alloc] initWithData:smsData encoding:NSUTF8StringEncoding];
        }
        */
    }
    else if ([notifyname isEqualToString:@"kCTIndicatorsSignalStrengthNotification"])//信号
    {
        /*
        kCTIndicatorsGradedSignalStrength = 2;
        kCTIndicatorsRawSignalStrength = "-101";
        kCTIndicatorsSignalStrength = 19;
        */
        
    }
    else if ([notifyname isEqualToString:@"kCTRegistrationStatusChangedNotification"])//網絡注冊狀态
    {
        /*
         kCTRegistrationInHomeCountry = 1;
         kCTRegistrationStatus = kCTRegistrationStatusRegisteredHome;
        */
        
    }
    else if ([notifyname isEqualToString:@"kCTRegistrationDataStatusChangedNotification"])
    {
        /*
         kCTRegistrationDataActive = 1;
         kCTRegistrationDataAttached = 1;
         kCTRegistrationDataConnectionServices =     (
         kCTDataConnectionServiceTypeInternet,
         kCTDataConnectionServiceTypeWirelessModemTraffic,
         kCTDataConnectionServiceTypeWirelessModemAuthentication
         );
         kCTRegistrationDataContextID = 0;
         kCTRegistrationDataIndicator = kCTRegistrationDataIndicator3G;
         kCTRegistrationDataStatus = kCTRegistrationDataStatusAttachedAndActive;
         kCTRegistrationDataStatusInternationalRoaming = 1;
         kCTRegistrationRadioAccessTechnology = kCTRegistrationRadioAccessTechnologyUTRAN;
        */ 
    }
    else if ([notifyname isEqualToString:@"kCTRegistrationCellChangedNotification"])
    {
        /*
         kCTRegistrationGsmCellId = 93204174;
         kCTRegistrationGsmLac = 55583;
         kCTRegistrationInHomeCountry = 1;
         kCTRegistrationRadioAccessTechnology = kCTRegistrationRadioAccessTechnologyUTRAN; 
        */
    }
    else if ([notifyname isEqualToString:@"kCTIndicatorRadioTransmitNotification"])
    {
        /*
        kCTRadioTransmitDCHStatus = 1;
        */ 
    }
    //int unread=CTSMSMessageGetUnreadCount();
    //if (unread>0)
        //NSLog(@"未讀短信:%d",unread);
        
    NSLog(@"名字:%@-詳細:%@",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();