Skip to content

Commit 57898c1

Browse files
committed
Fixed bug in #74 and #75
1 parent 85d04f9 commit 57898c1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+79
-44
lines changed

PermissionsSwiftUI.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = 'PermissionsSwiftUI'
3-
s.version = '1.4.2'
3+
s.version = '1.4.3'
44
s.summary = 'A SwiftUI package to beautifully display and handle permissions.'
55

66
s.description = <<-DESC

Sources/PermissionsSwiftUI/Components/Shared/PermissionSection.swift

Lines changed: 72 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import MapKit
99
import SwiftUI
10+
import UserNotifications
11+
1012
struct PermissionSection: View {
1113
@Environment(\.colorScheme) var colorScheme
1214
@Binding var showing:Bool
@@ -43,7 +45,7 @@ struct PermissionSectionCell: View {
4345
@Binding var showing: Bool
4446
@EnvironmentObject var store: PermissionStore
4547
@EnvironmentObject var schemaStore: PermissionSchemaStore
46-
48+
4749
//Empty unauthorized array means all permissions have been interacted
4850
var shouldAutoDismiss: Bool {FilterPermissions.filterForUnauthorized(with: store.permissions, store: schemaStore).isEmpty}
4951

@@ -104,7 +106,7 @@ struct PermissionSectionCell: View {
104106
}
105107
else{
106108
AllowButtonSection(action: handlePermissionRequest, allowButtonStatus: $allowButtonStatus)
107-
.animation(.default)
109+
.animation(.default)
108110
}
109111

110112
}
@@ -115,44 +117,77 @@ struct PermissionSectionCell: View {
115117

116118
func handlePermissionRequest() {
117119
permissionManager = permission.getPermissionManager()?.init(permissionType: permission)
118-
permissionManager!.requestPermission{authorized, error in
119-
let result = JMResult(permissionType: permission,
120-
authorizationStatus: permissionManager!.authorizationStatus,
121-
error: error)
122-
schemaStore.permissionComponentsStore.getPermissionComponent(for: permission){permissionComponent in
123-
permissionComponent.interacted = true
124-
if authorized {
125-
allowButtonStatus = .allowed
126-
permissionComponent.authorized = true
127-
(schemaStore.successfulPermissions?.append(result)) ?? (schemaStore.successfulPermissions = [result])
128-
}
129-
else {
130-
allowButtonStatus = .denied
131-
permissionComponent.authorized = false
132-
(schemaStore.erroneousPermissions?.append(result)) ?? (schemaStore.erroneousPermissions = [result])
120+
guard let permissionManager = permissionManager else {
121+
return
122+
}
123+
permissionManager.requestPermission{authorized, error in
124+
var result: JMResult!
125+
if permission == .notification {
126+
getNotificationAuthorizationStatus{
127+
result = JMResult(permissionType: permission,
128+
authorizationStatus: $0,
129+
error: error)
130+
setStatus(authorized: authorized, result: result)
133131
}
134132
}
135-
DispatchQueue.main.async {
136-
schemaStore.objectWillChange.send()
133+
else {
134+
result = JMResult(permissionType: permission,
135+
authorizationStatus: permissionManager.authorizationStatus,
136+
error: error)
137+
setStatus(authorized: authorized, result: result)
138+
}
139+
140+
}
141+
}
142+
143+
func setStatus(authorized: Bool, result: JMResult) {
144+
schemaStore.permissionComponentsStore.getPermissionComponent(for: permission){permissionComponent in
145+
permissionComponent.interacted = true
146+
if authorized {
147+
allowButtonStatus = .allowed
148+
permissionComponent.authorized = true
149+
(schemaStore.successfulPermissions?.append(result)) ?? (schemaStore.successfulPermissions = [result])
150+
}
151+
else {
152+
allowButtonStatus = .denied
153+
permissionComponent.authorized = false
154+
(schemaStore.erroneousPermissions?.append(result)) ?? (schemaStore.erroneousPermissions = [result])
155+
}
156+
}
157+
DispatchQueue.main.async {
158+
schemaStore.objectWillChange.send()
159+
}
160+
//Backward compatibility - autoDismissAlert, autoDismissModal, and autoDismiss are all acceptable ways to trigger condition
161+
if shouldAutoDismiss &&
162+
163+
//Current view style is alert and autoDismissAlert is true
164+
((schemaStore.permissionViewStyle == .alert &&
165+
store.autoDismissAlert) ||
166+
//Current view style is modal and autoDismissModal is true
167+
(schemaStore.permissionViewStyle == .modal &&
168+
store.autoDismissModal)) ||
169+
store.configStore.autoDismiss {
170+
DispatchQueue.main.asyncAfter(deadline: .now()+0.8) {
171+
showing = false
172+
guard let handler = store.configStore.onDisappearHandler else {return}
173+
handler(schemaStore.successfulPermissions ?? nil, schemaStore.erroneousPermissions ?? nil)
174+
}
175+
}
176+
}
177+
func getNotificationAuthorizationStatus(completion: @escaping (AuthorizationStatus) -> ()) {
178+
UNUserNotificationCenter.current().getNotificationSettings { settings in
179+
switch settings.authorizationStatus{
180+
case .authorized:
181+
completion(.authorized)
182+
case .denied:
183+
completion(.denied)
184+
case .notDetermined:
185+
completion(.notDetermined)
186+
case .provisional:
187+
completion(.limited)
188+
default:
189+
completion(.denied)
137190
}
138-
//Backward compatibility - autoDismissAlert, autoDismissModal, and autoDismiss are all acceptable ways to trigger condition
139-
if shouldAutoDismiss &&
140-
141-
//Current view style is alert and autoDismissAlert is true
142-
((schemaStore.permissionViewStyle == .alert &&
143-
store.autoDismissAlert) ||
144-
//Current view style is modal and autoDismissModal is true
145-
(schemaStore.permissionViewStyle == .modal &&
146-
store.autoDismissModal)) ||
147-
store.configStore.autoDismiss {
148-
DispatchQueue.main.asyncAfter(deadline: .now()+0.8) {
149-
showing = false
150-
guard let handler = store.configStore.onDisappearHandler else {return}
151-
handler(schemaStore.successfulPermissions ?? nil, schemaStore.erroneousPermissions ?? nil)
152-
}
153-
}
154-
permissionManager = nil
155-
156191
}
157192
}
158193
}

Sources/PermissionsSwiftUI/Model/PermissionManagers/JMNotificationPermissionManager.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ struct JMNotificationPermissionManager: PermissionManager {
4242
return .denied
4343
}
4444
}
45-
var notificationManager:NotificationManager = UNUserNotificationCenter.shared()
45+
var notificationManager:NotificationManager = UNUserNotificationCenter.shared()
4646

47-
init(notificationManager:NotificationManager=UNUserNotificationCenter.shared()){
47+
init(notificationManager:NotificationManager = UNUserNotificationCenter.shared()){
4848
self.notificationManager = notificationManager
4949
}
5050
init(){}

Sources/PermissionsSwiftUI/Model/PermissionManagers/JMTrackingPermissionManager.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Foundation
99
import AppTrackingTransparency
1010
import AdSupport
1111

12-
@available(iOS 14.5, *)
12+
@available(iOS 14, *)
1313
struct JMTrackingPermissionManager: PermissionManager {
1414
init(permissionType: PermissionType?) {}
1515

Sources/PermissionsSwiftUI/Model/PermissionType/PermissionTypeGetSet.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ extension PermissionType: PermissionTypeProtocol {
3333
case .bluetooth:
3434
return JMBluetoothPermissionManager.self
3535
case .tracking:
36-
if #available(iOS 14.5, *) {
36+
if #available(iOS 14, *) {
3737
return JMTrackingPermissionManager.self
3838
}
3939
case .contacts:

Tests/PermissionsSwiftUITests/PermissionsSwiftUITests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec nec congue metus.
330330
store.permissions = PermissionType.allCases
331331
store.configStore.autoCheckAuth = false
332332
let view = ModalView(showModal: .constant(true)).withEnvironmentObjects(store: store, permissionStyle: .modal)
333-
assertSnapshot(matching: view.referenceFrame(count: store.permissions.count), as: .image)
333+
assertSnapshot(matching: view.referenceFrame(count: store.permissions.count), as: .image(precision: 0.99))
334334
}
335335
}
336336

@@ -356,7 +356,7 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec nec congue metus.
356356
let title = currentPermission.title
357357
let views = getPermissionView(for: permission)
358358
for i in views{
359-
assertSnapshot(matching: i, as: .image)
359+
assertSnapshot(matching: i, as: .image(precision: 0.99))
360360
}
361361
}
362362
}

0 commit comments

Comments
 (0)