iOS 判斷是否安裝SIM卡

轉載自 :http://blog.163.com/china_uv/blog/static/11713726720126725415858/



Core Telephony Framework(核心通訊框架)

概述:

這個庫的前綴爲CT(Core Telephony),主要用來獲得用戶通訊相關信息,我們可以使用這些信息來定義外部接口以便自己使用。當然我們也可以僅僅是用此信息來獲得當前正在通話的信息。

CT的對象可以獲得通訊信息,例如可以利用此進行網絡電話(VoIP — Voice over Internet Protocol)。而又如CTCall可以幫助我們獲得很多當前通話的信息,包括一個唯一碼和一個狀態值——呼叫(dialing)、呼入 (incoming)、通話(connected)、掛斷(disconnected)。

包含以下類型:

CTCall,CTCallCenter,CTCarrier,CTTelephonyNetworkInfo

下面是各對象的詳細介紹

CTCall Class

繼承自: NSObject

版本支持:iOS 4.0及以上版本

聲明於: CTCall.h

概述: CTCall 是對通話信息的一個封裝(別想多了,少的可憐的信息而已…)。

包含屬性:callID、callState

@property (nonatomic, readonly, retain) NSString *callID

用來標識一個手機通話(唯一),以區分多個正在激活的通話(例如掛起的通話與正在通話)。

@property (nonatomic, readonly, retain) NSString *callState

用來標識通話狀態。下面是用於標識的四種狀態:

extern NSString const *CTCallStateDialing;   extern NSString const *CTCallStateIncoming;   extern NSString const *CTCallStateConnected;   extern NSString const *CTCallStateDisconnected;

一個通話最初的狀態爲呼入(CTCallStateIncoming)和呼出(CTCallStateDialing),當接通後狀態轉變爲接通 (CTCallStateConnected),而當通話終止時狀態轉變爲掛斷(CTCallStateDisconnected)

CTCallCenter Class

繼承自: NSObject

版本支持:iOS 4.0及以上版本

聲明於: CTCallCenter.h

概述: CTCallCenter 作用於通話狀態改變時,此時他將回調指定的事件。

包含屬性:callEventHandle,currentCalls

@property (nonatomic, copy) void (^callEventHandler)(CTCall*);

通話事件狀態轉變時進行回調的函數。當我們的程序處於激活狀態,則通話狀態轉變時直接回調我們指定的函數。但是當程序處於掛起狀態時(後臺),程序 不會立即接到狀態轉變的回調,直到重新變爲激活狀態。當又掛起轉爲激活時,程序只能收到每個通話事件最後的轉變狀態。例如,我們的程序在通話創建後(並未 連接)就由激活轉變爲掛起狀態了,而之後此通話先後轉變爲通話、掛斷。當我們的程序重新激活後,我們將收到此電話的掛斷消息回調。這個就是官方文檔中所謂 的Single call event。

簡單的使用方法如下:

CTCallCenter *center = [[CTCallCenter alloc] init]; center.callEventHandler = ^(CTCall *call) { NSLog(@"call:%@", call.callState); } @property (readonly, retain) NSSet *currentCalls

一個當前進程中所有通話的容器。

CTCarrier Class

繼承自: NSObject

版本支持:iOS 4.0及以上版本

聲明於: CTCarrier.h

概述: CTCarrier 是對電信運營商信息的一個封裝

包含屬性:allowsVOIP,carrierName,isoCountryCode,mobileCountryCode,mobileNetworkCode

@property (nonatomic, readonly, assign) BOOL allowsVOIP

用以標識電信運營商是否支持網絡電話(VOIP),而在以下三種情況下這個值將爲nil。

1、設備處於飛行模式

2、檢測不到SIM卡

3、無電信信號

@property (nonatomic, readonly, retain) NSString *carrierName

電信運營商的名字,除非沒有插入過SIM卡,否則這個值將是當前SIM卡或上一SIM卡(當前設備內無SIM卡)電信運營商的名字。

@property (nonatomic, readonly, retain) NSString *isoCountryCode

使用ISO 3166-1標準的國家碼標識電信運營商的所屬國家。處於nil值狀態的情況同allowsVOIP。

@property (nonatomic, readonly, retain) NSString *mobileCountryCode

記錄移動國家碼(MMC),由三位數字組成,唯一地識別移動用戶所屬的國家,我國爲460。值得注意的是這個屬性的類型是NSString而非數值。

@property (nonatomic, readonly, retain) NSString *mobileNetworkCode

記錄移動網絡碼(MNC)由兩位數字組成,用於識別移動用戶所歸屬的移動網。中國移動TD系統使用00,中國聯通GSM系統使用01,中國移動GSM系統使用02,中國電信CDMA系統使用03。

CTTelephonyNetworkInfo Class

繼承自: NSObject

版本支持:iOS 4.0及以上版本

聲明於: CTTelephonyNetworkInfo.h

概述: CTTelephonyNetworkInfo 主要用於更換SIM卡時電信運營商信息的獲取

包含屬性:subscriberCellularProvider,subscriberCellularProviderDidUpdateNotifier

@property(readonly, retain) CTCarrier *subscriberCellularProvider

一個CTCarrier對象,具體包含內容參考CTCarrier Class。

@property(nonatomic, copy) void (^subscriberCellularProviderDidUpdateNotifier)(CTCarrier*);

當電信運營商改變時進行回調的接口。

簡單的使用方法如下:

CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init]; CTCarrier *carrier = info.subscriberCellularProvider; NSLog(@"carrier:%@", [carrier description]); info.subscriberCellularProviderDidUpdateNotifier = ^(CTCarrier *carrier) { NSLog(@"carrier:%@", [carrier description]); }



下面的文章判定代碼是不對的但是弄能夠使用但是 需要去判定的是  

 allowsVOIP這個是否是  nil  (看上面的文章可以看出)


判斷 iPhone 是否插入了 SIM 卡,可以參考蘋果官網的 systemconfigure framework 教程,將下面的代碼複製到頭文件

extern NSString* const kCTSMSMessageReceivedNotification;
extern NSString* const kCTSMSMessageReplaceReceivedNotification;
extern NSString* const kCTSIMSupportSIMStatusNotInserted;
extern NSString* const kCTSIMSupportSIMStatusReady; 

id CTTelephonyCenterGetDefault(void);
void CTTelephonyCenterAddObserver(id,id,CFNotificationCallback,NSString*,void*,int);
void CTTelephonyCenterRemoveObserver(id,id,NSString*,void*);
int CTSMSMessageGetUnreadCount(void); 

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

void* CTSMSMessageSend(id server,id msg); 

NSString *CTSMSMessageCopyAddress(void *, void *);
NSString *CTSMSMessageCopyText(void *, void *); 

    然後引入 CoreTelephony.framework ,即可利用 [CTSIMSupportGetSIMStatus() isEqualToString:kCTSIMSupportSIMStatusNotInserted] 進行判斷。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章