Unity 安卓/ios权限插件

前面两篇分别解决了Unity中安卓和ios权限的获取、被拒情况下的处理方法,这篇我们把他们整合成一整个插件。
首先是调用方法,安卓和ios不一样,安卓可以拒绝后再由系统发起申请,ios则不行,因此安卓有三种状态,ios只有两种:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PermissionsStateExample : MonoBehaviour
{
    public Button m_AskMicrophonePermissionStateButton;
    public Button m_AskCameraPermissionStateButton;
    public Button m_AskReadPhotoPermissionStateButton;
    public Button m_AskWritePhotoePermissionStateButton;
    public Button m_OpenAppSettingsButton;
    void Start()
    {
        m_AskMicrophonePermissionStateButton.onClick.AddListener(GetMicrophonePermissionState);
        m_AskCameraPermissionStateButton.onClick.AddListener(GetCameraPermissionState);
        m_AskReadPhotoPermissionStateButton.onClick.AddListener(GetReadPhotoPermissionState);
        m_AskWritePhotoePermissionStateButton.onClick.AddListener(GetWritePhotoPermissionState);
        m_OpenAppSettingsButton.onClick.AddListener(OpenAppSettings);
    }

    void Update()
    {

    }

    void GetMicrophonePermissionState()
    {
        PermissionState permissionState = PermissionsState.GetMicrophonePermissionState();

        switch (permissionState)
        {
            case PermissionState.Allow:
                Debug.Log("Microphone 权限允许");
                break;
            case PermissionState.NotAllow:
                Debug.Log("Microphone 权限不允许");
                break;
            case PermissionState.WaitAsk:
                Debug.Log("Microphone 等待询问");
                break;
            default: break;
        }
    }

    void GetCameraPermissionState()
    {
        PermissionState permissionState = PermissionsState.GetCameraPermissionState();

        switch (permissionState)
        {
            case PermissionState.Allow:
                Debug.Log("Camera 权限允许");
                break;
            case PermissionState.NotAllow:
                Debug.Log("Camera 权限不允许");
                break;
            case PermissionState.WaitAsk:
                Debug.Log("Camera 等待询问");
                break;
            default: break;
        }
    }

    void GetWritePhotoPermissionState()
    {
        PermissionState permissionState = PermissionsState.GetWritePhotoPermissionState();

        switch (permissionState)
        {
            case PermissionState.Allow:
                Debug.Log("WritePhoto 权限允许");
                break;
            case PermissionState.NotAllow:
                Debug.Log("WritePhoto 权限不允许");
                break;
            case PermissionState.WaitAsk:
                Debug.Log("WritePhoto 等待询问");
                break;
            default: break;
        }
    }

    void GetReadPhotoPermissionState()
    {
        PermissionState permissionState = PermissionsState.GetReadPhotoPermissionState();

        switch (permissionState)
        {
            case PermissionState.Allow:
                Debug.Log("ReadPhoto 权限允许");
                break;
            case PermissionState.NotAllow:
                Debug.Log("ReadPhoto 权限不允许");
                break;
            case PermissionState.WaitAsk:
                Debug.Log("ReadPhoto 等待询问");
                break;
            default: break;
        }
    }

    void OpenAppSettings()
    {
        PermissionsState.OpenAppSettings();
    }
}

PermissionsState静态类:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 移动端权限状态
/// </summary>
public static class PermissionsState
{
    /// <summary>
    /// 获取麦克风权限状态
    /// ios使用此权限需在info中添加Privacy - Microphone Usage Description描述
    /// andriod使用此权限需在AndroidManifest文件中添加        <uses-permission android:name="android.permission.RECORD_AUDIO" />
    /// </summary>
    /// <returns>权限状态</returns>
    public static PermissionState GetMicrophonePermissionState()
    {
        PermissionState permissionState = PermissionState.NotAllow;
#if UNITY_EDITOR || UNITY_STANDALONE_WIN
        permissionState = PermissionState.UnnecessaryPlatform;
#elif UNITY_IOS || UNITY_IPHONE
        permissionState = UnityGetiOSPermissionsState.GetMicrophonePermissionState()?PermissionState.Allow:PermissionState.NotAllow;
#elif UNITY_ANDROID
        AndroidRuntimePermissions.Permission result = AndroidRuntimePermissions.RequestPermission("android.permission.RECORD_AUDIO");
        switch (result)
        {
            case AndroidRuntimePermissions.Permission.Denied://权限被拒绝且不再询问
                permissionState = PermissionState.NotAllow;
                break;
            case AndroidRuntimePermissions.Permission.Granted://允许
                permissionState = PermissionState.Allow;
                break;
            case AndroidRuntimePermissions.Permission.ShouldAsk://拒绝权限但不拒绝询问
                permissionState = PermissionState.WaitAsk;
                break;
        }
#endif
        return permissionState;
    }

