獲取系統權限
1、相機
2、相冊
3、位置
4、麥克風
5、通知狀態
iOS工具類:PermissionsManager.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <React/RCTBridgeModule.h>
@interface PermissionsManager : NSObject<RCTBridgeModule>
@end
iOS工具類:PermissionsManager.m
//
// PermissionsManager.m
// Driver
//
// Created by Mac on 2017/8/1.
// Copyright ? 2017年 Facebook. All rights reserved.
//
#import "PermissionsManager.h"
#import <AVFoundation/AVFoundation.h>
#import <AssetsLibrary/AssetsLibrary.h>
#import <CoreLocation/CoreLocation.h>
//iOS調用RN
#import <React/RCTEventDispatcher.h>
@implementation PermissionsManager
@synthesize bridge = _bridge;
//導出模塊
RCT_EXPORT_MODULE(); //此處不添加參數即默認為這個OC類的名字
//Promises
//最后兩個參數是RCTPromiseResolveBlock(成功block)和RCTPromiseRejectBlock(失敗block)
/*
//正確回調,傳遞參數
typedef void (^RCTPromiseResolveBlock)(id result);
*/
/*
//錯誤回調,傳三個參數
typedef void (^RCTPromiseRejectBlock)(NSString *code, NSString *message, NSError *error);
*/
/**
相機權限
*/
RCT_EXPORT_METHOD(cameraPermission:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (authStatus == AVAuthorizationStatusRestricted || authStatus ==AVAuthorizationStatusDenied)
{
//無權限
reject(@"500",@"沒有訪問相機權限,請前往 ‘設置’-‘隱私’-‘相機’ 開啟權限",nil);
}else {
// 有權限
resolve(@YES);
}
}
/**
相冊權限
*/
RCT_EXPORT_METHOD(photoPermission:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
ALAuthorizationStatus author = [ALAssetsLibrary authorizationStatus];
if (author == ALAuthorizationStatusRestricted || author ==ALAuthorizationStatusDenied)
{
//無權限
reject(@"500",@"沒有訪問相冊權限,請前往 ‘設置’-‘隱私’-‘相冊’ 開啟權限",nil);
}else {
// 有權限
resolve(@YES);
}
}
/**
定位權限
*/
RCT_EXPORT_METHOD(locationPermission:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
if([CLLocationManager locationServicesEnabled] && [CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) {
//無權限
reject(@"500",@"沒有訪問位置權限,請前往 ‘設置’-‘隱私’-‘位置’ 開啟權限",nil);
}else {
// 有權限
resolve(@YES);
}
}
/**
麥克風權限
*/
RCT_EXPORT_METHOD(microphonePermission:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
AVAudioSession *avSession = [AVAudioSession sharedInstance];
if ([avSession respondsToSelector:@selector(requestRecordPermission:)]) {
[avSession requestRecordPermission:^(BOOL available) {
if (available) {
resolve(@YES);
}else {
reject(@"500",@"沒有訪問麥克風權限,請前往 ‘設置’-‘隱私’-‘麥克風’ 開啟權限",nil);
}
}];
}
}
/**
通知狀態
*/
#define IOS8 ([[[UIDevice currentDevice] systemVersion] doubleValue] >=8.0 ? YES : NO)
RCT_EXPORT_METHOD(notificationStatus:(RCTResponseSenderBlock)callback){
if (IOS8) { //iOS8以上包含iOS8
if ([[UIApplication sharedApplication] currentUserNotificationSettings].types == UIUserNotificationTypeNone) {
callback(@[@NO]);
}else{
callback(@[@YES]);
}
}else{ // ios7 以下
if ([[UIApplication sharedApplication] enabledRemoteNotificationTypes] == UIRemoteNotificationTypeNone) {
callback(@[@NO]);
}else{
callback(@[@YES]);
}
}
}
@end
ReactNative:工具類 permissionsManager.js
/**
* Created by mymac on 2017/7/19.
*/
import React, { Component } from 'react';
import {
View,
NativeModules,
NativeAppEventEmitter,//導入
} from 'react-native';
//在JavaScript中調用Object-C定義的方法,需要先導入NativeModules
//此處的RNCalliOSAction就是我們在iOS上新建的類名
//如果在iOS中設置了導出了類的名字,此處需要和導出的名字一致
const manager = NativeModules.PermissionsManager;
/*相機權限*/
const cameraPermission = () => {
return new Promise((resolve, reject) => {
manager.cameraPermission().then(data => {
resolve(data);
}).catch(err => {
reject(err);
});
});
};
/*相機權限*/
const photoPermission = () => {
return new Promise((resolve, reject) => {
manager.photoPermission().then(data => {
resolve(data);
}).catch(err => {
reject(err);
});
});
};
/*位置權限*/
const locationPermission = () => {
return new Promise((resolve, reject) => {
manager.locationPermission().then(data => {
resolve(data);
}).catch(err => {
reject(err);
});
});
};
/*麥克風權限*/
const microphonePermission = () => {
return new Promise((resolve, reject) => {
manager.microphonePermission().then(data => {
resolve(data);
}).catch(err => {
reject(err);
});
});
};
/*通知狀態*/
const notificationStatus = () => {
return new Promise((resolve) => {
manager.notificationStatus((status)=>{
resolve(status);
});
});
};
export default {
cameraPermission,
photoPermission,
locationPermission,
microphonePermission,
notificationStatus
};
使用
import PermissionsManager from '../../utils/permissionManager';
PermissionsManager.cameraPermission().then(data=>{
this.selectCamera();
}).catch(err=>{
Toast.showShortCenter(err.message);
});