iOS-获取手机信息等常见功能整理一

2019-06-28  本文已影响0人  见哥哥长高了

开发的过程当中,有些时候会用到手机系统或者App本身的一些信息。例如:手机型号、手机系统版本等。下面是常用的获取方法:

获取手机型号
+ (NSString *)iphoneType{
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    //iPhone
    if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone 1G";
     ...
     //其他对应关系请看下面对应表    
    return platform;
}

iPhone设备类型与通用手机类型一一对应关系表
设备类型 通用类型
iPhone1,1 iPhone 1G
iPhone1,2 iPhone 3G
iPhone2,1 iPhone 3GS
iPhone3,1 iPhone 4
iPhone3,2 iPhone 4
iPhone4,1 iPhone 4S
iPhone5,1 iPhone 5
iPhone5,2 iPhone 5
iPhone5,3 iPhone 5C
iPhone5,4 iPhone 5C
iPhone6,1 iPhone 5S
iPhone6,2 iPhone 5S
iPhone7,1 iPhone 6 Plus
iPhone7,2 iPhone 6
iPhone8,1 iPhone 6S
iPhone8,2 iPhone 6S Plus
iPhone8,4 iPhone SE
iPhone9,1 iPhone 7
iPhone9,3 iPhone 7
iPhone9,2 iPhone 7 Plus
iPhone9,4 iPhone 7 Plus
iPhone10,1 iPhone 8
iPhone10.4 iPhone 8
iPhone10,2 iPhone 8 Plus
iPhone10,5 iPhone 8 Plus
iPhone10,3 iPhone X
iPhone10,6 iPhone X
iPhone11,8 iPhone XR
iPhone11,2 iPhone XS
iPhone11,4 iPhone XS Max
Phone11,6 iPhone XS Max

获取手机系统版本
NSString *phoneVersion = [[UIDevice currentDevice] systemVersion];
获取App BundleId
NSString *bundleId = [[NSBundle mainBundle] bundleIdentifier];
获取App 版本号
NSString *bundleVersionCode = [[[NSBundle mainBundle]infoDictionary] objectForKey:@"CFBundleVersion"];
权限信息查看

应用程序在iOS系统下,如果想要获取隐私权限的话,需要征得用户的同意。最常见的就是给出权限提醒,用户给出权限,应用即可使用,但是如果用户拒绝,则相应的功能就受限了。但是有的时候我们要用到一个功能的时候,需要首先判断用户是否同意了程序使用相关权限。系统的权限种类有很多。例如:网络权限,相机权限,麦克风权限,相册权限,地理位置,日历,联系人,蓝牙等。下面举几个常见的判断手机权限的例子:

/*
 *相册权限
 */
- (void)permissionTypePhotoAction{
    PHAuthorizationStatus photoStatus = [PHPhotoLibrary authorizationStatus];
    __block LGJPermissionManager *weakSelf = self;
    if (photoStatus == PHAuthorizationStatusNotDetermined) {
        
        [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
            if (status == PHAuthorizationStatusAuthorized) {
                weakSelf.block(YES, @(photoStatus));
            } else {
                weakSelf.block(NO, @(photoStatus));
            }
        }];
    } else if (photoStatus == PHAuthorizationStatusAuthorized) {
        self.block(YES, @(photoStatus));
    } else if(photoStatus == PHAuthorizationStatusRestricted||photoStatus == PHAuthorizationStatusDenied){
        self.block(NO, @(photoStatus));
        [self pushSetting:@"相册权限"];
        
    }else{
        self.block(NO, @(photoStatus));
    }
}


/*
 *相机权限
 */
- (void)permissionTypeCameraAction{
    AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
    __block LGJPermissionManager *weakSelf = self;
    if(authStatus == AVAuthorizationStatusNotDetermined){
        [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
            weakSelf.block(granted, @(authStatus));
        }];
    }  else if (authStatus == AVAuthorizationStatusAuthorized) {
        self.block(YES, @(authStatus));
    } else if(authStatus == AVAuthorizationStatusRestricted||authStatus == AVAuthorizationStatusDenied){
        self.block(NO, @(authStatus));
        [self pushSetting:@"相机权限"];
        
    }else{
        self.block(NO, @(authStatus));
    }
}

/*
 *麦克风权限
 */
