Writing in the front

The problem of system permissions cannot be avoided in APP development. How to show system permissions to users in a more friendly way seems to be a matter worth thinking about in the development process.

So how to improve the approval rate of APP obtaining iOS system permissions? There are several ways:

1. Request permission to the user when the user opens the APP;

2. Inform the user of the permission to obtain benefits, and then request permission from the user.

3. Request permission only when it is absolutely necessary. For example, when a user accesses the photo library, request permission to access the system album.

4. Before the system permission dialog box is displayed, a customized dialog box is displayed for the user. If the user disallows the dialog box, no operation is performed by default.

The above situation is often encountered in the development process, and the choice of different methods can affect the final user interaction experience. This insight comes from the problem I encountered last week: adapting to iOS10, how to obtain application networking permission to manage the display management of system dialog box. When I solved this problem, I felt it was necessary to make a summary of the commonly used iOS system permissions for later use.

Classification of permissions

Connected to the Internet access

Photo album permissions

Camera and microphone permissions

Location permissions

Push permissions

Address book rights

Calendar and memo permissions

Connected to the Internet access

Import header @import CoreTelephony;

After the application is started, check whether the application has Internet access permission

CTCellularData *cellularData = [[CTCellularData alloc]init]; CellularData. CellularDataRestrictionDidUpdateNotifier = ^ (CTCellularDataRestrictedState state) {/ / access network state switch (state) { case kCTCellularDataRestricted: NSLog(@"Restricrted"); break; case kCTCellularDataNotRestricted: NSLog(@"Not Restricted"); break; case kCTCellularDataRestrictedStateUnknown: NSLog(@"Unknown"); break; default: break; }; };Copy the code

Example Query whether the application has the networking function

CTCellularData *cellularData = [[CTCellularData alloc]init];
CTCellularDataRestrictedState state = cellularData.restrictedState;
 switch (state) {
  case kCTCellularDataRestricted:
      NSLog(@"Restricrted");
      break;
  case kCTCellularDataNotRestricted:
      NSLog(@"Not Restricted");
      break;
  case kCTCellularDataRestrictedStateUnknown:
      NSLog(@"Unknown");
      break;
  default:
      break;
}
Copy the code

Album permissions – before iOS 9.0

Import header @import AssetsLibrary;

Check whether you have album permission

 ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];
switch (status) {
  case ALAuthorizationStatusAuthorized:
      NSLog(@"Authorized");
      break;
  case ALAuthorizationStatusDenied:
      NSLog(@"Denied");
      break;
  case ALAuthorizationStatusNotDetermined:
      NSLog(@"not Determined");
      break;
  case ALAuthorizationStatusRestricted:
      NSLog(@"Restricted");
      break;

  default:
      break;
}
Copy the code

Album permissions – After iOS 8.0

Import header @import Photos;

Check whether you have album permission

PHAuthorizationStatus photoAuthorStatus = [PHPhotoLibrary authorizationStatus];
switch (photoAuthorStatus) {
  case PHAuthorizationStatusAuthorized:
      NSLog(@"Authorized");
      break;
  case PHAuthorizationStatusDenied:
      NSLog(@"Denied");
      break;
  case PHAuthorizationStatusNotDetermined:
      NSLog(@"not Determined");
      break;
  case PHAuthorizationStatusRestricted:
      NSLog(@"Restricted");
      break;
  default:
      break;
}
Copy the code

Obtain user permissions:

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
 if (status == PHAuthorizationStatusAuthorized) {
     NSLog(@"Authorized");
 }else{
     NSLog(@"Denied or Restricted");
 }
 }];
Copy the code

Camera and microphone permissions

Import header @import AVFoundation;

Check whether you have camera or microphone permission

AVAuthorizationStatus AVstatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; / / camera permissions AVAuthorizationStatus AVstatus = [AVCaptureDevice authorizationStatusForMediaType: AVMediaTypeAudio]; / / the microphone access switch (AVstatus) {case AVAuthorizationStatusAuthorized: NSLog (@ "Authorized"); break; case AVAuthorizationStatusDenied: NSLog(@"Denied"); break; case AVAuthorizationStatusNotDetermined: NSLog(@"not Determined"); break; case AVAuthorizationStatusRestricted: NSLog(@"Restricted"); break; default: break; }Copy the code

Obtain the camera or microphone permission

