diff --git a/Assets/Permissions/faceid.png b/Assets/Permissions/faceid.png index 5d0e6bdb..5b4ac8d7 100644 Binary files a/Assets/Permissions/faceid.png and b/Assets/Permissions/faceid.png differ diff --git a/Assets/Permissions/health.png b/Assets/Permissions/health.png new file mode 100644 index 00000000..e31c3e99 Binary files /dev/null and b/Assets/Permissions/health.png differ diff --git a/Assets/Sketch/sppermissions-v6.sketch b/Assets/Sketch/sppermissions-v6.sketch index aad73676..01e6021d 100644 Binary files a/Assets/Sketch/sppermissions-v6.sketch and b/Assets/Sketch/sppermissions-v6.sketch differ diff --git a/Example Apps/Dependencies/Package.swift b/Example Apps/Dependencies/Package.swift index 10e416bb..d3125169 100644 --- a/Example Apps/Dependencies/Package.swift +++ b/Example Apps/Dependencies/Package.swift @@ -43,7 +43,8 @@ let package = Package( .product(name: "SPPermissionsBluetooth", package: "SPPermissions"), .product(name: "SPPermissionsTracking", package: "SPPermissions"), .product(name: "SPPermissionsFaceID", package: "SPPermissions"), - .product(name: "SPPermissionsSiri", package: "SPPermissions") + .product(name: "SPPermissionsSiri", package: "SPPermissions"), + .product(name: "SPPermissionsHealth", package: "SPPermissions") ] ), ] diff --git a/Example Apps/SPPermissions.xcodeproj/project.xcworkspace/xcuserdata/ivanvorobei.xcuserdatad/UserInterfaceState.xcuserstate b/Example Apps/SPPermissions.xcodeproj/project.xcworkspace/xcuserdata/ivanvorobei.xcuserdatad/UserInterfaceState.xcuserstate index f07bd877..c735401a 100644 Binary files a/Example Apps/SPPermissions.xcodeproj/project.xcworkspace/xcuserdata/ivanvorobei.xcuserdatad/UserInterfaceState.xcuserstate and b/Example Apps/SPPermissions.xcodeproj/project.xcworkspace/xcuserdata/ivanvorobei.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Example Apps/iOS Example/Scenes/RootController.swift b/Example Apps/iOS Example/Scenes/RootController.swift index b5b713f0..aa4a427f 100644 --- a/Example Apps/iOS Example/Scenes/RootController.swift +++ b/Example Apps/iOS Example/Scenes/RootController.swift @@ -39,10 +39,11 @@ import SPPermissionsBluetooth import SPPermissionsTracking import SPPermissionsFaceID import SPPermissionsSiri +import SPPermissionsHealth class RootController: SPTableViewController { - var availablePermissions: [SPPermissions.Permission] = [.camera, .photoLibrary, .notification, .microphone, .calendar, .contacts, .reminders, .speech, .locationWhenInUse, .locationAlways, .motion, .mediaLibrary, .bluetooth, /*.tracking,*/ .faceID, .siri] + var availablePermissions: [SPPermissions.Permission] = [.camera, .photoLibrary, .notification, .microphone, .calendar, .contacts, .reminders, .speech, .locationWhenInUse, .locationAlways, .motion, .mediaLibrary, .bluetooth, /*.tracking,*/ .faceID, .siri, .health] var selectedPermissions: [SPPermissions.Permission] = [] diff --git a/Package.swift b/Package.swift index ea0d5dc1..93064557 100644 --- a/Package.swift +++ b/Package.swift @@ -75,6 +75,10 @@ let package = Package( name: "SPPermissionsSiri", targets: ["SPPermissionsSiri"] ), + .library( + name: "SPPermissionsHealth", + targets: ["SPPermissionsHealth"] + ), ], dependencies: [], targets: [ @@ -214,6 +218,14 @@ let package = Package( .define("SPPERMISSIONS_SIRI"), .define("SPPERMISSIONS_SPM") ] + ), + .target( + name: "SPPermissionsHealth", + dependencies: [.target(name: "SPPermissions")], + swiftSettings: [ + .define("SPPERMISSIONS_HEALTH"), + .define("SPPERMISSIONS_SPM") + ] ) ], swiftLanguageVersions: [.v5] diff --git a/README.md b/README.md index 231a4348..0333b411 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ If you like the project, don't forget to `put star ★` and follow me on GitHub: + @@ -139,6 +140,9 @@ pod 'SPPermissions/FaceID' ```ruby pod 'SPPermissions/Siri' ``` +```ruby +pod 'SPPermissions/Health' +```