    /// <summary>
    /// 获取相机权限状态
    /// ios使用此权限需在info中添加Privacy - Camera Usage Description描述
    /// andriod使用此权限需在AndroidManifest文件中添加        <uses-permission android:name="android.permission.CAMERA" />
    /// </summary>
    /// <returns>权限状态</returns>
    public static PermissionState GetCameraPermissionState()
    {
        PermissionState permissionState = PermissionState.NotAllow;
#if UNITY_EDITOR || UNITY_STANDALONE_WIN
        permissionState = PermissionState.UnnecessaryPlatform;
#elif UNITY_IOS || UNITY_IPHONE
        permissionState = UnityGetiOSPermissionsState.GetCameraPermissionState()?PermissionState.Allow:PermissionState.NotAllow;
#elif UNITY_ANDROID
        AndroidRuntimePermissions.Permission result = AndroidRuntimePermissions.RequestPermission("android.permission.CAMERA");
        switch (result)
        {
            case AndroidRuntimePermissions.Permission.Denied://权限被拒绝且不再询问
                permissionState = PermissionState.NotAllow;
                break;
            case AndroidRuntimePermissions.Permission.Granted://允许
                permissionState = PermissionState.Allow;
                break;
            case AndroidRuntimePermissions.Permission.ShouldAsk://拒绝权限但不拒绝询问
                permissionState = PermissionState.WaitAsk;
                break;
        }
#endif
        return permissionState;
    }

    /// <summary>
    /// 获取相册写入权限状态
    /// ios使用此权限需在info中添加Privacy - Photo Library Additions Usage Description描述和Privacy - Photo Library Usage Description描述。还需要在TARGETS-UnityFramework-General-Frameworks and Libraries中添加Photos.framework
    /// andriod使用此权限需在Unity-buildsetting-othersetting中的write permission(写入权限)为External(SDCard)
    /// </summary>
    /// <returns>权限状态</returns>
    public static PermissionState GetWritePhotoPermissionState()
    {
        PermissionState permissionState = PermissionState.NotAllow;
#if UNITY_EDITOR || UNITY_STANDALONE_WIN
        permissionState = PermissionState.UnnecessaryPlatform;
#elif UNITY_IOS || UNITY_IPHONE
        permissionState = UnityGetiOSPermissionsState.GetPhotoPermissionState()?PermissionState.Allow:PermissionState.NotAllow;
#elif UNITY_ANDROID
        AndroidRuntimePermissions.Permission result = AndroidRuntimePermissions.RequestPermission("android.permission.WRITE_EXTERNAL_STORAGE");
        switch (result)
        {
            case AndroidRuntimePermissions.Permission.Denied://权限被拒绝且不再询问
                permissionState = PermissionState.NotAllow;
                break;
            case AndroidRuntimePermissions.Permission.Granted://允许
                permissionState = PermissionState.Allow;
                break;
            case AndroidRuntimePermissions.Permission.ShouldAsk://拒绝权限但不拒绝询问
                permissionState = PermissionState.WaitAsk;
                break;
        }
#endif
        return permissionState;
    }

    /// <summary>
    /// 获取相册读取权限状态
    /// ios使用此权限需在info中添加Privacy - Photo Library Additions Usage Description描述和Privacy - Photo Library Usage Description描述。还需要在TARGETS-UnityFramework-General-Frameworks and Libraries中添加Photos.framework
    /// andriod使用此权限需在Unity-buildsetting-othersetting中的write permission(写入权限)为External(SDCard)
    /// </summary>
    /// <returns>权限状态</returns>
    public static PermissionState GetReadPhotoPermissionState()
    {
        PermissionState permissionState = PermissionState.NotAllow;
#if UNITY_EDITOR || UNITY_STANDALONE_WIN
        permissionState = PermissionState.UnnecessaryPlatform;
#elif UNITY_IOS || UNITY_IPHONE
        permissionState = UnityGetiOSPermissionsState.GetPhotoPermissionState()?PermissionState.Allow:PermissionState.NotAllow;
#elif UNITY_ANDROID
        AndroidRuntimePermissions.Permission result = AndroidRuntimePermissions.RequestPermission("android.permission.READ_EXTERNAL_STORAGE");
        switch (result)
        {
            case AndroidRuntimePermissions.Permission.Denied://权限被拒绝且不再询问
                permissionState = PermissionState.NotAllow;
                break;
            case AndroidRuntimePermissions.Permission.Granted://允许
                permissionState = PermissionState.Allow;
                break;
            case AndroidRuntimePermissions.Permission.ShouldAsk://拒绝权限但不拒绝询问
                permissionState = PermissionState.WaitAsk;
                break;
        }
#endif
        return permissionState;
    }

