{"id":1798,"url":"https://github.com/sparrowcode/PermissionsKit","last_synced_at":"2025-08-02T04:32:33.390Z","repository":{"id":36961427,"uuid":"82209071","full_name":"sparrowcode/PermissionsKit","owner":"sparrowcode","description":"Universal API for request permission and get its statuses.","archived":false,"fork":false,"pushed_at":"2025-03-28T04:27:33.000Z","size":112074,"stargazers_count":5772,"open_issues_count":3,"forks_count":478,"subscribers_count":95,"default_branch":"main","last_synced_at":"2025-07-23T21:42:03.860Z","etag":null,"topics":["calendar","camera","dialog","interface","ios","location","notification","permission","permissionkit","permissions","photo-gallery","reminder","request","scope","sparrow","sppermissions","ui","wizard","xcode"],"latest_commit_sha":null,"homepage":"https://x.com/sparrowcode_ios","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sparrowcode.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":["sparrowcode"]}},"created_at":"2017-02-16T17:49:57.000Z","updated_at":"2025-07-21T16:52:41.000Z","dependencies_parsed_at":"2022-07-20T04:32:17.172Z","dependency_job_id":"96396b6b-80cd-4c27-b814-b52f9b1b36ce","html_url":"https://github.com/sparrowcode/PermissionsKit","commit_stats":{"total_commits":1150,"total_committers":47,"mean_commits":24.46808510638298,"dds":0.1026086956521739,"last_synced_commit":"982462971e1901833929977330d4b341acaa94d8"},"previous_names":["ivanvorobei/sppermission","ivanvorobei/sppermissions","varabeis/sppermissions"],"tags_count":152,"template":false,"template_full_name":null,"purl":"pkg:github/sparrowcode/PermissionsKit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sparrowcode%2FPermissionsKit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sparrowcode%2FPermissionsKit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sparrowcode%2FPermissionsKit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sparrowcode%2FPermissionsKit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sparrowcode","download_url":"https://codeload.github.com/sparrowcode/PermissionsKit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sparrowcode%2FPermissionsKit/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266761420,"owners_count":23980297,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-23T02:00:09.312Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["calendar","camera","dialog","interface","ios","location","notification","permission","permissionkit","permissions","photo-gallery","reminder","request","scope","sparrow","sppermissions","ui","wizard","xcode"],"created_at":"2024-01-05T20:15:56.050Z","updated_at":"2025-08-02T04:32:33.129Z","avatar_url":"https://github.com/sparrowcode.png","language":"Swift","readme":"# PermissionsKit \n\nUniversal API for request permission and get its statuses — available `.authorized`, `.denied` \u0026 `.notDetermined`.\n\n\u003cp float=\"left\"\u003e\n    \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/camera.png\" width=\"38\"\u003e\n    \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/photos.png\" width=\"38\"\u003e\n    \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/notifications.png\" width=\"38\"\u003e\n    \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/location.png\" width=\"38\"\u003e\n    \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/microphone.png\" width=\"38\"\u003e\n    \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/calendar.png\" width=\"38\"\u003e\n    \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/contacts.png\" width=\"38\"\u003e\n    \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/reminders.png\" width=\"38\"\u003e\n    \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/motion.png\" width=\"38\"\u003e\n    \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/music.png\" width=\"38\"\u003e\n    \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/speech.png\" width=\"38\"\u003e\n    \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/bluetooth.png\" width=\"38\"\u003e\n    \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/health.png\" width=\"38\"\u003e\n    \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/tracking.png\" width=\"38\"\u003e\n    \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/faceid.png\" width=\"38\"\u003e\n    \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/siri.png\" width=\"38\"\u003e\n\u003c/p\u003e\n\n### iOS Dev Community\n\n\u003cp float=\"left\"\u003e\n    \u003ca href=\"https://twitter.com/i/communities/1730194338489987403\"\u003e\n        \u003cimg src=\"https://cdn.sparrowcode.io/github/badges/x-community.png?version=1\" height=\"52\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"#apps-using\"\u003e\n        \u003cimg src=\"https://cdn.sparrowcode.io/github/badges/download-on-the-appstore.png?version=4\" height=\"52\"\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n## Navigate\n\n- [Permissions](#permissions)\n- [Installation](#installation)\n    - [Swift Package Manager](#swift-package-manager)\n    - [CocoaPods](#cocoapods)\n    - [Why Modules](#why-modules)\n- [Usage](#request-permission)\n    - [Request Permission](#request-permission)\n    - [Get Status Permission](#get-status-permission)\n- [Keys in Info.plist](#keys-in-infoplist)\n    - [Localisations](#localisation)\n- [Apps Using](#apps-using)\n\n### Permissions\n\n| Icon |  Permission | Key for `Info.plist` | Get Status | Make Request |\n| :--: | :---------- | :------------------- | :--------: | :----------: |\n| \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/bluetooth.png\" width=\"38\"\u003e | Bluetooth | NSBluetoothAlwaysUsageDescription, NSBluetoothPeripheralUsageDescription | ✅ | ✅ |\n| \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/calendar.png\" width=\"38\"\u003e | Calendar | NSCalendarsUsageDescription, NSCalendarsFullAccessUsageDescription, NSCalendarsWriteOnlyAccessUsageDescription | ✅ | ✅ |\n| \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/camera.png\" width=\"38\"\u003e | Camera | NSCameraUsageDescription | ✅ | ✅ |\n| \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/contacts.png\" width=\"38\"\u003e | Contacts | NSContactsUsageDescription | ✅ | ✅ |\n| \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/faceid.png\" width=\"38\"\u003e | FaceID | NSFaceIDUsageDescription | ☑️ | ✅ |\n| \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/health.png\" width=\"38\"\u003e | Health | NSHealthUpdateUsageDescription, NSHealthShareUsageDescription | ✅ | ✅ |\n| \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/location.png\" width=\"38\"\u003e | Location | NSLocationAlwaysAndWhenInUseUsageDescription NSLocationWhenInUseUsageDescription | ✅ | ✅ |\n| \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/music.png\" width=\"38\"\u003e | Media Library | NSAppleMusicUsageDescription | ✅ | ✅ |\n| \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/microphone.png\" width=\"38\"\u003e | Microphone | NSMicrophoneUsageDescription | ✅ | ✅ |\n| \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/motion.png\" width=\"38\"\u003e | Motion | NSMotionUsageDescription | ✅ | ✅ |\n| \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/notifications.png\" width=\"38\"\u003e | Notification | | ✅ | ✅ |\n| \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/photos.png\" width=\"38\"\u003e | Photo Library | NSPhotoLibraryUsageDescription, NSPhotoLibraryAddUsageDescription | ✅ | ✅ |\n| \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/reminders.png\" width=\"38\"\u003e | Reminders | NSRemindersUsageDescription, NSRemindersFullAccessUsageDescription | ✅ | ✅ |\n| \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/siri.png\" width=\"38\"\u003e | Siri | NSSiriUsageDescription | ✅ | ✅ |\n| \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/speech.png\" width=\"38\"\u003e | Speech Recognizer | NSSpeechRecognitionUsageDescription | ✅ | ✅ |\n| \u003cimg src=\"https://cdn.sparrowcode.io/github/permissionskit/icons/tracking.png\" width=\"38\"\u003e | Tracking | NSUserTrackingUsageDescription | ✅ | ✅ |\n\n## Installation\n\nReady to use on iOS 12+. Supports iOS, macOS, visionOS, tvOS \u0026 watchOS. Working with `UIKit` and `SwiftUI`.\n\n### Swift Package Manager\n\nIn Xcode go to Project -\u003e Your Project Name -\u003e `Package Dependencies` -\u003e Tap *Plus*. Insert url:\n\n```\nhttps://github.com/sparrowcode/PermissionsKit\n```\n\nNext, choose the permissions that you need. But don't add all of them, because apple will reject app.\nOr adding it to the `dependencies` of your `Package.swift`:\n\n```swift\ndependencies: [\n    .package(url: \"https://github.com/sparrowcode/PermissionsKit\", .upToNextMajor(from: \"11.0.0\"))\n]\n```\n\nand choose valid targets.\n\n### CocoaPods:\n\nThis is an outdated way. I advise you to use [SPM](#swift-package-manager). However, I will continue to support Cocoapods for some time.\n\n\u003cdetails\u003e\u003csummary\u003eCocoapods Installation\u003c/summary\u003e\n\n[CocoaPods](https://cocoapods.org) is a dependency manager. For usage and installation instructions, visit their website. To integrate using CocoaPods, specify it in your `Podfile`:\n\n```ruby\npod 'PermissionsKit/NotificationPermission', :git =\u003e 'https://github.com/sparrowcode/PermissionsKit'\n```\n\nDue to Apple's new policy regarding permission access you need to specifically define what kind of permissions you want to access using subspecs.\n\n```ruby\npod 'PermissionsKit/CameraPermission', :git =\u003e 'https://github.com/sparrowcode/PermissionsKit'\npod 'PermissionsKit/ContactsPermission', :git =\u003e 'https://github.com/sparrowcode/PermissionsKit'\npod 'PermissionsKit/CalendarPermission', :git =\u003e 'https://github.com/sparrowcode/PermissionsKit'\npod 'PermissionsKit/PhotoLibraryPermission', :git =\u003e 'https://github.com/sparrowcode/PermissionsKit'\npod 'PermissionsKit/NotificationPermission', :git =\u003e 'https://github.com/sparrowcode/PermissionsKit'\npod 'PermissionsKit/MicrophonePermission', :git =\u003e 'https://github.com/sparrowcode/PermissionsKit'\npod 'PermissionsKit/RemindersPermission', :git =\u003e 'https://github.com/sparrowcode/PermissionsKit'\npod 'PermissionsKit/SpeechRecognizerPermission', :git =\u003e 'https://github.com/sparrowcode/PermissionsKit'\npod 'PermissionsKit/LocationPermission', :git =\u003e 'https://github.com/sparrowcode/PermissionsKit'\npod 'PermissionsKit/MotionPermission', :git =\u003e 'https://github.com/sparrowcode/PermissionsKit'\npod 'PermissionsKit/MediaLibraryPermission', :git =\u003e 'https://github.com/sparrowcode/PermissionsKit'\npod 'PermissionsKit/BluetoothPermission', :git =\u003e 'https://github.com/sparrowcode/PermissionsKit'\npod 'PermissionsKit/TrackingPermission', :git =\u003e 'https://github.com/sparrowcode/PermissionsKit'\npod 'PermissionsKit/FaceIDPermission', :git =\u003e 'https://github.com/sparrowcode/PermissionsKit'\npod 'PermissionsKit/SiriPermission', :git =\u003e 'https://github.com/sparrowcode/PermissionsKit'\npod 'PermissionsKit/HealthPermission', :git =\u003e 'https://github.com/sparrowcode/PermissionsKit'\n```\n\u003c/details\u003e\n\n## Why Modules\n\nIf you put all your code into one package and compile it, the Apple Review Team will see a lot of calls to the permissions API. Most likely, they will ask you to provide a valid reason for why you really need those permissions. Using modules allows you to compile only the parts of the code that are actually in use. Just select only what you need.\n\n\u003e [!WARNING]\n\u003e Import only the permissions you really need.\n\n## Request Permission\n\n```swift\nimport PermissionsKit\nimport NotificationPermission\n\nPermissionsKit.Permission.notification([.alert, .badge, .sound]).request {\n\n}\n```\n\n## Get Status Permission\n\n```swift\nimport PermissionsKit\nimport NotificationPermission\n\nlet authorized = Permission.notification.authorized\n```\n\n\u003e [!WARNING]\n\u003e For FaceID permission no way detect if request `.authorized` or `.notDetermined` accurate. Status `.denied` detect well. For now for both states return `.notDetermined`. \n\n## Keys in `Info.plist`\n\nYou need to add some strings to the `Info.plist` file with descriptions per Apple's requirements. You can get a plist of keys for permissions as follows:\n\n```swift\nlet key = Permission.bluetooth.usageDescriptionKey\n```\n\n\u003e [!NOTE]\n\u003e Do not use the description as the name of the key. Xcode can't build this.\n\n### Localisation\n\nIf you use xliff localization export, keys will be create automatically. If you prefer do the localization file manually, you need to create `InfoPlist.strings`, select languages on the right side menu and add keys as keys in plist-file. See:\n\n```\n\"NSCameraUsageDescription\" = \"Here description of usage camera\";\n```\n\n## Apps Using\n\n\u003cp float=\"left\"\u003e\n    \u003ca href=\"https://apps.apple.com/app/id1487937127\"\u003e\u003cimg src=\"https://cdn.sparrowcode.io/github/apps-using/id1487937127.png?version=2\" height=\"65\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://apps.apple.com/app/id1624477055\"\u003e\u003cimg src=\"https://cdn.sparrowcode.io/github/apps-using/id1624477055.png?version=2\" height=\"65\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://apps.apple.com/app/id1625641322\"\u003e\u003cimg src=\"https://cdn.sparrowcode.io/github/apps-using/id1625641322.png?version=2\" height=\"65\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://apps.apple.com/app/id1625641322\"\u003e\u003cimg src=\"https://cdn.sparrowcode.io/github/apps-using/id6449774982.png?version=2\" height=\"65\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://apps.apple.com/app/id875280793\"\u003e\u003cimg src=\"https://cdn.sparrowcode.io/github/apps-using/id875280793.png?version=2\" height=\"65\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://apps.apple.com/app/id743843090\"\u003e\u003cimg src=\"https://cdn.sparrowcode.io/github/apps-using/id743843090.png?version=2\" height=\"65\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://apps.apple.com/app/id537070378\"\u003e\u003cimg src=\"https://cdn.sparrowcode.io/github/apps-using/id537070378.png?version=2\" height=\"65\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://apps.apple.com/app/id1617055933\"\u003e\u003cimg src=\"https://cdn.sparrowcode.io/github/apps-using/id1617055933.png?version=2\" height=\"65\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://apps.apple.com/app/id1596657751\"\u003e\u003cimg src=\"https://cdn.sparrowcode.io/github/apps-using/id1596657751.png?version=2\" height=\"65\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://apps.apple.com/app/id1459483980\"\u003e\u003cimg src=\"https://cdn.sparrowcode.io/github/apps-using/id1459483980.png?version=2\" height=\"65\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://apps.apple.com/app/id1544749600\"\u003e\u003cimg src=\"https://cdn.sparrowcode.io/github/apps-using/id1544749600.png\" height=\"65\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://apps.apple.com/app/id6452079114\"\u003e\u003cimg src=\"https://cdn.sparrowcode.io/github/apps-using/id6452079114.png\" height=\"65\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nIf you use a `PermissionsKit`, add your app via Pull Request.\n","funding_links":["https://github.com/sponsors/sparrowcode"],"categories":["Permissions","Swift","Libs","HarmonyOS","iOS","Recently Updated"],"sub_categories":["Other Parsing","UI","Windows Manager","Permission","[Feb 04, 2025](/content/2025/02/04/README.md)"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsparrowcode%2FPermissionsKit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsparrowcode%2FPermissionsKit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsparrowcode%2FPermissionsKit/lists"}