@@ -371,6 +375,8 @@ List of keys: - NSUserTrackingUsageDescription - NSFaceIDUsageDescription - NSSiriUsageDescription +- NSHealthUpdateUsageDescription +- NSHealthShareUsageDescription Do not use the description as the name of the key. diff --git a/SPPermissions.podspec b/SPPermissions.podspec index 6a421661..76c51437 100644 --- a/SPPermissions.podspec +++ b/SPPermissions.podspec @@ -1,13 +1,12 @@ Pod::Spec.new do |s| - s.name = "SPPermissions" - s.version = "6.4.7" - s.summary = "Ask permissions on Swift. Available List, Dialog & Native interface. Can check state permission." - s.homepage = "https://github.com/ivanvorobei/SPPermissions" - s.source = { :git => "https://github.com/ivanvorobei/SPPermissions.git", :tag => s.version } - s.license = { :type => "MIT", :file => "LICENSE" } - - s.author = { "Ivan Vorobei" => "hello@ivanvorobei.by" } + s.name = "SPPermissions" + s.version = "6.4.8" + s.summary = "Ask permissions on Swift. Available List, Dialog & Native interface. Can check state permission." + s.homepage = "https://github.com/ivanvorobei/SPPermissions" + s.source = { :git => "https://github.com/ivanvorobei/SPPermissions.git", :tag => s.version } + s.license = { :type => "MIT", :file => "LICENSE" } + s.author = { "Ivan Vorobei" => "hello@ivanvorobei.by" } s.requires_arc = true s.ios.framework = 'UIKit' @@ -150,5 +149,13 @@ Pod::Spec.new do |s| "SWIFT_ACTIVE_COMPILATION_CONDITIONS" => "SPPERMISSIONS_SIRI SPPERMISSIONS_COCOAPODS" } end + + s.subspec 'Health' do |subspec| + subspec.dependency 'SPPermissions/Core' + subspec.source_files = "Sources/SPPermissionsHealth/**/*.swift" + subspec.pod_target_xcconfig = { + "SWIFT_ACTIVE_COMPILATION_CONDITIONS" => "SPPERMISSIONS_HEALTH SPPERMISSIONS_COCOAPODS" + } + end end diff --git a/Sources/SPPermissions/Extensions/ArrayExtension.swift b/Sources/SPPermissions/Extensions/ArrayExtension.swift index 9f7c0ef2..debf659b 100644 --- a/Sources/SPPermissions/Extensions/ArrayExtension.swift +++ b/Sources/SPPermissions/Extensions/ArrayExtension.swift @@ -23,6 +23,16 @@ import Foundation extension Array where Element: Equatable { + var duplicates: [Element] { + var result = [Element]() + for value in self { + if result.contains(value) == true { + result.append(value) + } + } + return result + } + func removedDuplicates() -> [Element] { var result = [Element]() for value in self { diff --git a/Sources/SPPermissions/Interface/Shared/SPPermissionsDrawIconView.swift b/Sources/SPPermissions/Interface/Shared/SPPermissionsDrawIconView.swift index 8ad92e83..d35b9773 100644 --- a/Sources/SPPermissions/Interface/Shared/SPPermissionsDrawIconView.swift +++ b/Sources/SPPermissions/Interface/Shared/SPPermissionsDrawIconView.swift @@ -79,7 +79,7 @@ public class SPPermissionsDrawIconView: UIView { Draw.drawBluetooth(frame: rect, resizing: .aspectFit, color: tintColor) case .tracking: Draw.drawTracking(frame: rect, resizing: .aspectFit, color: tintColor) - case .faceID, .siri: + case .faceID, .siri, .health: // Not implemented old style icons. break case .none: diff --git a/Sources/SPPermissions/Resources/Assets.xcassets/Permissions/FaceID.imageset/FaceID.pdf b/Sources/SPPermissions/Resources/Assets.xcassets/Permissions/FaceID.imageset/FaceID.pdf index c39fc153..375effad 100644 Binary files a/Sources/SPPermissions/Resources/Assets.xcassets/Permissions/FaceID.imageset/FaceID.pdf and b/Sources/SPPermissions/Resources/Assets.xcassets/Permissions/FaceID.imageset/FaceID.pdf differ diff --git a/Sources/SPPermissions/Resources/Assets.xcassets/Permissions/Health.imageset/Contents.json b/Sources/SPPermissions/Resources/Assets.xcassets/Permissions/Health.imageset/Contents.json index c19350db..5963187f 100644 --- a/Sources/SPPermissions/Resources/Assets.xcassets/Permissions/Health.imageset/Contents.json +++ b/Sources/SPPermissions/Resources/Assets.xcassets/Permissions/Health.imageset/Contents.json @@ -1,22 +1,15 @@ { "images" : [ { - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "Health@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Health@3x.png", - "idiom" : "universal", - "scale" : "3x" + "filename" : "Health.pdf", + "idiom" : "universal" } ], "info" : { "author" : "xcode", "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true } } diff --git a/Sources/SPPermissions/Resources/Assets.xcassets/Permissions/Health.imageset/Health.pdf b/Sources/SPPermissions/Resources/Assets.xcassets/Permissions/Health.imageset/Health.pdf new file mode 100644 index 00000000..e82b72c7 Binary files /dev/null and b/Sources/SPPermissions/Resources/Assets.xcassets/Permissions/Health.imageset/Health.pdf differ diff --git a/Sources/SPPermissions/Resources/Assets.xcassets/Permissions/Health.imageset/Health@2x.png b/Sources/SPPermissions/Resources/Assets.xcassets/Permissions/Health.imageset/Health@2x.png deleted file mode 100644 index 7cf4f485..00000000 Binary files a/Sources/SPPermissions/Resources/Assets.xcassets/Permissions/Health.imageset/Health@2x.png and /dev/null differ diff --git a/Sources/SPPermissions/Resources/Assets.xcassets/Permissions/Health.imageset/Health@3x.png b/Sources/SPPermissions/Resources/Assets.xcassets/Permissions/Health.imageset/Health@3x.png deleted file mode 100644 index cea59f9b..00000000 Binary files a/Sources/SPPermissions/Resources/Assets.xcassets/Permissions/Health.imageset/Health@3x.png and /dev/null differ diff --git a/Sources/SPPermissions/Resources/Localization/ar.lproj/Localizable.strings b/Sources/SPPermissions/Resources/Localization/ar.lproj/Localizable.strings index 26d46ae0..0a24a887 100644 --- a/Sources/SPPermissions/Resources/Localization/ar.lproj/Localizable.strings +++ b/Sources/SPPermissions/Resources/Localization/ar.lproj/Localizable.strings @@ -74,6 +74,10 @@ "permission siri description" = "You will be able to use Siri"; +"permission health name" = "Health"; + +"permission health description" = "Allow to access health data"; + "denied alert title" = "طلب الاذن مرفوض"; "denied alert description" = "من فضلك ، انتقل إلى الإعدادات واسمح بالإذن."; diff --git a/Sources/SPPermissions/Resources/Localization/de.lproj/Localizable.strings b/Sources/SPPermissions/Resources/Localization/de.lproj/Localizable.strings index be04e0d3..3e8de40c 100644 --- a/Sources/SPPermissions/Resources/Localization/de.lproj/Localizable.strings +++ b/Sources/SPPermissions/Resources/Localization/de.lproj/Localizable.strings @@ -74,6 +74,10 @@ "permission siri description" = "You will be able to use Siri"; +"permission health name" = "Health"; + +"permission health description" = "Allow to access health data"; + "denied alert title" = "Berechtigung verweigert"; "denied alert description" = "Bitte gehen Sie zu Einstellungen und erlauben Sie die Erlaubnis."; diff --git a/Sources/SPPermissions/Resources/Localization/en.lproj/Localizable.strings b/Sources/SPPermissions/Resources/Localization/en.lproj/Localizable.strings index 63156600..36a85054 100644 --- a/Sources/SPPermissions/Resources/Localization/en.lproj/Localizable.strings +++ b/Sources/SPPermissions/Resources/Localization/en.lproj/Localizable.strings @@ -74,6 +74,10 @@ "permission siri description" = "You will be able to use Siri"; +"permission health name" = "Health"; + +"permission health description" = "Allow to access health data"; + "denied alert title" = "Permission denied"; "denied alert description" = "Please, go to Settings and allow permission."; diff --git a/Sources/SPPermissions/Resources/Localization/es.lproj/Localizable.strings b/Sources/SPPermissions/Resources/Localization/es.lproj/Localizable.strings index 40b8b9cb..58d38514 100644 --- a/Sources/SPPermissions/Resources/Localization/es.lproj/Localizable.strings +++ b/Sources/SPPermissions/Resources/Localization/es.lproj/Localizable.strings @@ -75,6 +75,10 @@ "permission siri description" = "You will be able to use Siri"; +"permission health name" = "Health"; + +"permission health description" = "Allow to access health data"; + "denied alert title" = "Permiso denegado"; "denied alert description" = "Por favor, vaya a Configuración y permita el permiso."; diff --git a/Sources/SPPermissions/Resources/Localization/fr.lproj/Localizable.strings b/Sources/SPPermissions/Resources/Localization/fr.lproj/Localizable.strings index 507b8a0d..cf8042b8 100644 --- a/Sources/SPPermissions/Resources/Localization/fr.lproj/Localizable.strings +++ b/Sources/SPPermissions/Resources/Localization/fr.lproj/Localizable.strings @@ -74,6 +74,10 @@ "permission siri description" = "You will be able to use Siri"; +"permission health name" = "Health"; + +"permission health description" = "Allow to access health data"; + "denied alert title" = "Permission refusée"; "denied alert description" = "Veuillez aller dans Paramètres et autoriser la permission."; diff --git a/Sources/SPPermissions/Resources/Localization/pl.lproj/Localizable.strings b/Sources/SPPermissions/Resources/Localization/pl.lproj/Localizable.strings index 3c6c4fc1..6112b42f 100644 --- a/Sources/SPPermissions/Resources/Localization/pl.lproj/Localizable.strings +++ b/Sources/SPPermissions/Resources/Localization/pl.lproj/Localizable.strings @@ -74,6 +74,10 @@ "permission siri description" = "You will be able to use Siri"; +"permission health name" = "Health"; + +"permission health description" = "Allow to access health data"; + "denied alert title" = "Odmowa pozwolenia"; "denied alert description" = "Proszę przejść do Ustawień i zezwolić na dostęp."; diff --git a/Sources/SPPermissions/Resources/Localization/pt.lproj/Localizable.strings b/Sources/SPPermissions/Resources/Localization/pt.lproj/Localizable.strings index 0b60ea63..035b9f63 100644 --- a/Sources/SPPermissions/Resources/Localization/pt.lproj/Localizable.strings +++ b/Sources/SPPermissions/Resources/Localization/pt.lproj/Localizable.strings @@ -74,6 +74,10 @@ "permission siri description" = "You will be able to use Siri"; +"permission health name" = "Health"; + +"permission health description" = "Allow to access health data"; + "denied alert title" = "Permissão negada"; "denied alert description" = "Por favor, vá a Settings e permita a permissão."; diff --git a/Sources/SPPermissions/Resources/Localization/ru.lproj/Localizable.strings b/Sources/SPPermissions/Resources/Localization/ru.lproj/Localizable.strings index a8e0443d..00bc563d 100644 --- a/Sources/SPPermissions/Resources/Localization/ru.lproj/Localizable.strings +++ b/Sources/SPPermissions/Resources/Localization/ru.lproj/Localizable.strings @@ -76,6 +76,10 @@ "permission siri description" = "You will be able to use Siri"; +"permission health name" = "Health"; + +"permission health description" = "Allow to access health data"; + "denied alert description" = "Пожалуйста, перейдите в настройки и измените доступ к разрешению."; "denied alert action" = "Открыть Настройки"; diff --git a/Sources/SPPermissions/Resources/Localization/uk.lproj/Localizable.strings b/Sources/SPPermissions/Resources/Localization/uk.lproj/Localizable.strings index f2a1c06b..f5a0383d 100644 --- a/Sources/SPPermissions/Resources/Localization/uk.lproj/Localizable.strings +++ b/Sources/SPPermissions/Resources/Localization/uk.lproj/Localizable.strings @@ -76,6 +76,10 @@ "permission siri description" = "You will be able to use Siri"; +"permission health name" = "Health"; + +"permission health description" = "Allow to access health data"; + "denied alert description" = "Перейдіть у Налаштування та надайте дозвіл."; "denied alert action" = "Налаштування"; diff --git a/Sources/SPPermissions/Resources/Localization/zh_Hans.lproj/Localizable.strings b/Sources/SPPermissions/Resources/Localization/zh_Hans.lproj/Localizable.strings index 6ea3f112..922fe253 100644 --- a/Sources/SPPermissions/Resources/Localization/zh_Hans.lproj/Localizable.strings +++ b/Sources/SPPermissions/Resources/Localization/zh_Hans.lproj/Localizable.strings @@ -74,6 +74,10 @@ "permission siri description" = "You will be able to use Siri"; +"permission health name" = "Health"; + +"permission health description" = "Allow to access health data"; + "denied alert title" = "已拒绝授权"; "denied alert description" = "请跳转至设置并允许授权"; diff --git a/Sources/SPPermissions/SPPermissions.swift b/Sources/SPPermissions/SPPermissions.swift index ef501e37..ce1e5798 100644 --- a/Sources/SPPermissions/SPPermissions.swift +++ b/Sources/SPPermissions/SPPermissions.swift @@ -34,7 +34,7 @@ public enum SPPermissions { - parameter permissions: List if permissions for request, using model `SPPermissions.Permission`. */ public static func native(_ permissions: [SPPermissions.Permission]) -> SPPermissionsNativeController { - let controller = SPPermissionsNativeController(permissions.removedDuplicates()) + let controller = SPPermissionsNativeController(prepare(permissions)) return controller } @@ -46,7 +46,7 @@ public enum SPPermissions { - parameter permissions: List if permissions for request, using model `SPPermissions.Permission`. */ public static func list(_ permissions: [SPPermissions.Permission]) -> SPPermissionsListController { - let controller = SPPermissionsListController(permissions.removedDuplicates()) + let controller = SPPermissionsListController(prepare(permissions)) return controller } @@ -56,12 +56,31 @@ public enum SPPermissions { - parameter permissions: List if permissions for request, using model `SPPermissions.Permission`. */ public static func dialog(_ permissions: [SPPermissions.Permission]) -> SPPermissionsDialogController { - let controller = SPPermissionsDialogController(permissions.removedDuplicates()) + let controller = SPPermissionsDialogController(prepare(permissions)) return controller } #endif + // MARK: - Helpers + + static func prepare(_ permissions: [SPPermissions.Permission]) -> [SPPermissions.Permission] { + + for duplicate in permissions.duplicates { + console("Got duplicate permission \(duplicate.debugName), it will be filtered") + } + + for unvailable in permissions.filter({ !$0.canBePresentWithCustomInterface }) { + console("Permission \(unvailable.debugName) can't be present with custom interface. Use `SPPermissions.Permission.NAME.request()` with requerid parametrs. Permission \(unvailable.debugName) will be filtered") + } + + return permissions.removedDuplicates().filter({ $0.canBePresentWithCustomInterface }) + } + + static func console( _ message: String) { + print("SPPermissions: \(message).") + } + // MARK: - Models /** @@ -72,15 +91,15 @@ public enum SPPermissions { */ open class Permission: Equatable { - public final var authorized: Bool { + open var authorized: Bool { return status == .authorized } - public final var denied: Bool { + open var denied: Bool { return status == .denied } - public final var notDetermined: Bool { + open var notDetermined: Bool { return status == .notDetermined } @@ -89,7 +108,7 @@ public enum SPPermissions { Don't use it in your interface. Only for console debug. */ - public var debugName: String { + open var debugName: String { return type.name } @@ -98,14 +117,14 @@ public enum SPPermissions { Allowed using in interface. */ - public var localisedName: String { + open var localisedName: String { return Texts.permission_name(type) } /** SPPermissions: Icon of permission. */ - public var iconImage: UIImage { + open var iconImage: UIImage { return Images.permission_icon(for: type) } @@ -138,6 +157,13 @@ public enum SPPermissions { return lhs.type == rhs.type } + /** + SPPermissions: If flag is `false`, permission will be filtered if try present in ready-use controllers. + */ + open var canBePresentWithCustomInterface: Bool { + return true + } + public init() {} } @@ -175,6 +201,7 @@ public enum SPPermissions { case tracking = 14 case faceID = 15 case siri = 16 + case health = 17 public var name: String { switch self { @@ -210,6 +237,8 @@ public enum SPPermissions { return "FaceID" case .siri: return "Siri" + case .health: + return "Health" } } } diff --git a/Sources/SPPermissions/Services/Images.swift b/Sources/SPPermissions/Services/Images.swift index 0f640654..99507583 100644 --- a/Sources/SPPermissions/Services/Images.swift +++ b/Sources/SPPermissions/Services/Images.swift @@ -57,6 +57,8 @@ enum Images { return UIImage.init(named: "FaceID", in: bundle, compatibleWith: nil) ?? UIImage() case .siri: return UIImage.init(named: "Siri", in: bundle, compatibleWith: nil) ?? UIImage() + case .health: + return UIImage.init(named: "Health", in: bundle, compatibleWith: nil) ?? UIImage() } } diff --git a/Sources/SPPermissions/Services/Text.swift b/Sources/SPPermissions/Services/Text.swift index 4736842f..a10ec45d 100644 --- a/Sources/SPPermissions/Services/Text.swift +++ b/Sources/SPPermissions/Services/Text.swift @@ -57,6 +57,8 @@ enum Texts { return NSLocalizedString("permission faceid name", bundle: bundle, comment: "") case .siri: return NSLocalizedString("permission siri name", bundle: bundle, comment: "") + case .health: + return NSLocalizedString("permission health name", bundle: bundle, comment: "") } } @@ -94,6 +96,8 @@ enum Texts { return NSLocalizedString("permission faceid description", bundle: bundle, comment: "") case .siri: return NSLocalizedString("permission siri description", bundle: bundle, comment: "") + case .health: + return NSLocalizedString("permission health description", bundle: bundle, comment: "") } } diff --git a/Sources/SPPermissionsHealth/SPHealthPermission.swift b/Sources/SPPermissionsHealth/SPHealthPermission.swift new file mode 100644 index 00000000..c84fea52 --- /dev/null +++ b/Sources/SPPermissionsHealth/SPHealthPermission.swift @@ -0,0 +1,82 @@ +// The MIT License (MIT) +// Copyright © 2020 Ivan Vorobei (hello@ivanvorobei.by) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#if SPPERMISSIONS_SPM +import SPPermissions +#endif + +#if os(iOS) && SPPERMISSIONS_HEALTH + +import Foundation +import HealthKit + +public extension SPPermissions.Permission { + + static var health: SPHealthPermission { + return SPHealthPermission() + } +} + +public class SPHealthPermission: SPPermissions.Permission { + + open override var type: SPPermissions.PermissionType { .health } + + open var readingUsageDescriptionKey: String? { "NSHealthUpdateUsageDescription" } + open var writingUsageDescriptionKey: String? { "NSHealthShareUsageDescription" } + + public static func status(for type: HKObjectType) -> SPPermissions.PermissionStatus { + switch HKHealthStore().authorizationStatus(for: type) { + case .sharingAuthorized: return .authorized + case .sharingDenied: return .denied + case .notDetermined: return .notDetermined + @unknown default: return .denied + } + } + + public static func request(forReading readingTypes: Set, writing writingTypes: Set, completion: @escaping (() -> Void)) { + HKHealthStore().requestAuthorization(toShare: writingTypes, read: readingTypes) { _, _ in + DispatchQueue.main.async { + completion() + } + } + } + + public override var canBePresentWithCustomInterface: Bool { return false } + + // MARK: - Locked + + @available(*, unavailable) + open override var authorized: Bool { fatalError() } + + @available(*, unavailable) + open override var denied: Bool { fatalError() } + + @available(*, unavailable) + open override var notDetermined: Bool { fatalError() } + + @available(*, unavailable) + public override var status: SPPermissions.PermissionStatus { fatalError() } + + @available(*, unavailable) + open override func request(completion: @escaping ()->Void) { fatalError() } +} + +#endif diff --git a/TODO.md b/TODO.md index 3e8ab2e5..47aaa280 100644 --- a/TODO.md +++ b/TODO.md @@ -3,8 +3,7 @@ Here provided ideas or features which will be implemented soon. - Add Home permission. -- Add Health permission. -- Add Siri Permission. +- Add Local Network permission. - Special screen with explain for `Tracking` permission. - Loading animation for action button for permission. - Redo present process to native present method.