1、獲取設(shè)備的基本信息
UIDevice *device = [[UIDevice alloc] int];
NSString *name = device.name; //獲取設(shè)備所有者的名稱
NSString *model = device.name; //獲取設(shè)備的類別
NSString *type = device.localizedModel; //獲取本地化版本
NSString *systemName = device.systemName; //獲取當(dāng)前運(yùn)行的系統(tǒng)
NSString *systemVersion = device.systemVersion;//獲取當(dāng)前系統(tǒng)的版本
NSString *identifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; //獲取設(shè)備的唯一標(biāo)識
2、獲取當(dāng)前屏幕的分辨率信息
CGRect rect = [[UIScreen mainScreen] bounds];
CGFloat scale = [[UIScreen mainScreen].scale];
CGFloat width = rect.size.width * scale;
CGFloat height = rect.size.height * scale;
3、獲取運(yùn)營商信息
- (void)getCarrierInfo {
// 獲取運(yùn)營商信息
CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *carrier = info.subscriberCellularProvider;
NSLog(@"carrier:%@", [carrier description]);
// 如果運(yùn)營商變化將更新運(yùn)營商輸出
info.subscriberCellularProviderDidUpdateNotifier = ^(CTCarrier *carrier) {
NSLog(@"carrier:%@", [carrier description]);
};
// 輸出手機(jī)的數(shù)據(jù)業(yè)務(wù)信息
NSLog(@"Radio Access Technology:%@", info.currentRadioAccessTechnology);
// 監(jiān)控通話信息
CTCallCenter *center = [[CTCallCenter alloc] init];
center_ = center;
center.callEventHandler = ^(CTCall *call) {
NSSet *curCalls = center_.currentCalls;
NSLog(@"current calls:%@", curCalls);
NSLog(@"call:%@", [call description]);
};
}
/**
* 運(yùn)營商網(wǎng)絡(luò)狀態(tài)
*
* @return 網(wǎng)絡(luò)狀態(tài)
*/
- (NSString *) carrierStatus
{
CTTelephonyNetworkInfo *info=[CTTelephonyNetworkInfo new];
NSString *status=info.currentRadioAccessTechnology;
if (status == nil || [status length] <= 0) {
return @"UnKnow";
}
if([status isEqualToString:CTRadioAccessTechnologyCDMA1x]||[status isEqualToString:CTRadioAccessTechnologyGPRS])
return @"2G";
else if([status isEqualToString:CTRadioAccessTechnologyEdge])
return @"Edge";
else if([status isEqualToString:CTRadioAccessTechnologyLTE])
return @"4G";
else
return @"3G";
}
4、流量統(tǒng)計(jì)
/**
流量統(tǒng)計(jì)
@return 接收和發(fā)送的流量
*/
+ (NSString *)getNetWorkCounter
{
BOOL success;
struct ifaddrs *addrs;
const struct ifaddrs *cursor;
const struct if_data *networkStatisc;
int WiFiSent = 0;
int WiFiReceived = 0;
int WWANSent = 0;
int WWANReceived = 0;
NSString *name=[[NSString alloc]init];
success = getifaddrs(&addrs) == 0;
if (success)
{
cursor = addrs;
while (cursor != NULL)
{
name=[NSString stringWithFormat:@"%s",cursor->ifa_name];
// NSLog(@"ifa_name %s == %@n", cursor->ifa_name,name);
// names of interfaces: en0 is WiFi ,pdp_ip0 is WWAN
if (cursor->ifa_addr->sa_family == AF_LINK)
{
if ([name hasPrefix:@"en"])
{
networkStatisc = (const struct if_data *) cursor->ifa_data;
WiFiSent+=networkStatisc->ifi_obytes;
WiFiReceived+=networkStatisc->ifi_ibytes;
// NSLog(@"WiFiSent %d ==%d",WiFiSent,networkStatisc->ifi_obytes);
//NSLog(@"WiFiReceived %d ==%d",WiFiReceived,networkStatisc->ifi_ibytes);
}
if ([name hasPrefix:@"pdp_ip"])
{
networkStatisc = (const struct if_data *) cursor->ifa_data;
WWANSent+=networkStatisc->ifi_obytes;
WWANReceived+=networkStatisc->ifi_ibytes;
// NSLog(@"WWANSent %d ==%d",WWANSent,networkStatisc->ifi_obytes);
//NSLog(@"WWANReceived %d ==%d",WWANReceived,networkStatisc->ifi_ibytes);
}
}
cursor = cursor->ifa_next;
}
freeifaddrs(addrs);
}
NSLog(@"wifi發(fā)送:%.2f wifi收到:%.2f 2g/3g/4g發(fā)送:%.2f 2g/3g/4g收到:%.2f ",WiFiSent/1024.0/1024.0,WiFiReceived/1024.0/1024.0,WWANSent/1024.0/1024.0,WWANReceived/1024.0/1024.0);
NSString *liuliangStr = [NSString stringWithFormat:@"wifi發(fā)送:%.2f wifi收到:%.2f 2g/3g/4g發(fā)送:%.2f 2g/3g/4g收到:%.2f ",WiFiSent/1024.0/1024.0,WiFiReceived/1024.0/1024.0,WWANSent/1024.0/1024.0,WWANReceived/1024.0/1024.0];
// return [NSArray arrayWithObjects:[NSNumber numberWithInt:WiFiSent], [NSNumber numberWithInt:WiFiReceived],[NSNumber numberWithInt:WWANSent],[NSNumber numberWithInt:WWANReceived], nil];
return liuliangStr;
}
5、電池相關(guān)信息
//獲取電池當(dāng)前的狀態(tài),共有4種狀態(tài)
-(NSString*) getBatteryState {
UIDevice *device = [UIDevice currentDevice];
if (device.batteryState == UIDeviceBatteryStateUnknown) {
return @"UnKnow";
}else if (device.batteryState == UIDeviceBatteryStateUnplugged){
return @"Unplugged";
}else if (device.batteryState == UIDeviceBatteryStateCharging){
return @"Charging";
}else if (device.batteryState == UIDeviceBatteryStateFull){
return @"Full";
}
return nil;
}
//獲取電量的等級,0.00~1.00
-(float) getBatteryLevel {
return [UIDevice currentDevice].batteryLevel;
}
-(void) getBatteryInfo
{
NSString *state = getBatteryState();
float level = getBatteryLevel()*100.0;
//yourControlFunc(state, level); //寫自己要實(shí)現(xiàn)的獲取電量信息后怎么處理
}
//打開對電量和電池狀態(tài)的監(jiān)控,類似定時(shí)器的功能
-(void) didLoad
{
[[UIDevice currentDevice] setBatteryMonitoringEnable:YES];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getBatteryInfo:) name:UIDeviceBatteryStateDidChangeNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getBatteryInfo:) name:UIDeviceBatteryLevelDidChangeNotification object:nil];
[NSTimer scheduledTimerWithTimeInterval:0.5f target:self selector:@selector(getBatteryInfo:) userInfo:nil repeats:YES];
}
6、在app中打開一個(gè)網(wǎng)頁
NSString *url = @"www.apple.com"
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
7、在app中打開另一個(gè)app
1)啟動內(nèi)置的應(yīng)用,一般的電話,瀏覽器,短信和
郵件可以直接調(diào)用并添加參數(shù)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://123456"]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://devprograms@apple.com"]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://1008611"]];
2)打開自己開發(fā)的app,這種情況則要為將要打開的app注冊一個(gè)URL協(xié)議。
具體方法是在項(xiàng)目的文件info.plist中添加:
<key>URL types</key>
<dict>
<key>URL identifier</key>
<string>@"com.apple.developer"<string/> //可以是任何值,但建議用“反域名”
<key>URL Schemes</key>
<string>@"testDemo"<string/> //輸入你的URL協(xié)議名,例如“testHello://” 應(yīng)寫做“testHello”,可以在這里加入多個(gè)協(xié)議
</dict>
NSString *url = @"URL Schemes的路徑"
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
8、獲取用戶地理位置
/**
獲取用戶的地理位置
*/
-(void)getUserLocation
{
if ([CLLocationManager locationServicesEnabled]) {
CLLocationManager *manager = [[CLLocationManager alloc]init];
[manager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
manager.delegate = self;
[manager startUpdatingLocation];
}
}
#pragma mark - CLLocationManagerDelegate
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
NSLog(@"%@", locations);
[manager stopUpdatingLocation];
CLLocation *newLocation = [locations lastObject];
CLLocationCoordinate2D newCoordinate = newLocation.coordinate;
NSLog(@"經(jīng)度:%f,緯度:%f",newCoordinate.longitude,newCoordinate.latitude);
//-----位置反編碼---
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder reverseGeocodeLocation:newLocation
completionHandler:^(NSArray *placemarks, NSError *error){
for (CLPlacemark *place in placemarks) {
NSLog(@"name,%@",place.name); // 位置名
NSLog(@"thoroughfare,%@",place.thoroughfare); // 街道
NSLog(@"subThoroughfare,%@",place.subThoroughfare); // 子街道
NSLog(@"locality,%@",place.locality); // 市
NSLog(@"subLocality,%@",place.subLocality); // 區(qū)
NSLog(@"country,%@",place.country); // 國家
}
}];
}
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"location error :%@",error);
}
9、獲取用戶通訊錄
/**
獲取用戶的通訊錄
*/
-(void)getUserContactList
{
if (Is_up_Ios_9) {
[self fetchContactListAfterIOS9];
}else{
[self fetchAddressBookBeforeIOS9];
}
}
// -----------9.0以下的獲取方式-------------
- (void)fetchAddressBookBeforeIOS9{
ABAddressBookRef addressBook = ABAddressBookCreate();
//用戶授權(quán)
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) {//首次訪問通訊錄
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
if (!error) {
if (granted) {//允許
NSArray *contacts = [self fetchContactWithAddressBook:addressBook];
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"contacts:%@", contacts);
});
}else{//拒絕
}
}else{
NSLog(@"訪問通訊錄錯(cuò)誤 before ios9= %@",error);
}
});
}else{//非首次訪問通訊錄
NSArray *contacts = [self fetchContactWithAddressBook:addressBook];
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"contacts:%@", contacts);
});
}
}
- (NSMutableArray *)fetchContactWithAddressBook:(ABAddressBookRef)addressBook{
if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) {////有權(quán)限訪問
//獲取聯(lián)系人數(shù)組
NSArray *array = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
NSMutableArray *contacts = [NSMutableArray array];
for (int i = 0; i < array.count; i++) {
//獲取聯(lián)系人
ABRecordRef people = CFArrayGetValueAtIndex((__bridge ABRecordRef)array, i);
//獲取聯(lián)系人詳細(xì)信息,如:姓名,電話,住址等信息
NSString *firstName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonFirstNameProperty);
NSString *lastName = (__bridge NSString *)ABRecordCopyValue(people, kABPersonLastNameProperty);
ABMutableMultiValueRef *phoneNumRef = ABRecordCopyValue(people, kABPersonPhoneProperty);
NSString *phoneNumber = ((__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(phoneNumRef)).lastObject;
[contacts addObject:@{@"name": [firstName stringByAppendingString:lastName], @"phoneNumber": phoneNumber}];
}
return contacts;
}else{//無權(quán)限訪問
NSLog(@"無權(quán)限訪問通訊錄");
return nil;
}
}
// -----------9.0以上的獲取方式-------------
-(void)fetchContactListAfterIOS9
{
CNContactStore *contact = [[CNContactStore alloc]init];
if ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]==CNAuthorizationStatusNotDetermined) {//首次訪問通訊錄
[contact requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (!error) {
if (granted) {//允許
CNContactPickerViewController *contactPicker = [[CNContactPickerViewController alloc] init];
contactPicker.delegate = self;
contactPicker.displayedPropertyKeys = @[CNContactPhoneNumbersKey];
}else{//拒絕
}
}else{
NSLog(@"訪問通訊錄錯(cuò)誤 after ios9= %@",error);
}
}];
}else if ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]==CNAuthorizationStatusAuthorized){//不是首次訪問通訊錄
CNContactPickerViewController *contactPicker = [[CNContactPickerViewController alloc] init];
contactPicker.delegate = self;
contactPicker.displayedPropertyKeys = @[CNContactPhoneNumbersKey];
}else{
NSLog(@"無權(quán)訪問通訊錄");
}
}
#pragma mark -- CNContactPickerDelegate
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContactProperty:(CNContactProperty *)contactProperty {
CNPhoneNumber *phoneNumber = (CNPhoneNumber *)contactProperty.value;
/// 聯(lián)系人
NSString *text1 = [NSString stringWithFormat:@"%@%@",contactProperty.contact.familyName,contactProperty.contact.givenName];
/// 電話
NSString *text2 = phoneNumber.stringValue;
// text2 = [text2 stringByReplacingOccurrencesOfString:@"-" withString:@""];
NSLog(@"聯(lián)系人:%@, 電話:%@",text1,text2);
}
10、獲取設(shè)備當(dāng)前網(wǎng)絡(luò)IP地址
#pragma mark - 獲取設(shè)備當(dāng)前網(wǎng)絡(luò)IP地址
+ (NSString *)getIPAddress:(BOOL)preferIPv4
{
//判斷網(wǎng)絡(luò)類型:wifi
if ([PPCAppBaseInfo shareBaseInfo].networkType==1) {
NSArray *searchArray = preferIPv4 ?
@[ IOS_VPN @"/" IP_ADDR_IPv4, IOS_VPN @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6 ] :
@[ IOS_VPN @"/" IP_ADDR_IPv6, IOS_VPN @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4 ] ;
NSDictionary *addresses = [self getIPAddresses];
// NSPPCLog(@"addresses: %@", addresses);
__block NSString *address;
[searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop)
{
address = addresses[key];
//篩選出IP地址格式
if([self isValidatIP:address]) *stop = YES;
} ];
// NSPPCLog(@"ip = %@", address);
return address ? address : @"0.0.0.0";
}
//wann
return [self deviceWANIPAddress];
}
+ (BOOL)isValidatIP:(NSString *)ipAddress {
if (ipAddress.length == 0) {
return NO;
}
NSString *urlRegEx = @"^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
"([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
"([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";
NSError *error;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlRegEx options:0 error:&error];
if (regex != nil) {
NSTextCheckingResult *firstMatch=[regex firstMatchInString:ipAddress options:0 range:NSMakeRange(0, [ipAddress length])];
if (firstMatch) {
// NSRange resultRange = [firstMatch rangeAtIndex:0];
// NSString *result=[ipAddress substringWithRange:resultRange];
//輸出結(jié)果
// NSPPCLog(@"%@",result);
return YES;
}
}
return NO;
}
+ (NSDictionary *)getIPAddresses
{
NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8];
// retrieve the current interfaces - returns 0 on success
struct ifaddrs *interfaces;
if(!getifaddrs(&interfaces)) {
// Loop through linked list of interfaces
struct ifaddrs *interface;
for(interface=interfaces; interface; interface=interface->ifa_next) {
if(!(interface->ifa_flags & IFF_UP) /* || (interface->ifa_flags & IFF_LOOPBACK) */ ) {
continue; // deeply nested code harder to read
}
const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr;
char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ];
if(addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) {
NSString *name = [NSString stringWithUTF8String:interface->ifa_name];
NSString *type;
if(addr->sin_family == AF_INET) {
if(inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) {
type = IP_ADDR_IPv4;
}
} else {
const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)interface->ifa_addr;
if(inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) {
type = IP_ADDR_IPv6;
}
}
if(type) {
NSString *key = [NSString stringWithFormat:@"%@/%@", name, type];
addresses[key] = [NSString stringWithUTF8String:addrBuf];
}
}
}
// Free memory
freeifaddrs(interfaces);
}
return [addresses count] ? addresses : nil;
}
//wann
+(NSString *)deviceWANIPAddress
{
NSURL *ipURL = [NSURL URLWithString:@"http://ip.taobao.com/service/getIpInfo.php?ip=myip"];
NSData *data = [NSData dataWithContentsOfURL:ipURL];
NSDictionary *ipDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
// NSLog(@"ip = %@",(ipDic[@"data"][@"ip"] ? ipDic[@"data"][@"ip"] : @""));
return (ipDic[@"data"][@"ip"] ? ipDic[@"data"][@"ip"] : @"0.0.0.0");
}