- (void)permissionTypeMicAction{
    AVAudioSessionRecordPermission micPermisson = [[AVAudioSession sharedInstance] recordPermission];
    __block LGJPermissionManager *weakSelf = self;
    if (micPermisson == AVAudioSessionRecordPermissionUndetermined) {
        [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
            weakSelf.block(granted, @(micPermisson));
        }];
    } else if (micPermisson == AVAudioSessionRecordPermissionGranted) {
        self.block(YES, @(micPermisson));
    } else {
        self.block(NO, @(micPermisson));
        [self pushSetting:@"麦克风权限"];
    }
}


/*
 *获取地理位置When
 */
- (void)permissionTypeLocationWhenAction{
    
    if ([CLLocationManager locationServicesEnabled] && ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedAlways)) {
        NSLog(@"能进行定位...");
        if (self.block) {
            self.block(YES, nil);
        }
    }else if ([CLLocationManager authorizationStatus] ==kCLAuthorizationStatusDenied) {
        NSLog(@"不能进行定位...");
        if (self.block) {
            self.block(NO, nil);
        }
        if (self.isShow == YES) {
            [self remindUserToGiveAutAuthorityOfLocation];
        }
    }
    
//    CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
//    if (status == kCLAuthorizationStatusNotDetermined) {
//
//    } else if (status == kCLAuthorizationStatusAuthorizedWhenInUse){
//        self.block (YES, @(status));
//    } else {
//        self.block(NO, @(status));
//        [self pushSetting:@"使用期间访问地理位置权限"];
//    }
}



/*
 *日历
 */
- (void)permissionTypeCalendarAction{
    EKEntityType type  = EKEntityTypeEvent;
    __block LGJPermissionManager *weakSelf = self;
    EKAuthorizationStatus status = [EKEventStore authorizationStatusForEntityType:type];
    if (status == EKAuthorizationStatusNotDetermined) {
        EKEventStore *eventStore = [[EKEventStore alloc] init];
        [eventStore requestAccessToEntityType:type completion:^(BOOL granted, NSError * _Nullable error) {
            weakSelf.block(granted,@(status));
        }];
    } else if (status == EKAuthorizationStatusAuthorized) {
        self.block(YES,@(status));
    } else {
        [self pushSetting:@"日历权限"];
        self.block(NO,@(status));
    }
}

/*
 *联系人
 */
- (void)permissionTypeContactsAction{
    CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
    __block LGJPermissionManager *weakSelf = self;
    if (status == CNAuthorizationStatusNotDetermined) {
        CNContactStore *store = [[CNContactStore alloc] init];
        [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
            if (granted) {
                weakSelf.block(granted,[weakSelf openContact]);
            }
            weakSelf.block(granted,@(status));
        }];
    } else if (status == CNAuthorizationStatusAuthorized) {;
        self.block(YES,[self openContact]);
    } else {
        self.block(NO,@(status));
        [self pushSetting:@"联系人权限"];
    }
}

/*
 * 提醒
 */
- (void)permissionTypeRemainerAction{
    EKEntityType type  = EKEntityTypeReminder;
    __block LGJPermissionManager *weakSelf = self;
    EKAuthorizationStatus status = [EKEventStore authorizationStatusForEntityType:type];
    if (status == EKAuthorizationStatusNotDetermined) {
        EKEventStore *eventStore = [[EKEventStore alloc] init];
        [eventStore requestAccessToEntityType:type completion:^(BOOL granted, NSError * _Nullable error) {
            weakSelf.block(granted,@(status));
        }];
    } else if (status == EKAuthorizationStatusAuthorized) {
        self.block(YES,@(status));
    } else {
        [self pushSetting:@"日历权限"];
        self.block(NO,@(status));
    }
}

/*
 * 健康
 */
- (void)permissionTypeHealthAction{
    //查看healthKit在设备上是否可用,ipad不支持HealthKit
    if (![HKHealthStore isHealthDataAvailable]) {
        NSLog(@"设备不支持healthKit");
        self.block(NO, nil);
        return;
    }

    if (!self.healthStore) {
        self.healthStore = [HKHealthStore new];
    }


    HKQuantityType *stepType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
    __block LGJPermissionManager *weakSelf = self;
    NSSet *readDataTypes =  [NSSet setWithObjects:stepType, nil];
    [self.healthStore requestAuthorizationToShareTypes:nil readTypes:readDataTypes completion:^(BOOL success, NSError * _Nullable error) {

        if (success) {
            [weakSelf readStepCount];
        }else{
            weakSelf.block(NO, nil);
        }
    }];
}

