حریم خصوصی و مجوزها (Privacy & Permissions)
اینجا درباره «حریم خصوصی (Privacy)» و «مجوزها (Permissions)» حرف می زنیم. اول توضیح استفاده را در Info.plist بنویس. بعد، مجوز را در زمان اجرا بگیر. مثل اجازه گرفتن برای بردن گوشی به زنگ ورزش.
درخواست دسترسی دوربین
برای دوربین از AVCaptureDevice کمک بگیر. سپس وضعیت را چک کن. و در صورت نیاز درخواست بده.
- کلید توضیح استفاده را در
Info.plistبگذار. - وضعیت مجوز را بررسی کن.
- اگر نامشخص بود، درخواست بده.
import SwiftUI
import AVFoundation
struct CameraPermissionDemo: View {
@State private var status: AVAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: .video)
var body: some View {
VStack(spacing: 12) {
Text("Status: \(label(for: status))")
Button("Request Access") {
AVCaptureDevice.requestAccess(for: .video) { _ in
DispatchQueue.main.async {
status = AVCaptureDevice.authorizationStatus(for: .video)
}
}
}
}
.padding()
}
private func label(for s: AVAuthorizationStatus) -> String {
switch s {
case .notDetermined:
return "notDetermined"
case .denied:
return "denied"
case .restricted:
return "restricted"
case .authorized:
return "authorized"
@unknown default:
return "unknown"
}
}
}
import SwiftUI
struct ContentView: View {
var body: some View {
CameraPermissionDemo()
}
}
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
باز کردن تنظیمات برنامه
اگر کاربر رد کرد، مسیر تنظیمات را باز کن. سپس راهنمای روشن بده.
import SwiftUI
import UIKit
struct OpenSettingsDemo: View {
var body: some View {
VStack(spacing: 12) {
Text("Permission denied? Open Settings.")
Button("Open Settings") {
if let url: URL = URL(string: UIApplication.openSettingsURLString) {
if UIApplication.shared.canOpenURL(url) {
UIApplication.shared.open(url)
}
}
}
}
.padding()
}
}
کلیدهای Info.plist برای حریم خصوصی
وقتی سراغ دوربین، میکروفن، موقعیت و… می روی، توضیح استفاده لازم است. این متن به کاربر نشان داده می شود.
NSCameraUsageDescription = "This app uses the camera to scan QR codes"
NSPhotoLibraryUsageDescription = "Select a profile picture"
NSLocationWhenInUseUsageDescription = "Find nearby stores"
الگوی عمومی درخواست مجوز
اول وضعیت را بخوان. سپس اگر لازم بود، درخواست بده. در حالت رد، مسیر جایگزین بده.
import AVFoundation
let status: AVAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: .video)
switch status {
case .notDetermined:
AVCaptureDevice.requestAccess(for: .video) { granted in
// handle
}
case .denied:
// Show instructions to enable in Settings
break
case .restricted:
// Inform user about restrictions
break
case .authorized:
// Proceed to use camera
break
@unknown default:
break
}
لینک به تنظیمات در حالت رد
import UIKit
if let url: URL = URL(string: UIApplication.openSettingsURLString) {
if UIApplication.shared.canOpenURL(url) {
UIApplication.shared.open(url)
}
}
مجوزهای رایج دیگر
عکس ها، موقعیت، میکروفن و مخاطبین نیز الگوی مشابهی دارند. فقط چارچوبشان فرق دارد.
import Photos
PHPhotoLibrary.requestAuthorization { status in
// handle
}
import CoreLocation
class L: NSObject, CLLocationManagerDelegate {
let manager: CLLocationManager = CLLocationManager()
func ask() {
manager.requestWhenInUseAuthorization()
}
}
import AVFoundation
AVAudioSession.sharedInstance().requestRecordPermission { granted in
// handle
}
import Contacts
let store: CNContactStore = CNContactStore()
store.requestAccess(for: .contacts) { granted, error in
// handle
}
نکته: دلیل نیاز را کوتاه توضیح بده. در صورت رد، مسیر جایگزین بده. همچنین برای آزمون، سناریوهای همه وضعیت ها را پوشش بده.
جمع بندی سریع
- حریم خصوصی یعنی احترام به داده کاربر.
- توضیح استفاده در
Info.plistالزامی است. - مجوز را زمان اجرا درخواست کن.
- در حالت رد، تنظیمات را پیشنهاد بده.
نکته: ادامه مسیر: صفحه تست SwiftUI را ببین. همچنین ذخیره وضعیت را در AppStorage و SceneStorage مرور کن. برای معماری، به MVVM سر بزن. این ها با «حریم خصوصی» خوب جور می شوند.