ios獲取設(shè)備信息

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");
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、獲取設(shè)備的信息 2、獲取設(shè)備的唯一標(biāo)示符 3、為系統(tǒng)創(chuàng)建一個(gè)隨機(jī)的標(biāo)示符 5、獲取運(yùn)營商的信息 首先需要導(dǎo)入系...
    Young_Blood閱讀 2,416評論 8 4
  • iOS獲取設(shè)備信息 在iOS開發(fā)過程中,有時(shí)我們想獲取到設(shè)備的系統(tǒng)信息,這時(shí)就需要使用到UIDevice類,具體常...
    蚊香醬閱讀 1,757評論 4 10
  • 這里只介紹一些獲取設(shè)備的一些基本信息,像IMEI、MAC地址等一些被蘋果禁掉獲取的信息就不作介紹了。雖然這些可以通...
    ZJ_偶爾上路閱讀 925評論 0 1
  • 轉(zhuǎn)自si1ence 工作中遇到了統(tǒng)計(jì)用戶信息、下發(fā)廣告,服務(wù)器端的需求往往需要手機(jī)用戶設(shè)備及app的各種信息。 D...
    linbj閱讀 403評論 0 5
  • 這個(gè)世界上,那么多人,有多少人與我有關(guān)?有多少人是我在乎且在乎我的人? 這幾天似乎很忙,不看簡書不寫文,不看微信不...
    潘小丫閱讀 878評論 9 9

友情鏈接更多精彩內(nèi)容