最近项目遇到了如果用户不提供iPhone的相机权限,游戏则无法正常进行的问题。所以为了解决这个问题,自己想出的方法是获取IOS上相机权限的状态,在Unity端通过获取到ios相机权限的状态进行处理,未开启权限给与提示让用户提供权限再进行游戏。
所以为了解决这个问题,自己通过咨询发现需要编写oc代码来获取状态,再从unity中调用OC代码。经过自己的学习,总结出了流程:
1.首先,需要了解Unity端是如何调用oc代码的。我们先编写脚本,用于调用oc代码。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.InteropServices;
public class IOSCameraAuthority : MonoBehaviour {
public static IOSCameraAuthority ins;
public enum CameraStatus
{
UnAuthority=0,
Authority=1,
Denied=2,
None=3,
}
[DllImport("__Internal")]
public static extern int GetAVCapturePermission();
void Awake()
{
ins = this;
}
public CameraStatus GetCameraAuthorityStatus()
{
int status= GetAVCapturePermission();
switch (status)
{
case 0:
return CameraStatus.UnAuthority;
case 1:
return CameraStatus.Authority;
case 2:
return CameraStatus.Denied;
default:
return CameraStatus.None;
}
}
}
最重要的是
[DllImport("__Internal")]
public static extern int GetAVCapturePermission();
这个方法是与ios端交互的关键所在。
2.既然调用的代码写好了,接下来我们需要写oc代码。我们需要的是".h"文件以及".mm"文件。将这两个文件放在Unity项目的Plugins文件夹的iOS文件夹下,一定不要放错位置。
接下来晒出头文件的代码
JCamera.h
#import<Foundation/Foundation.h>
@interface JCamera:NSObject
@end
最重要的OC代码:
JCamera.mm
#import "JCamera.h"
#import <AVFoundation/AVFoundation.h>
#import <AVFoundation/AVCaptureDevice.h>
@implementation JCamera
extern "C" int GetAVCapturePermission()
{
NSString* mediaType = AVMediaTypeVideo;
NSInteger status = AVAuthorizationStatusAuthorized;
status = [AVCaptureDevice authorizationStatusForMediaType: mediaType];
if (status == AVAuthorizationStatusNotDetermined)
{
status=0;
return 0;
}
else if (status == AVAuthorizationStatusAuthorized)
{
status=1;
return 1;
}
else if(status==AVAuthorizationStatusDenied)
{
status=2;
return 2;
}else
{
status=0;
return 0;
}
//UnitySendMessage("PublicGameObject","GetAVCapturePermission",status)
}
@end
注意OC代码的这个方法一定要与前面Unity脚本中的DllImport那个方法名字一样。这样就能获取到相机授权状态是未授权,还是授权过了,还是拒绝授权了。