[AVCaptureDevice requestAccessForMediaType: AVMediaTypeVideo completionHandler: ^ (BOOL granted) {/ / camera permission if (granted) { NSLog(@"Authorized"); }else{ NSLog(@"Denied or Restricted"); } }]; [AVCaptureDevice requestAccessForMediaType: AVMediaTypeAudio completionHandler: ^ (BOOL granted) {/ / microphone permissions if (granted) { NSLog(@"Authorized"); }else{ NSLog(@"Denied or Restricted"); } }];Copy the code

Location permissions

Import header @import CoreLocation;

Because the location method has changed since iOS8.0, you need to configure it in info.plist.

Check whether you have the location permission

BOOL isLocation = [CLLocationManager locationServicesEnabled]; if (! isLocation) { NSLog(@"not turn on the location"); } CLAuthorizationStatus CLstatus = [CLLocationManager authorizationStatus]; switch (CLstatus) { case kCLAuthorizationStatusAuthorizedAlways: NSLog(@"Always Authorized"); break; case kCLAuthorizationStatusAuthorizedWhenInUse: NSLog(@"AuthorizedWhenInUse"); break; case kCLAuthorizationStatusDenied: NSLog(@"Denied"); break; case kCLAuthorizationStatusNotDetermined: NSLog(@"not Determined"); break; case kCLAuthorizationStatusRestricted: NSLog(@"Restricted"); break; default: break; }Copy the code

Obtaining location Rights

CLLocationManager *manager = [[CLLocationManager alloc] init]; [manager requestAlwaysAuthorization]; / / has been positioning information [manager requestWhenInUseAuthorization]; // Get location information when usingCopy the code

Check to see if permissions have changed in the agent method

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{ switch (status) { case kCLAuthorizationStatusAuthorizedAlways: NSLog(@"Always Authorized"); break; case kCLAuthorizationStatusAuthorizedWhenInUse: NSLog(@"AuthorizedWhenInUse"); break; case kCLAuthorizationStatusDenied: NSLog(@"Denied"); break; case kCLAuthorizationStatusNotDetermined: NSLog(@"not Determined"); break; case kCLAuthorizationStatusRestricted: NSLog(@"Restricted"); break; default: break; }}Copy the code

Push permissions

Check whether you have communication permission

  UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings];
switch (settings.types) {
  case UIUserNotificationTypeNone:
      NSLog(@"None");
      break;
  case UIUserNotificationTypeAlert:
      NSLog(@"Alert Notification");
      break;
  case UIUserNotificationTypeBadge:
      NSLog(@"Badge Notification");
      break;
  case UIUserNotificationTypeSound:
      NSLog(@"sound Notification'");
      break;

  default:
      break;
}
Copy the code

Obtain push permission

UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:setting];
Copy the code

Address book rights

Import header @import AddressBook;

Check whether you have the address book permission

 ABAuthorizationStatus ABstatus = ABAddressBookGetAuthorizationStatus();
switch (ABstatus) {
  case kABAuthorizationStatusAuthorized:
      NSLog(@"Authorized");
      break;
  case kABAuthorizationStatusDenied:
      NSLog(@"Denied'");
      break;
  case kABAuthorizationStatusNotDetermined:
      NSLog(@"not Determined");
      break;
  case kABAuthorizationStatusRestricted:
      NSLog(@"Restricted");
      break;
  default:
      break;
}
Copy the code

Obtaining Address Book Rights

ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL); ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { if (granted) { NSLog(@"Authorized"); CFRelease(addressBook); }else{ NSLog(@"Denied or Restricted"); }});Copy the code

Calendar and memo permissions

Import header file

Check whether you have calendar or memo permissions

Typedef NS_ENUM(NSUInteger, EKEntityType) {EKEntityTypeEvent,// calendar EKEntityTypeReminder // note}; EKAuthorizationStatus EKstatus = [EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent]; switch (EKstatus) { case EKAuthorizationStatusAuthorized: NSLog(@"Authorized"); break; case EKAuthorizationStatusDenied: NSLog(@"Denied'"); break; case EKAuthorizationStatusNotDetermined: NSLog(@"not Determined"); break; case EKAuthorizationStatusRestricted: NSLog(@"Restricted"); break; default: break; }Copy the code

Obtain the calendar or memo permission

EKEventStore *store = [[EKEventStore alloc]init];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError * _Nullable error) {
  if (granted) {
      NSLog(@"Authorized");
  }else{
      NSLog(@"Denied or Restricted");
  }
}];
Copy the code

The last point

After iOS 8.0, these Settings are integrated and the corresponding permissions can be enabled or disabled. All permissions can be opened using the following methods:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
Copy the code