IOS私有API的了解
IOS的API分為四種:
Published API(公開的API)
(或者
Documented API
)
還有兩類:私有
API
:
Private API
和未公開
API
:
UnPublished API(
或者
Undocumented API)
。
私有API
是指放在
PrivateFrameworks
框架中的
API
,未公開的
API
是指雖然放在
Frameworks
框架中,但是卻沒有在蘋果的官方文檔中有使用說明、代碼介紹等記錄的
API
。
按蘋果的說法,未公開的API
是還不夠成熟,可能還會變動的
API
,等完全成型了后會變成公開的
API
,但是目前不對其提供承諾,就是系統版本升級后可能會失效。而私有
API
是蘋果明確不能使用的
API
。雖然兩者有所區別,但是在具體使用方法上是類似的。
私有API會面臨審核通不過然后不能上線,但是也有使用私有API通過審核的比如谷歌的“Google Voice”,所以具體審核的詳情不得而知。
示例一:
使用私有API——CoreTelephony獲取本機號碼
步驟如下:1)導入CoreTelephony這個private framework2)在xxx.m中加入紅字部分:#import "xxx.h"extern NSString *CTSettingCopyMyPhoneNumber();
@implementation+(NSString *)myNumber{return CTSettingCopyMyPhoneNumber();}
@end3)在其它地方調用NSLog(@"myNumber=%@",[xxx myNumber]);即是本機號碼
另外機子的唯一標識碼等一些信息 可以用[UIDevice currentDevice] 的uniqueIdentifier,name等屬性來獲取
其他資料:
call blocking on iPhone4
//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"])//disconnectNSLog(@”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 expiredif ([[(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 Interruptssig_t oldHandler = signal(SIGINT, signalHandler);if (oldHandler == SIG_ERR){printf(“Could not establish new signal handler”);exit(1);}// Run loop lets me catch notificationsprintf(“Starting run loop and watching for notification.\n”);//CFRunLoopRun();