【问题标题】:What is the correct way to send the user to set permissions发送用户设置权限的正确方法是什么
【发布时间】:2021-01-17 05:52:32
【问题描述】:

如果用户已经解除了 IOS 要求应用程序权限的第一个默认警报,那么将用户发送到设置以允许权限的正确方法是什么?

我使用以下代码将用户发送到设置并允许通知权限,这是在用户关闭第一个直接请求权限的默认对话框并由 IOS 完成的情况下完成的。 该应用使用 Core Data 作为本地数据库,使用 SwiftUI 建立 UI。

这是我用来将用户发送到设置以允许权限的代码:

UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)

但我在以下行中收到紫色警告(除其他外),以​​便在 Core Data 中创建新对象:

  guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }

紫色警告:

UIApplication.delegate must be used from main thread only

我也收到以下紫色警告Publishing changes from background threads is not allowed; make sure to publish values from the main thread (via operators like receive(on:)) on model updates. 关于正在发布的并且我希望在运行时修改的已发布属性。

等等.. 处理核心数据数据库的问题。问题似乎很明显,将用户发送到设备设置部分的第一行代码导致应用程序无法像应有的那样在主线程上运行,因此出现错误。

在任何核心数据处理函数上添加DispatchQueue.main.async {} 对我来说似乎都不合适,我不确定它是否能解决所有问题。

如果用户已经关闭了 IOS 要求应用程序权限的第一个默认警报,那么将用户发送到设置以允许权限的正确方法是什么?

【问题讨论】:

    标签: ios swift permissions swiftui


    【解决方案1】:

    紫色警告来自主线程检查器,它是 Xcode 中的一个有用工具,可帮助您找到从错误队列中访问事物的尝试。即使您可以在方案设置中禁用它,我强烈建议您不要这样做,因为它可以帮助您发现代码中的并发问题。

    AppDelegate(和任何与 UI 相关的东西)只能从主队列访问,NSManagedObjectContext 的任何实例只能从创建它的队列访问,否则您可能会遇到崩溃或数据损坏等问题.

    如果您需要将用户从非主队列发送到设置,则必须分派到主队列。

    如果您需要对多个队列执行 Core Data 操作,请先阅读 NSManagedObjectContext 文档页面上的“并发”部分。

    【讨论】:

    • 我不需要在多个队列中进行 Core Data 操作,但是当我将用户发送到设置时会发生这种情况。这是假设发生的事情吗?我怎样才能避免它而不是改变核心数据操作?我唯一的目标是在主线程上运行(或任何默认行为),但将用户发送到设置会改变这种情况。
    • @ChesterK2,我明白了,在这种情况下,值得研究一下主线程检查器停止的行是如何被调用的。您能否分享更多代码,显示您在创建新的 Core Data 对象时从何处访问 AppDelegate?
    猜你喜欢
    • 2010-10-10
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 2011-09-27
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多