Flutter插件开发和iOS原生代码:避免应用启动时的权限请求?

Posted

技术标签:

【中文标题】Flutter插件开发和iOS原生代码:避免应用启动时的权限请求?【英文标题】:flutter plugin development and iOS native code: avoid permission request on app launch? 【发布时间】:2022-01-18 11:44:53 【问题描述】:

大家好,提前感谢您的时间和奉献精神。

我正在开发一个需要访问麦克风的颤振插件。我已经能够这样做了,但是当我测试插件(使用示例或使用新的或现有的应用程序)时,我遇到了有关麦克风权限的以下问题:

初始上下文:

插件本身不请求权限。这是更大发展的一部分,其想法是该应用程序将在类似屏幕的向导上请求权限。插件的作用是检查是否授予了授予者权限(在本例中为麦克风)

场景 1:NSMicrophoneUsageDescription 在 Info.plist 中不存在

在这种情况下,在真实设备上运行应用程序(总是在调试上下文中)会自动崩溃。在这一点上,我没有调用任何可能尝试使用麦克风的方法。事实上,如果我使用新应用程序只是添加依赖项而不导入任何内容,则会导致崩溃:

此应用已崩溃,因为它试图在没有使用说明的情况下访问隐私敏感数据。应用的 Info.plist 必须包含一个 NSMicrophoneUsageDescription 键和一个字符串值,向用户解释应用如何使用这些数据。

场景 2:NSMicrophoneUsageDescription 存在于 Info.plist

这修复了崩溃,但也会导致应用在启动后立即请求麦克风权限。这很好,但它与向导屏幕的要求相冲突。

由于我不是 Flutter 插件开发方面的专家,这可能是正常流程,但我会觉得这很奇怪。如果是这种情况,有没有办法避免应用程序请求权限,以便我可以按需进行?

再次感谢

编辑 1:

我被要求显示代码,但只是将库添加为依赖项会触发此操作。

这可能是调试的事情吗?

编辑 2:

问题是插件根目录上的单例模式初始化 ios 本机代码。谢谢大家

【问题讨论】:

您的代码正在尝试访问麦克风。就这么简单。 edit您的问题在上下文中显示相关代码;即您在哪里以及如何“检查权限” @Paulw11 感谢您的回复!正是我的想法,但它可以在启动时触发,甚至没有调用尝试访问麦克风的代码吗? (即:只需在 pubspeck 中添加依赖即可) 我不知道flutter是如何处理native代码的,但是听起来好像只是简单的添加了包导致flutter在app启动时调用了你的一些代码。您需要在 Xcode 中运行您的项目,以便您可以在本机代码中设置断点。我保证有些代码正在调用requestRecordPermission。除非您要求,否则 iOS 不会显示权限对话框。 啊,有趣。一旦我回到代码,我会尝试。随着我进行更多调查,将保持更新问题。谢谢 @Paulw11 你完全正确。该插件的入口点是单例,它似乎正在启动 iOS 本机代码。非常感谢 【参考方案1】:

我发现了问题所在: 该代码使用单例作为入口点,并且正在实例化 AudioEngine。 我对这个不好。谢谢大家。

【讨论】:

以上是关于Flutter插件开发和iOS原生代码:避免应用启动时的权限请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 插件中调试 iOS 原生代码?

FlutterWeb 和 WebView 原生交互调用

Flutter学习之混合开发

Flutter学习之混合开发

Flutter与原生交互

Flutter beta 1 重磅发布:开发精美的原生应用