PermissionsSwiftUI
在 SwiftUI 中显示和处理权限。它主要受到 SPPermissions 的启发。UI 高度可定制,并且类似于 Apple 风格。如果您喜欢这个项目,请给它一个 star ★
。
PermissionsSwiftUI 在 ☀️浅色和 🌑 深色模式下都同样美观。
您可以通过 SPM 将 PermissionsSwiftUI 安装到您的 Xcode 项目中。要了解有关 SPM 的更多信息,请点击 这里
对于 Xcode 13,导航到 Files → Add Package
https://github.com/jevonmao/PermissionsSwiftUI
) 并点击 Next。(您不需要添加 CorePermissionsSwiftUI 或 PermissionsSwiftUI)
您也可以使用 Cocoapods 安装 PermissionsSwiftUI。在您的 podfile 中添加 pod 'PermissionsSwiftUI'
platform :ios, '14.0'
target 'test abstract' do
use_frameworks!
pod 'PermissionsSwiftUI'
end
在您开始之前,请给此存储库一个
star ★
。您的 star 是我熬夜并维护这个开源项目的最大动力。
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])
}
}
.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")
结果
setPermissionComponent(for: .tracking, title: "Trackers")
setPermissionComponent(for: .tracking, description: "Tracking description")
注意
setPermissionComponent
修饰符,在 JMPermissions
修饰符之后image
参数接受 AnyView,因此请随意使用 SF Symbols 或您的自定义资源
.setPermissionComponent(for: .camera,
image: AnyView(Image("Your-cool-image"))
即使是完整的 SwiftUI 视图也可以😱
.setPermissionComponent(for: .camera,
image: AnyView(YourCoolView())
您可以使用自定义文本和图标来支持所有受支持的权限,只需一行代码。
.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")
您可能会发现,在 PermissionsSwiftUI 视图出现和消失时执行您的代码或执行一些更新操作非常有用。
您可以在 PermissionsSwiftUI 视图出现或消失时执行一些操作,通过
.JMPermissions(showModal: $showModal, for: [.locationAlways, .photo, .microphone], onAppear: {}, onDisappear: {})
每次 PermissionsSwiftUI 视图出现和消失时,onAppear
和 onDisappear
闭包参数将被执行。
用于状态更改的相同视图修饰符闭包对于 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
传入 true
或 false
以选择是否自动关闭视图。
使用 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: Bool
或 var 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。 它封装了健康权限的读写类型权限。
要设置读写健康类型 (此处使用 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
在显示模态框或提示框之前检查授权
autoCheckAuthorization: Bool
阻止在所有权限交互之前关闭
restrictDismissal: Bool
在视图出现之前立即执行某些操作
onAppear: () -> Void
在视图消失之前立即执行某些操作
onDisappear: (() -> Void
这是 PermissionsSwiftUI 支持的所有权限的列表。 是的,甚至是 iOS 14 的最新 tracking
权限,以便您可以掌握最新的动态。 PermissionsSwiftUI 中的所有权限都带有默认名称、描述和一个令人惊叹的 Apple 原生 SF Symbols 图标。
FaceID 权限的支持正在开发中,即将推出! 如果您找不到您需要的权限,请打开一个 issue。 更好的是,自己构建它并打开一个 pull request,您可以按照 这个 分步指南来添加新权限。
欢迎程序员和非程序员在此处做出贡献。 无论您的技能水平如何,您都可以肯定地为 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 许可证 获得许可