ios进阶酷iOS开发实用技巧iOS开发

iOS 获取设备的一些信息

2018-02-02  本文已影响81人  大雄記

由于各个前端系统的权限设置,很多设备信息都不能得到有效的获取;所以,公司后台同学经常询问前端同学,你们都能获取到一些什么字段?发现自己也很长一段时间没有记录技术上的知识点了,借此时机,将能获取设备的信息来统一记录。

对于收集设备信息来说分成两大块,第一当然是设备的一些私有和唯一的信息,第二就是App的信息,我们先从简单的App的信息来说。

第一部分:App的信息

关于App的信息,我们大概就需要获取App的版本号、App的build版本号、包名、App显示名称等等。

//DeviceUtils.h中定义
#pragma mark - About App Config Info Method
/**
 *  获取当前App的版本号信息
 */
+ (NSString *)getAppVersion;

/**
 *  获取当前App的build版本号信息
 */
+ (NSString *)getAppBuildVersion;

/**
 *  获取当前App的包名信息
 */
+ (NSString *)getAppBundleId;

/**
 *  获取当前App的名称信息
 */
+ (NSString *)getAppDisplayName;
//DeviceUtils.m中实现
#pragma mark - About App Config Info Method
/*获取当前App的版本号信息*/
+ (NSString *)getAppVersion
{
    NSBundle *currentBundle = [NSBundle mainBundle];
    NSDictionary *infoDictionary = [currentBundle infoDictionary];
    return [infoDictionary objectForKey:@"CFBundleShortVersionString"];
}

/*获取当前App的build版本号信息*/
+ (NSString *)getAppBuildVersion
{
    NSBundle *currentBundle = [NSBundle mainBundle];
    NSDictionary *infoDictionary = [currentBundle infoDictionary];
    return [infoDictionary objectForKey:@"CFBundleVersion"];
}

/*获取当前App的包名信息*/
+ (NSString *)getAppBundleId
{
    NSBundle *currentBundle = [NSBundle mainBundle];
    NSDictionary *infoDictionary = [currentBundle infoDictionary];
    return [infoDictionary objectForKey:@"CFBundleIdentifier"];
}

/*获取当前App的名称信息*/
+ (NSString *)getAppDisplayName
{
    NSBundle *currentBundle = [NSBundle mainBundle];
    NSDictionary *infoDictionary = [currentBundle infoDictionary];
    return [infoDictionary objectForKey:@"CFBundleDisplayName"];
}

第二部分:设备的一些私有和唯一的信息

关于获取设备各种标识符,大概统计了一下。基本上有IDFA、IDFV、IMEI、IMSI、UUID、UDID、MAC地址等等。但随着对用户隐私信息的保护,苹果系统对信息的获取进行权限设置,譬如IMEI、IMSI等的获取都明确禁止了,除非你发布的App不通过苹果商店的渠道。不管获取权限,先来介绍下这些字段的含义。

1、IMEI、IMSI、UUID、UDID、MAC地址
2、IDFA、IDFV

关闭IDFA获取权限操作:设置 → 隐私 → 广告 → 选择禁止获取IDFA值
重新生成IDFA操作:
操作一:设置程序 → 通用 → 还原 → 还原位置与隐私
操作二:设置程序 → 通用 → 关于本机 → 广告 → 还原广告标示符

//导入获取IDFA的头文件
#import <AdSupport/ASIdentifierManager.h>

- (NSString *)getDeviceIDFAValue
{
    ASIdentifierManager *object = nil;
    object = [ASIdentifierManager sharedManager];
    return [[object advertisingIdentifier] UUIDString];
}

关于IDFA的一张很好的图解:

编号 包名 IDFV
1 com.test.app1 与2相同,与3、4不同
2 com.test.app2 与1相同,与3、4不同
3 com.test.develop.app1 与4相同,与1、2不同
4 com.test.develop.app2 与3相同,与1、2不同

准确点说,就是通过BundleID的反转的前两部分进行匹配,如果相同就是同一个Vender,共享同一个IDFV的值。

NSString *idfv = [[UIDevice currentDevice].identifierForVendor UUIDString];
3、设备运营商名称、运营商网络
4、设备型号、设备的系统名称、设备的系统版本号
5、设备的尺寸、设备的分辨率

下面直接上代码:

//DeviceUtils.h中定义
#pragma mark - About Device Config Info Method
/**
 *  获取当前设备的IMSI值
 */
+ (NSString *)getDeviceIMSIValue;

/**
 *  获取当前设备的IMEI值
 */
+ (NSString *)getDeviceIMEIValue;

/**
 *  获取当前设备的MacId值
 */
+ (NSString *)getDeviceMacIdValue;

/**
 *  获取当前设备的通讯运营商名称
 */
+ (NSString *)getDeviceCarrierName;

/**
 *  获取当前设备的网络通讯名称值
 */
+ (NSString *)getDeviceNetworkName;

/**
 *  获取当前设备的横向最大值
 */