/*
 * 多媒体
 */
- (void)permissionTypeMediaLibraryAction{
    __block LGJPermissionManager *weakSelf = self;
    [MPMediaLibrary requestAuthorization:^(MPMediaLibraryAuthorizationStatus status){
        switch (status) {
            case MPMediaLibraryAuthorizationStatusNotDetermined: {
                weakSelf.block(NO, @(status));
                break;
            }
            case MPMediaLibraryAuthorizationStatusRestricted: {
                weakSelf.block(NO, @(status));
                break;
            }
            case MPMediaLibraryAuthorizationStatusDenied: {
                weakSelf.block(NO, @(status));
                break;
            }
            case MPMediaLibraryAuthorizationStatusAuthorized: {
                // authorized
                weakSelf.block(YES, @(status));
                break;
            }
            default: {
                break;
            }
        }

    }];
}

/*
 * 查询步数数据
 */
- (void)readStepCount
{
    HKQuantityType *stepType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
    NSSortDescriptor *timeSortDescriptor = [[NSSortDescriptor alloc] initWithKey:HKSampleSortIdentifierEndDate ascending:NO];

    __block LGJPermissionManager *weakSelf = self;
    HKSampleQuery *query = [[HKSampleQuery alloc] initWithSampleType:stepType predicate:[LGJPermissionManager predicateForSamplesToday] limit:HKObjectQueryNoLimit sortDescriptors:@[timeSortDescriptor] resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error) {
        if(error)
        {

            weakSelf.block(NO, error);
        }
        else
        {
            NSInteger totleSteps = 0;
            for(HKQuantitySample *quantitySample in results)
            {
                HKQuantity *quantity = quantitySample.quantity;
                HKUnit *heightUnit = [HKUnit countUnit];
                double usersHeight = [quantity doubleValueForUnit:heightUnit];
                totleSteps += usersHeight;
            }
            NSLog(@"当天行走步数 = %ld",(long)totleSteps);
            weakSelf.block(YES,@(totleSteps));
        }
    }];

    [self.healthStore executeQuery:query];


}

/*!
 *  @brief  当天时间段(可以获取某一段时间)
 *
 *  @return 时间段
 */
+ (NSPredicate *)predicateForSamplesToday {
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDate *now = [NSDate date];
    NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:now];
    [components setHour:0];
    [components setMinute:0];
    [components setSecond: 0];

    NSDate *startDate = [calendar dateFromComponents:components];
    NSDate *endDate = [calendar dateByAddingUnit:NSCalendarUnitDay value:1 toDate:startDate options:0];
    NSPredicate *predicate = [HKQuery predicateForSamplesWithStartDate:startDate endDate:endDate options:HKQueryOptionNone];
    return predicate;
}


//有通讯录权限-- 获取通讯录
- (NSArray*)openContact{
    // 获取指定的字段
    NSArray *keysToFetch = @[CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey];
    CNContactFetchRequest *fetchRequest = [[CNContactFetchRequest alloc] initWithKeysToFetch:keysToFetch];
    CNContactStore *contactStore = [[CNContactStore alloc] init];
    NSMutableArray *arr = [NSMutableArray new];
    [contactStore enumerateContactsWithFetchRequest:fetchRequest error:nil usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
        //拼接姓名
        NSString *nameStr = [NSString stringWithFormat:@"%@%@",contact.familyName,contact.givenName];

        NSArray *phoneNumbers = contact.phoneNumbers;

        for (CNLabeledValue *labelValue in phoneNumbers) {
            CNPhoneNumber *phoneNumber = labelValue.value;
            NSString * string = phoneNumber.stringValue ;
            //去掉电话中的特殊字符
            string = [string stringByReplacingOccurrencesOfString:@"+86" withString:@""];
            string = [string stringByReplacingOccurrencesOfString:@"-" withString:@""];
            string = [string stringByReplacingOccurrencesOfString:@"(" withString:@""];
            string = [string stringByReplacingOccurrencesOfString:@")" withString:@""];
            string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];
            string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];
            NSLog(@"姓名=%@, 电话号码是=%@", nameStr, string);
            [arr addObject:@{@"name":nameStr,@"phone":string}];
        }
    }];
    return [NSArray arrayWithArray:arr];

}


