FinClip为企业提供小程序生态圈技术产品,开发者可在FinClip小程序开发帮助中心找到相关FinClip小程序指引

# 小程序权限

小程序权限主要介绍跟小程序Scope权限相关的方法、代理类等。

# 1. 权限请求前置处理

2.40.3版本开始,支持宿主app对小程序内的权限请求做前置处理。

宿主工程实现IAuthRequestHandler接口,参考:「IAuthRequestHandler」

# 2. 权限请求结果处理

2.40.3版本开始,支持宿主app接收小程序内的权限请求的结果。(目前仅支持核心SDK、扩展SDK的相关api)

宿主工程实现IAuthResultHandler接口,参考:「IAuthResultHandler」

# 3. 自定义隐私授权弹窗详情说明中的标题、文案

2.40.3版本开始,支持宿主app自定义隐私授权弹窗详情说明中的标题、文案。

宿主工程实现IAuthInfoHandler接口,参考:「IAuthInfoHandler」

# 4. 自定义小程序权限设置页

2.40.3版本开始,支持宿主app自定义小程序权限设置页。

# 4.1 实现

宿主工程实现IScopeSettingHandler接口,参考:「IScopeSettingHandler」

# 4.2 获取小程序目前包含的小程序权限列表

使用FinAppClientFinAppProcessClientgetScopeList方法,具体根据执行时的进程情况而定。

示例如下:

if (FinAppClient.isFinAppProcess(context)) {
    // 小程序进程
    val scopeList = FinAppProcessClient.getScopeList(context, appId)
} else {
    // 主进程
    val scopeList = FinAppClient.getScopeList(context, appId)
}

其中结果集合内的ScopeBean具有以下方法,

获取scope值:

scope.scope

获取scope对应的标题:

scope.getScopeName(context)

获取scope对应的描述:

 scope.getDesc(context)

获取scope的状态:

scope.isAllow()
// 或
scope.isDisallow()
// 或
scope.isAllowWhenUsing() // 主要用于定位权限的【使用小程序时允许]

# 4.3 修改小程序的小程序权限状态

使用FinAppClientFinAppProcessClientupdateScopeStatus方法,具体根据执行时的进程情况而定。

示例如下:

if (FinAppClient.isFinAppProcess(context)) {
    // 小程序进程
    FinAppProcessClient.updateScopeStatus(
        context,
        appId,
        scope,
        AppletScopeBean.Status.ALLOW
    )
} else {
    // 主进程
    FinAppClient.updateScopeStatus(
        context,
        appId,
        scope,
        AppletScopeBean.Status.ALLOW
    )
}

支持的状态:

状态值 说明
UNSET 未设置
DISALLOW 拒绝
ALLOW_WHEN_USING 使用小程序时允许,主要用于定位权限
ALLOW 允许

# 5. 自定义Scope权限申请弹窗部分内容

2.40.11版本开始,支持对Scope权限弹窗的部分内容进行自定义。

宿主工程实现ScopeDialogCustomHandler接口,参考:「ScopeDialogCustomHandler」

# 6. 打开小程序授权管理页

该方法将会打开一个页面展示所有已使用过的小程序列表以及涉及的权限。

# 6.1 普通打开

示例如下:

FinAppClient.appletApiManager.openPrivacyManage(context)

# 6.2 打开时自定义导航栏

示例如下:

val config = AppletScopeManagerConfig()
config.backImageRes = R.drawable.back
config.isCenterTitle = false
FinAppClient.appletApiManager.openPrivacyManage(context, config)

配置项说明:

变量名 说明
backImageRes 返回按钮的图片资源文件。若要适配深色模式,需自行准备深色模式的图片资源文件,放在对应的night目录下。
isCenterTitle 是否居中显示标题。true居中,false居左,null则以sdk初始化时的全局配置为准。

# 7. 获取隐私授权相关信息

该方法支持宿主app获取小程序的隐私授权相关配置信息。

注意需要在小程序启动后在小程序进程进行调用。

示例如下:

FinAppProcessClient.appletProcessApiManager.getPrivacyInfo(
    context,
    object : FinSimpleCallback<PrivacyInfo>() {
        override fun onSuccess(result: PrivacyInfo) {
            // 获取隐私授权信息成功的回调
        }

        override fun onError(code: Int, error: String?) {
            // 获取隐私授权相关信息失败的回调
        }
    })

PrivacyInfo相关说明:

变量名 说明
defaultPrivacyName 默认隐私协议的协议名
defaultPrivacyContent 默认隐私协议的内容,为html代码
customPrivacyName 自定义隐私协议的协议名
customPrivacyUrl 自定义隐私协议的url

# 8. 自定义小程序(Scope)权限

自定义scope权限,一般与自定义api关联实现。

自定义api时继承ScopeApi抽象类,示例如下:

class CustomScopeApi(context: Context) : ScopeApi(context) {

    companion object {
        private const val METHOD_LOGIN = "customMethod"
    }

    override fun apis(): Array<String> {
        return arrayOf(METHOD_LOGIN)
    }

    override fun getBindScopes(): Array<AppletScopeBean> {
        // 此处构建自定义的scope对象
        val scope = AppletScopeBean(
            // 唯一scope值
            "scope.customScope",
            // 名字
            context.getString(R.string.custom_scope_name),
            // 标题
            context.getString(R.string.custom_scope_title),
            // 描述
            context.getString(R.string.custom_scope_desc)
        )
        return arrayOf(scope)
    }

    override fun invoke(event: String, params: JSONObject, callback: ICallback) {
        // 调用checkScope方法会对getBindScopes()方法内返回的自定义Scope权限进行检测、申请
        checkScope(object : Callback {
            override fun onScopeCallback(allow: Boolean, msg: String) {
                if (allow) {
                    // 权限申请成功,根据自己需要处理业务逻辑并回调给小程序
                    val result = JSONObject()
                    callback.onSuccess(result)
                } else {
                    // 权限申请失败,根据自己需要处理业务逻辑并回调给小程序
                    val result = JSONObject()
                    result.put("msg", msg)
                    callback.onFail(result)
                }
            }
        })
    }
}

注意

  • getBindScopes方法中构建自定义的scope对象时,唯一scope值不能与SDK内置的scope值相同。

    SDK内置scope列表:

    • scope.userInfo
    • scope.userLocation
    • scope.userLocationBackground
    • scope.record
    • scope.writePhotosAlbum
    • scope.camera
    • scope.bluetooth
    • scope.addPhoneContact
    • scope.getPhoneNumber
    • scope.addPhoneCalendar
  • getBindScopes方法中构建自定义的scope对象时,其中的名字、标题、描述建议使用string资源文件的方式实现,并自行准备中、英版本,以自动适配中英文语言环境。

# 9. 监听默认设置页面内小程序状态的变化

2.41.7版本开始,支持监听设置页内用户操作小程序权限的变化情况。

宿主工程实现IScopeStatusChangeHandler接口,参考:「IScopeStatusChangeHandler」

© 2022 FinClip with ❤