+ (NSNumber *)getDeviceXMaxValue;

/**
 *  获取当前设备的纵向最大值
 */
+ (NSNumber *)getDeviceYMaxValue;

/**
 *  获取当前设备的横向分辨率值
 */
+ (NSNumber *)getDeviceXResolution;

/**
 *  获取当前设备的纵向分辨率值
 */
+ (NSNumber *)getDeviceYResolution;

/**
 *  获取当前设备的型号名称
 */
+ (NSString *)getDeviceModel;

/**
 *  获取当前设备的操作系统名称
 */
+ (NSString *)getDeviceOSName;

/**
 *  获取当前设备的操作系统版本号
 */
+ (NSString *)getDeviceOSVersion;

/**
 *  获取当前设备的唯一编号
 */
+ (NSString *)getDeviceTerminalId;
//DeviceUtils.m中实现
#pragma mark - About Device Config Info Method
/*获取当前设备的IMSI值*/
+ (NSString *)getDeviceIMSIValue
{
    return nil;
}

/*获取当前设备的IMEI值*/
+ (NSString *)getDeviceIMEIValue
{
    return nil;
}

/*获取当前设备的MacId值*/
+ (NSString *)getDeviceMacIdValue
{
    return nil;
}

/*获取当前设备的通讯运营商名称*/
+ (NSString *)getDeviceCarrierName
{
    CTTelephonyNetworkInfo *info = [CTTelephonyNetworkInfo new];
    CTCarrier *carrier = [info subscriberCellularProvider];
    return [carrier carrierName];
}

/*获取当前设备的网络通讯名称值*/
+ (NSString *)getDeviceNetworkName
{
    /*
        CTRadioAccessTechnologyGPRS             //介于2G和3G之间(2.5G)
        CTRadioAccessTechnologyEdge             //GPRS到第三代移动通信的过渡(2.75G)
        CTRadioAccessTechnologyWCDMA
        CTRadioAccessTechnologyHSDPA            //亦称为3.5G(3?G)
        CTRadioAccessTechnologyHSUPA            //3G到4G的过度技术
        CTRadioAccessTechnologyCDMA1x           //3G
        CTRadioAccessTechnologyCDMAEVDORev0     //3G标准
        CTRadioAccessTechnologyCDMAEVDORevA
        CTRadioAccessTechnologyCDMAEVDORevB
        CTRadioAccessTechnologyeHRPD            //电信一种3G到4G的演进技术(3.75G)
        CTRadioAccessTechnologyLTE              //接近4G
     */
    CTTelephonyNetworkInfo *info = [CTTelephonyNetworkInfo new];
    return [info currentRadioAccessTechnology];
}

/*获取当前设备的横向最大值*/
+ (NSNumber *)getDeviceXMaxValue
{
    CGFloat xoffset = CGRectZero.origin.x;
    xoffset = CGRectGetWidth([[UIScreen mainScreen] bounds]);
    return [NSNumber numberWithFloat:xoffset];
}

/*获取当前设备的纵向最大值*/
+ (NSNumber *)getDeviceYMaxValue
{
    CGFloat yoffset = CGRectZero.origin.x;
    yoffset = CGRectGetHeight([[UIScreen mainScreen] bounds]);
    return [NSNumber numberWithFloat:yoffset];
}

/*获取当前设备的横向分辨率值*/
+ (NSNumber *)getDeviceXResolution
{
    CGFloat width = CGRectZero.size.width;
    CGFloat scale = [[UIScreen mainScreen] scale];
    width = [[[self class] getDeviceXMaxValue] floatValue];
    return [NSNumber numberWithFloat:(width * scale)];
}

/*获取当前设备的纵向分辨率值*/
+ (NSNumber *)getDeviceYResolution
{
    CGFloat height = CGRectZero.size.height;
    CGFloat scale = [[UIScreen mainScreen] scale];
    height = [[[self class] getDeviceYMaxValue] floatValue];
    return [NSNumber numberWithFloat:(height * scale)];
}

/*获取当前设备的型号名称*/
+ (NSString *)getDeviceModel
{
    NSString *platform = nil;
    struct utsname systemInfo;
    uname(&systemInfo);
    platform = [NSString stringWithCString:systemInfo.machine
                                  encoding:NSUTF8StringEncoding];
    return [NSString stringWithFormat:@"%@",platform];
}

/*获取当前设备的操作系统名称*/
+ (NSString *)getDeviceOSName
{
    return @"ios";
}

/*获取当前设备的操作系统版本号*/
+ (NSString *)getDeviceOSVersion
{
    return [[UIDevice currentDevice] systemVersion];
}

/*获取当前设备的唯一编号*/
+ (NSString *)getDeviceTerminalId
{
    UIDevice *device = [UIDevice currentDevice];
    NSString *package = [[self class] getAppBundleId];
    NSString *vendor = [[device identifierForVendor] UUIDString];
    return [NSString stringWithFormat:@"%@%@",package,vendor];
}
上一篇下一篇

猜你喜欢

热点阅读