在进行一些项目时,我不断遇到需要在不同可视化组件中使用权限请求功能的设计。为了避免到处复制粘贴相同的代码,我决定通过将该功能提取到自己的软件包中来简化操作。
我决定在我的项目中分离某些权限获取功能,因为每种类型的权限都有其独特的实现要求。我甚至考虑将它们分别放在不同的软件包中。稍后我将根据实践经验来考虑这一点。
演示如何在 iOS 应用程序中处理相机权限的项目此处
探索 GitHub 上的 Async location 仓库。它提供了关于如何在 iOS 应用程序中设置和管理位置服务权限的实用示例。
此软件包包含两个主要组件:GrandAccessModifier
和 Permission
。这些组件旨在帮助管理 SwiftUI 应用程序中的权限和显示提示。
要使用 GrandAccessModifier
,请将其应用于任何 SwiftUI 视图。当 showingAlert
绑定设置为 true
时,此修饰符将显示一个提示框。
import SwiftUI
struct ContentView: View {
@State private var showingAlert = false
var body: some View {
VStack {
Text("Hello, World!")
.modifier(GrandAccessModifier(
title: "Access Required",
message: "This app requires access to your settings.",
showingAlert: $showingAlert
))
Button("Show Alert") {
showingAlert = true
}
}
}
}
Permission
提供了异步属性来检查是否已授予对通讯录或相机的访问权限,以及在未授予权限时请求访问权限的方法。
添加到 Info.plist 文件以包含必要的权限描述
NS 键 | 键 | 描述 |
---|---|---|
NSCameraUsageDescription |
隐私 - 相机使用描述 | 一个字符串,描述了您的应用程序为什么需要访问相机。这会在权限对话框中显示。 |
NSContactsUsageDescription |
隐私 - 通讯录使用描述 | 一个字符串,解释了您的应用程序为什么需要访问用户的通讯录。 |
NSMicrophoneUsageDescription |
隐私 - 麦克风使用描述 | 一个字符串,详细说明了您的应用程序为什么需要访问麦克风。 |
NSPhotoLibraryUsageDescription |
隐私 - 照片图库使用描述 | 一个字符串,证明了您的应用程序为什么需要访问照片图库。 |
import AVFoundation
import Contacts
import Photos
// Check if contacts access is granted
let isContactsGranted = await Permission.isContactsGranted
// Request contacts access if not granted
if !isContactsGranted {
let granted = await Permission.requestContactsAccess
if granted {
// Access granted
} else {
// Access denied
}
}
// Similarly, check and request access for Camera, Microphone, and Photo Library
let isCameraGranted = await Permission.isCameraGranted
let isMicrophoneGranted = await Permission.isMicrophoneGranted
let isPhotoLibraryGranted = await Permission.isPhotoLibraryGranted
import SwiftUI
struct PermissionView: View {
@State private var isCameraGranted = false
@State private var isContactsGranted = false
var body: some View {
VStack {
Button("Check Camera Permission") {
Task {
isCameraGranted = await Permission.isCameraGranted
print("Camera Access: \(isCameraGranted)")
}
}
Button("Check Contacts Permission") {
Task {
isContactsGranted = await Permission.isContactsGranted
print("Contacts Access: \(isContactsGranted)")
}
}
}
}
}
变量 | 描述 |
---|---|
title | 提示框的标题。 |
message | 提示框的主要消息。 |
showingAlert | 用于控制提示框可见性的绑定。 |
url | 按下设置按钮时要打开的 URL。默认为应用程序设置 URL。 |
方法 | 描述 | 访问 |
---|---|---|
isContactsGranted | 检查是否已授予通讯录访问权限。 | public |
isCameraGranted | 检查是否已授予相机访问权限。 | public |
isMicrophoneGranted | 检查是否已授予麦克风访问权限。 | public |
isPhotoLibraryGranted | 检查是否已授予照片图库访问权限。 | public |
requestContactsAccess | 请求访问通讯录。 | internal |
requestCameraAccess | 请求访问相机。 | internal |
requestMicrophoneAccess | 请求访问麦克风。 | internal |
requestPhotoLibraryAccess | 请求访问照片图库。 | internal |
本项目根据 MIT 许可证获得许可。有关更多详细信息,请参阅 LICENSE 文件。