    /// <summary>
    /// 打开App设置界面
    /// </summary>
    /// <returns>权限状态</returns>
    public static void OpenAppSettings()
    {
#if UNITY_EDITOR || UNITY_STANDALONE_WIN

#elif UNITY_IOS || UNITY_IPHONE
        UnityGetiOSPermissionsState.OpenAppSettings();
#elif UNITY_ANDROID
        AndroidRuntimePermissions.OpenSettings();
#endif
    }
}

public enum PermissionState
{
    //未允许
    NotAllow,
    //允许
    Allow,
    //等待询问
    WaitAsk,
    //不需要的平台
    UnnecessaryPlatform
}

如果不看上面两篇这里可能会比较吃力,但是懒人就方便了。
用的时候注意一下使用注意点,我也写在README里了:

ios使用注意:
--使用麦克风权限
在info中添加Privacy - Microphone Usage Description描述
--使用相机权限
在info中添加Privacy - Camera Usage Description描述
--使用读取相册权限
在info中添加Privacy - Photo Library Additions Usage Description描述和Privacy - Photo Library Usage Description描述
还需要在TARGETS-UnityFramework-General-Frameworks and Libraries中添加Photos.framework

安卓使用注意:
需修改Unity 默认AndroidManifest文件,文件路径为
Mac系统:Unity.app安装同级目录: PlaybackEngines/AndroidPlayer/Apk/
Win系统:Unity安装目录下面(如果hub安装的就有hub,非hub安装的就少hub这一层,可以桌面右键图标打开文件所在位置)C:\Program Files\Unity\Hub\Editor\2019.4.5f1\Editor\Data\PlaybackEngines\AndroidPlayer\Apk
在文件中添加需要的权限:
--使用麦克风权限
<uses-permission android:name="android.permission.RECORD_AUDIO" />
--使用相机权限
<uses-permission android:name="android.permission.CAMERA" />
--使用读取相册权限
在unity导出设置othersetting中的write permission(写入权限)设置为External(SDCard)

插件下载地址:
链接: https://pan.baidu.com/s/1JTyjvZERAA_h0rYsOEy8xg
提取码: ebuy


2021.4.28更新
有小伙伴说ios打包的时候碰到如下问题:

Undefined symbols for architecture arm64: "_OBJC_CLASS_$_CTCellularData", referenced from: objc-class-ref in Permission.o ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

调研后发现是CoreTelephony.framework库丢失,添加后即可。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!针对您的问题,这里提供一些相关的信息供您参考。 首先,Unity是一款跨平台的游戏开发引擎,可以支持在多个平台上进行游戏开发。而AndroidiOS是其比较常见的移动平台。 在AndroidiOS平台上嵌入Unity的开发示例,可以参考官方文档的相关内容。具体步骤如下: 1. 创建Unity项目并设置相关参数,例如选择AndroidiOS平台,设置屏幕分辨率等。 2. 在Unity项目添加所需的场景和游戏对象,并设置相应的脚本和材质等。 3. 将Unity项目导出为AndroidiOS平台所需的文件格式,例如APK或IPA文件。 4. 在AndroidiOS项目嵌入Unity文件,并通过相关代码进行调用和交互。 需要注意的是,AndroidiOS平台上嵌入Unity的具体实现方式可能会有所不同,需要根据具体情况进行调整和修改。 另外,关于在Unity开发AndroidiOS应用的示例,也可以参考官方文档的相关内容。具体步骤如下: 1. 创建Unity项目并设置相关参数,例如选择AndroidiOS平台,设置屏幕分辨率等。 2. 在Unity项目添加所需的场景和游戏对象,并设置相应的脚本和材质等。 3. 使用Unity提供的AndroidiOS插件进行开发,例如调用相机或GPS等硬件功能,或者进行网络通信等。 4. 将Unity项目导出为AndroidiOS应用程序,并进行相关的测试和调试。 需要注意的是,开发AndroidiOS应用程序需要遵循相应的规范和标准,例如Android应用程序需要满足Google Play的要求,iOS应用程序需要通过苹果的审核。因此,在开发过程需要谨慎处理相关问题。 希望以上信息对您有所帮助,如有任何疑问,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值