delba / Permission

A unified API to ask for permissions on iOS
MIT License
2.9k stars 320 forks source link

Delegate is never called #144

Closed imclean closed 4 years ago

imclean commented 4 years ago

I have created a Permissions Manager, this manager returns permission buttons when requested. The manager is also the PermissionSet delegate. When the permission is requested and the delegate inside PermissionSet is called (I can breakpoint it), it never passes it to the manager and after it is called the first time it seems to be called multiple times with no delegate.

Here is the Manager, try yourself.

` import Foundation import Permission

class PermissionManager {

static let shared = PermissionManager()

let cameraButton = PermissionButton(.camera)
let locationButton = PermissionButton(.locationWhenInUse)
let photosButton = PermissionButton(.photos)
let notificationsButton = PermissionButton(.notifications(options: [.alert,.badge,.sound]))

var permissions:PermissionSet

init() {
    permissions = PermissionSet([cameraButton, locationButton, photosButton, notificationsButton])
    permissions.delegate = self
}

func providePermissionsButtons() -> [PermissionButton] {

    cameraButton.frame = CGRect(x: 0, y: 0, width: 300, height: 50)
    locationButton.frame = CGRect(x: 0, y: 80, width: 300, height: 50)
    photosButton.frame = CGRect(x: 0, y: 160, width: 300, height: 50)
    notificationsButton.frame = CGRect(x: 0, y: 240, width: 300, height: 50)

    cameraButton.setTitles([
        .notDetermined: NSLocalizedString("Camera - Not Determined", comment: ""),
        .authorized:    NSLocalizedString("Camera - Authorized", comment: ""),
        .denied:        NSLocalizedString("Camera - Denied", comment: "")
    ])
    locationButton.setTitles([
        .notDetermined: NSLocalizedString("Location - Not Determined", comment: ""),
        .authorized:    NSLocalizedString("Location - Authorized", comment: ""),
        .denied:        NSLocalizedString("Location - Denied", comment: "")
    ])
    notificationsButton.setTitles([
        .notDetermined: NSLocalizedString("Notifications - Not Determined", comment: ""),
        .authorized:    NSLocalizedString("Notifications - Authorized", comment: ""),
        .denied:        NSLocalizedString("Notifications - Denied", comment: "")
    ])
    photosButton.setTitles([
        .notDetermined: NSLocalizedString("Photos - Not Determined", comment: ""),
        .authorized:    NSLocalizedString("Photos - Authorized", comment: ""),
        .denied:        NSLocalizedString("Photos - Denied", comment: "")
    ])

    cameraButton.setTitleColors([
        .notDetermined: .orange,
        .authorized:    .green,
        .denied:        .red
    ])

    locationButton.setTitleColors([
        .notDetermined: .orange,
        .authorized:    .green,
        .denied:        .red
    ])

    notificationsButton.setTitleColors([
        .notDetermined: .orange,
        .authorized:    .green,
        .denied:        .red
    ])

    photosButton.setTitleColors([
        .notDetermined: .orange,
        .authorized:    .green,
        .denied:        .red
    ])

    cameraButton.permission.presentPrePermissionAlert = true
    cameraButton.permission.prePermissionAlert.title   = NSLocalizedString("Let APP Access Your Camera?", comment: "")
    cameraButton.permission.prePermissionAlert.message = NSLocalizedString("This lets you take photos to identify", comment: "")
    cameraButton.permission.prePermissionAlert.cancel  = NSLocalizedString("Not now", comment: "")
    cameraButton.permission.prePermissionAlert.confirm = NSLocalizedString("Give Access", comment: "")
    cameraButton.permission.deniedAlert.title    = NSLocalizedString("Please allow access to your Camera", comment: "")
    cameraButton.permission.deniedAlert.message  = nil
    cameraButton.permission.deniedAlert.cancel   = NSLocalizedString("Cancel", comment: "")
    cameraButton.permission.deniedAlert.settings = NSLocalizedString("Settings", comment: "")
    cameraButton.permission.disabledAlert.title    = NSLocalizedString("Please allow access to your Camera", comment: "")
    cameraButton.permission.disabledAlert.message  = nil
    cameraButton.permission.disabledAlert.cancel   = NSLocalizedString("Cancel", comment: "")
    cameraButton.permission.disabledAlert.settings = NSLocalizedString("Settings", comment: "")

    photosButton.permission.presentPrePermissionAlert = true
    photosButton.permission.prePermissionAlert.title   = NSLocalizedString("Let APP Access Your Photos?", comment: "")
    photosButton.permission.prePermissionAlert.message = NSLocalizedString("This lets you use existing photos to identify", comment: "")
    photosButton.permission.prePermissionAlert.cancel  = NSLocalizedString("Not now", comment: "")
    photosButton.permission.prePermissionAlert.confirm = NSLocalizedString("Give Access", comment: "")
    photosButton.permission.deniedAlert.title    = NSLocalizedString("Please allow access to your Photos", comment: "")
    photosButton.permission.deniedAlert.message  = nil
    photosButton.permission.deniedAlert.cancel   = NSLocalizedString("Cancel", comment: "")
    photosButton.permission.deniedAlert.settings = NSLocalizedString("Settings", comment: "")
    photosButton.permission.disabledAlert.title    = NSLocalizedString("Please allow access to your Photos", comment: "")
    photosButton.permission.disabledAlert.message  = nil
    photosButton.permission.disabledAlert.cancel   = NSLocalizedString("Cancel", comment: "")
    photosButton.permission.disabledAlert.settings = NSLocalizedString("Settings", comment: "")

    locationButton.permission.presentPrePermissionAlert = true
    locationButton.permission.prePermissionAlert.title   = NSLocalizedString("Let APP Access Your Location?", comment: "")
    locationButton.permission.prePermissionAlert.message = NSLocalizedString("This helps others locate art you discover", comment: "")
    locationButton.permission.prePermissionAlert.cancel  = NSLocalizedString("Not now", comment: "")
    locationButton.permission.prePermissionAlert.confirm = NSLocalizedString("Give Access", comment: "")
    locationButton.permission.deniedAlert.title    = NSLocalizedString("Please allow access to your Location", comment: "")
    locationButton.permission.deniedAlert.message  = nil
    locationButton.permission.deniedAlert.cancel   = NSLocalizedString("Cancel", comment: "")
    locationButton.permission.deniedAlert.settings = NSLocalizedString("Settings", comment: "")
    locationButton.permission.disabledAlert.title    = NSLocalizedString("Please allow access to your Location", comment: "")
    locationButton.permission.disabledAlert.message  = nil
    locationButton.permission.disabledAlert.cancel   = NSLocalizedString("Cancel", comment: "")
    locationButton.permission.disabledAlert.settings = NSLocalizedString("Settings", comment: "")

    notificationsButton.permission.presentPrePermissionAlert = true
    notificationsButton.permission.prePermissionAlert.title   = NSLocalizedString("Let APP Send You Notifications?", comment: "")
    notificationsButton.permission.prePermissionAlert.message = NSLocalizedString("This helps keep you informed", comment: "")
    notificationsButton.permission.prePermissionAlert.cancel  = NSLocalizedString("Not now", comment: "")
    notificationsButton.permission.prePermissionAlert.confirm = NSLocalizedString("Give Access", comment: "")
    notificationsButton.permission.deniedAlert.title    = NSLocalizedString("Please allow notifications", comment: "")
    notificationsButton.permission.deniedAlert.message  = nil
    notificationsButton.permission.deniedAlert.cancel   = NSLocalizedString("Cancel", comment: "")
    notificationsButton.permission.disabledAlert.settings = NSLocalizedString("Settings", comment: "")
    notificationsButton.permission.disabledAlert.title    = NSLocalizedString("Please allow notifications", comment: "")
    notificationsButton.permission.disabledAlert.message  = nil
    notificationsButton.permission.disabledAlert.cancel   = NSLocalizedString("Cancel", comment: "")
    notificationsButton.permission.disabledAlert.settings = NSLocalizedString("Settings", comment: "")

    return [cameraButton,photosButton,locationButton,notificationsButton]
}

}

extension PermissionManager: PermissionSetDelegate { func permissionSet(permissionSet: PermissionSet, willRequestPermission permission: Permission) { print("Will request (permission)")

}

func permissionSet(permissionSet: PermissionSet, didRequestPermission permission: Permission) {
    switch permission {
    case .camera:
        switch permission.status {
            case .authorized:    print("all the permissions are granted")
            case .denied:        print("at least one permission is denied")
            case .disabled:      print("at least one permission is disabled")
            case .notDetermined: print("at least one permission is not determined")
        }
    case .locationWhenInUse:
        switch permission.status {
            case .authorized:    print("all the permissions are granted")
            case .denied:        print("at least one permission is denied")
            case .disabled:      print("at least one permission is disabled")
            case .notDetermined: print("at least one permission is not determined")
        }
    case .photos:
        switch permission.status {
            case .authorized:    print("all the permissions are granted")
            case .denied:        print("at least one permission is denied")
            case .disabled:      print("at least one permission is disabled")
            case .notDetermined: print("at least one permission is not determined")
        }
    case .notifications:
        switch permission.status {
            case .authorized:
                UIApplication.shared.registerForRemoteNotifications()
                print("all the permissions are granted")
                break
            case .denied:        print("at least one permission is denied")
            case .disabled:      print("at least one permission is disabled")
            case .notDetermined: print("at least one permission is not determined")
        }
    default:
        break
    }

}

} `

imclean commented 4 years ago

Ok, in case anyone tries using the code in the README, it's wrong:

Delegate methods should be:

func permissionSet( permissionSet: PermissionSet, didRequestPermission permission: Permission) {} func permissionSet( permissionSet: PermissionSet, willRequestPermission permission: Permission) {}