PermissionsSwiftUI: 一个处理权限的 SwiftUI 包

PermissionsSwiftUI 在 SwiftUI 中显示和处理权限。它主要受到 SPPermissions 的启发。UI 高度可定制,并且类似于 Apple 风格。如果您喜欢这个项目,请给它一个 star ★

PermissionsSwiftUI 在 ☀️浅色和 🌑 深色模式下都同样美观。

🧭 导航

用法
附加信息

🖥️ 安装

要求

安装

Swift Package Manager (推荐)

您可以通过 SPM 将 PermissionsSwiftUI 安装到您的 Xcode 项目中。要了解有关 SPM 的更多信息,请点击 这里

  1. 在 Xcode 12 中,打开您的项目并导航到 FileSwift PackagesAdd Package Dependency...

对于 Xcode 13,导航到 FilesAdd Package

  1. 粘贴存储库 URL (https://github.com/jevonmao/PermissionsSwiftUI) 并点击 Next
  2. 对于 Version,验证它是否为 Up to next major
  3. 点击 Next 并且 **仅选择需要的权限**,否则 Apple 将拒绝您的应用

(您不需要添加 CorePermissionsSwiftUI 或 PermissionsSwiftUI)

image

  1. 点击 Finish
  2. 一切就绪,感谢您使用 PermissionsSwiftUI!

Cocoapods (已弃用)

您也可以使用 Cocoapods 安装 PermissionsSwiftUI。在您的 podfile 中添加 pod 'PermissionsSwiftUI'

platform :ios, '14.0'

target 'test abstract' do
  use_frameworks!
  pod 'PermissionsSwiftUI'

end

🚀 快速开始

在您开始之前,请给此存储库一个 star ★。您的 star 是我熬夜并维护这个开源项目的最大动力。

⚠️v1.4.0 迁移指南

v1.4 来了!如果您遇到任何问题,请查看 迁移指南,该指南旨在帮助开发人员解决任何弃用和 API 更新。

模态风格

要使用 PermissionsSwiftUI,只需将 JMModal 修饰符添加到任何视图

.JMModal(showModal: $showModal, for: [.locationAlways, .photo, .microphone])`

传入一个 Binding<Bool> 来显示模态视图,并添加您想要显示的任何权限。 例如

   struct ContentView: View {
       @State var showModal = false
       var body: some View {
           Button(action: {
               showModal=true
           }, label: {
               Text("Ask user for permissions")
           })
           .JMModal(showModal: $showModal, for: [.locationAlways, .photo, .microphone])
       }
   }

提示框风格

提示框风格同样美观,并且允许更多用途。当您拥有少于 3 个权限时,建议使用它。
要显示权限弹出提示框,请使用
.JMAlert(showModal: $showModal, for: [.locationAlways, .photo])

与之前的 JMPermissions 类似,您需要传入一个 Binding<Bool> 来显示视图,并添加您想要显示的任何权限。要快速浏览 PermissionsSwiftUI 的所有自定义和配置,请查看 备忘单





🛠️ 用法

自定义权限文本

要自定义权限文本,请使用修饰符 setPermissionComponent() 例如,您可以更改标题、描述和图像图标

.setPermissionComponent(for: .camera, 
                        image: AnyView(Image(systemName: "camera.fill")), 
                        title: "Camcorder",
                        description: "App needs to record videos")

结果


或者只更改标题和描述中的 1 个
setPermissionComponent(for: .tracking, title: "Trackers")
setPermissionComponent(for: .tracking, description: "Tracking description")

注意

image 参数接受 AnyView,因此请随意使用 SF Symbols 或您的自定义资源

.setPermissionComponent(for: .camera, 
                        image: AnyView(Image("Your-cool-image"))

即使是完整的 SwiftUI 视图也可以😱

.setPermissionComponent(for: .camera, 
                        image: AnyView(YourCoolView())

您可以使用自定义文本和图标来支持所有受支持的权限,只需一行代码。

自定义标题文本

要自定义标题,请使用修饰符 changeHeaderTo: Annotated for headers screen

.JMPermissions(showModal: $showModal, for: [.camera, .location, .calendar])
.changeHeaderTo("App Permissions")

要自定义标题描述,请使用修饰符 changeHeaderDescriptionTo

.JMPermissions(showModal: $showModal, for: [.camera, .location, .photo])
.changeHeaderDescriptionTo("Instagram need certain permissions in order for all the features to work.")

要自定义底部描述,请使用修饰符 changeBottomDescriptionTo

.JMPermissions(showModal: $showModal, for: [.camera, .location, .photo])
.changeBottomDescriptionTo("If not allowed, you have to enable permissions in settings")

onAppearonDisappear 重写

您可能会发现,在 PermissionsSwiftUI 视图出现和消失时执行您的代码或执行一些更新操作非常有用。
您可以在 PermissionsSwiftUI 视图出现或消失时执行一些操作,通过

.JMPermissions(showModal: $showModal, for: [.locationAlways, .photo, .microphone], onAppear: {}, onDisappear: {})

每次 PermissionsSwiftUI 视图出现和消失时,onAppearonDisappear 闭包参数将被执行
用于状态更改的相同视图修饰符闭包对于 JMAlert 修饰符也可用

.JMAlert(showModal: $showModal,
                     for: [.locationAlways, .photo],
                     onAppear: {print("Appeared")},
                     onDisappear: {print("Disappeared")})

自动检查授权

PermissionsSwiftUI 默认会自动检查授权状态。它只会显示当前状态为 notDetermined 的权限。(iOS 系统阻止开发人员请求被拒绝的权限。PermissionsSwiftUI 也会忽略已允许的权限)。如果所有权限都被允许或拒绝,PermissionsSwiftUI 将根本不显示模态框或提示框。要设置自动检查授权,请使用 autoCheckAuthorization 参数

.JMModal(showModal: $showModal, for: [.camera], autoCheckAuthorization: false)

同样适用于 JMAlert

.JMAlert(showModal: $showModal, for: [.camera], autoCheckAuthorization: false)

自动关闭

默认情况下,PermissionsSwiftUI 不会有任何自动关闭行为。您可以覆盖此行为,使其在用户允许最后一个权限项目后自动关闭模态框或提示框。(必须允许所有权限,如果任何一个被拒绝,它将不会自动关闭)。

.JMModal(... autoDismiss: Bool) -> some View

传入 truefalse 以选择是否自动关闭视图。

自定义颜色

使用 PermissionSwiftUI 的功能,开发人员和设计人员可以极其灵活地自定义所有 UI 颜色。您可以使用自定义颜色完全配置所有状态下的所有颜色。
要轻松更改强调色

.setAccentColor(to: Color(.sRGB, red: 56/255, green: 173/255,
                                  blue: 169/255, opacity: 1))

要更改主要颜色(默认的 Apple 蓝色)和辅助颜色(默认的 Apple 红色)

.setAccentColor(toPrimary: Color(.sRGB, red: 56/255, green: 173/255,
                                  blue: 169/255, opacity: 1),
                toTertiary: Color(.systemPink))

⚠️ .setAccentColor().setAllowButtonColor() 不应同时使用。

要释放所有状态下所有按钮颜色的完全自定义,您需要传入 AllButtonColors 结构体

.setAllowButtonColor(to: .init(buttonIdle: ButtonColor(foregroundColor: Color,
                                                               backgroundColor: Color),
                                       buttonAllowed: ButtonColor(foregroundColor: Color,
                                                                  backgroundColor: Color),
                                       buttonDenied: ButtonColor(foregroundColor: Color,
                                                                 backgroundColor: Color)))

有关上述方法的更多信息,请参考 官方文档

限制关闭

默认情况下,PermissionsSwiftUI 将阻止用户在与所有权限交互之前关闭模态框和提示框。 这意味着如果用户尚未明确拒绝或允许显示的每个权限,他们将无法关闭 PermissionsSwiftUI 视图。 此限制关闭行为可以通过 var restrictModalDismissal: Boolvar restrictAlertDismissal: Bool 属性来覆盖。 要禁用默认的限制关闭行为

.JMModal(showModal: $show, for permissions: [.camera], restrictDismissal: false)

您还可以使用模型进行配置

let model: PermissionStore = {
        var model = PermissionStore()
        model.permissions = [.camera]
        model.restrictModalDismissal = false
        model.restrictAlertDismissal = false
        return model
    }
    ......

    .JMModal(showModal: $showModal, forModel: model)

配置健康权限

与其他所有权限不同,健康权限的配置略有不同。 由于 Apple 要求开发人员明确设置读写类型,因此 PermissionsSwiftUI 大大简化了该过程。

HKAccess

在初始化健康权限的枚举关联值时,需要结构 HKAccess。 它封装了健康权限的读写类型权限。

要设置读写健康类型 (此处使用 activeEnergyBurned 作为示例)

let healthTypes = Set([HKSampleType.quantityType(forIdentifier: .activeEnergyBurned)!])
.JMModal(showModal: $show, for: [.health(categories: .init(readAndWrite: healthTypes))])

//Same exact syntax for JMAlert styles
.JMAlert(showModal: $show, for: [.health(categories: .init(readAndWrite: healthTypes))])

要单独设置读取或写入

let readTypes = Set([HKSampleType.quantityType(forIdentifier: .activeEnergyBurned)!])
let writeTypes = Set([HKSampleType.quantityType(forIdentifier: .appleStandTime)!])
.JMModal(showModal: $showModal, for: [.health(categories: .init(read: readTypes, write: writeTypes))])

您还可以仅设置读取或写入类型

let readTypes = Set([HKSampleType.quantityType(forIdentifier: .activeEnergyBurned)!])
.JMModal(showModal: $showModal, for: [.health(categories: .init(read: readTypes))])

📖 备忘单

修饰符

自定义整体强调色

setAccentColor(to:)
setAccentColor(toPrimary:toTertiary:)

自定义标题

changeHeaderTo(_:)

自定义顶部描述

changeHeaderDescriptionTo(_:)

自定义底部描述

changeBottomDescriptionTo(_:)

自定义每个权限的显示文本和图像

setPermissionComponent(for:image:title:description:)

setPermissionComponent(for:title:)

setPermissionComponent(for:description:)

自定义 allow 按钮的颜色

setAllowButtonColor(to:)

在上一个之后自动关闭

autoDismiss: Bool

JMModalJMAlert 的参数

在显示模态框或提示框之前检查授权

autoCheckAuthorization: Bool

阻止在所有权限交互之前关闭

restrictDismissal: Bool

在视图出现之前立即执行某些操作

onAppear: () -> Void

在视图消失之前立即执行某些操作

onDisappear: (() -> Void

🧰 支持的权限

这是 PermissionsSwiftUI 支持的所有权限的列表。 是的,甚至是 iOS 14 的最新 tracking 权限,以便您可以掌握最新的动态。 PermissionsSwiftUI 中的所有权限都带有默认名称、描述和一个令人惊叹的 Apple 原生 SF Symbols 图标。

FaceID 权限的支持正在开发中,即将推出! 如果您找不到您需要的权限,请打开一个 issue。 更好的是,自己构建它并打开一个 pull request,您可以按照 这个 分步指南来添加新权限。


A card of all the permissions

💪 贡献

欢迎程序员和非程序员在此处做出贡献。 无论您的技能水平如何,您都可以肯定地为 PermissionSwiftUI 的开源社区做出贡献。 在开始之前,请阅读 contributing.md,如果您希望贡献一种新的 iOS 权限类型,请务必阅读此分步 指南

如果您遇到任何问题、有任何疑虑或任何意见,请不要犹豫告诉我。 打开讨论、issue 或给我发电子邮件。 作为一名开发人员,我理解当您不了解代码库中的某些内容时,您的感受。 我尽量尽可能地进行注释和记录,但如果您碰巧遇到任何问题,我很乐意以任何方式提供帮助。

附加信息

鸣谢

SPPermissions 在很大程度上是著名的 Swift 库 SPPermissions (由 @verabeis 创作)的 SwiftUI 重制版。 SPPermissions 最初创建于 2017 年,如今在 GitHub 上拥有超过 4000 颗星。 PermissionsSwiftUI 旨在在 SwiftUI 中提供一个同样美观而强大的库。 如果您 star ★ 我的项目 PermissionsSwiftUI,请务必查看原始项目 SPPermissions,我在其中借鉴了 UI 设计、README.md 页面的某些部分以及沿途重要的源代码参考。

许可证

PermissionsSwiftUI 由 Jingwen (Jevon) Mao 创建,并根据 MIT 许可证 获得许可