#pragma mark - CLLocationManagerDelegate

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    self.block(YES, error);
}


- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations{
        self.block(YES, locations.firstObject);
        [self stopLocationService];
}


- (void)stopLocationService
{
    [self.locationManager stopUpdatingLocation];
    self.locationManager.delegate=nil;
    self.locationManager = nil;
}

#pragma mark - CBCentralManagerDelegate
-(void)centralManagerDidUpdateState:(CBCentralManager *)central
{
    //蓝牙第一次以及之后每次蓝牙状态改变都会调用这个函数
    if(central.state==CBManagerStatePoweredOn)
    {
        NSLog(@"蓝牙设备开着");
        self.block(YES, nil);
    }
    else
    {
        NSLog(@"蓝牙设备关着");
        self.block(NO, nil);
    }
}


/*
 *跳转设置
 */
- (void)pushSetting:(NSString*)urlStr{
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:[NSString stringWithFormat:@"%@%@",urlStr,self.tip] preferredStyle:UIAlertControllerStyleAlert];
    
    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
    [alert addAction:cancelAction];
    
    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        NSURL *url= [NSURL URLWithString:UIApplicationOpenSettingsURLString];
        if (IOS_10_OR_LATER) {
            if( [[UIApplication sharedApplication]canOpenURL:url] ) {
                [[UIApplication sharedApplication]openURL:url options:@{}completionHandler:^(BOOL        success) {
                }];
            }
        }else{
            if( [[UIApplication sharedApplication]canOpenURL:url] ) {
                [[UIApplication sharedApplication]openURL:url options:@{} completionHandler:nil];
            }
        }
    }];
    [alert addAction:okAction];
    [[LGJPermissionManager getCurrentVC] presentViewController:alert animated:YES completion:nil];
}

//获取当前VC
+ (UIViewController *)getCurrentVC
{
    UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
    
    UIViewController *currentVC = [self getCurrentVCFrom:rootViewController];
    
    return currentVC;
}

+ (UIViewController *)getCurrentVCFrom:(UIViewController *)rootVC
{
    UIViewController *currentVC;
    
    if ([rootVC presentedViewController]) {
        // 视图是被presented出来的
        rootVC = [rootVC presentedViewController];
    }
    
    if ([rootVC isKindOfClass:[UITabBarController class]]) {
        // 根视图为UITabBarController
        currentVC = [self getCurrentVCFrom:[(UITabBarController *)rootVC selectedViewController]];
        
    } else if ([rootVC isKindOfClass:[UINavigationController class]]){
        // 根视图为UINavigationController
        currentVC = [self getCurrentVCFrom:[(UINavigationController *)rootVC visibleViewController]];
        
    } else {
        // 根视图为非导航类
        currentVC = rootVC;
    }
    return currentVC;
}

- (NSString *)tip{
    if (!_tip) {
        _tip = @"尚未开启,是否前往设置";
    }
    return _tip;
}

分享功能

利用UIActivityViewController类可以轻松实现分享功能


系统文件分享

以下是实现代码:

- (IBAction)click:(UIButton *)sender {
    
    NSURL *url = [NSURL fileURLWithPath:@"/Users/adiqueen/Desktop/LGJDemo/LGJDemo/[Android开发从入门到精通].扶松柏.扫描版.pdf"];
    NSArray *objectsToShare = @[url];
    
    UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:objectsToShare applicationActivities:nil];
    NSArray *excludedActivities = @[UIActivityTypePostToTwitter, UIActivityTypePostToFacebook,
                                    UIActivityTypePostToWeibo,
                                    UIActivityTypeMessage, UIActivityTypeMail,
                                    UIActivityTypePrint, UIActivityTypeCopyToPasteboard,
                                    UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll,
                                    UIActivityTypeAddToReadingList, UIActivityTypePostToFlickr,
                                    UIActivityTypePostToVimeo, UIActivityTypePostToTencentWeibo];
    controller.excludedActivityTypes = excludedActivities;
    
    [self presentViewController:controller animated:YES completion:nil];
    
}
上一篇下一篇

猜你喜欢

热点阅读