How to check if permission is allowed from settings iOS

2.5k views Asked by At

I am working on project that needs to load the users contacts. For this I need the contacts information. Thus I am using Contacts Framework. It is easy to use and really very fast also. I am new to iOS so I just used the code snippet of getting contacts information.

What I have done: But I have problem, and that is when the user install the application and go the respective ViewController, the ViewController shows Dialog for permission. There user can Deny and Allow the permission. My app works well when user allows the permission but does not work in other way. So I used a function to check if user has given my app the permission or not.

So I read that when user has not granted the permission we can not do anything. Except we can take him to settings where he can allow the permission and get back the app. here is the code I am using to go to the settings app.

    if let appSettings = URL(string: UIApplicationOpenSettingsURLString + Bundle.main.bundleIdentifier!) {
    if UIApplication.shared.canOpenURL(appSettings) {
      UIApplication.shared.open(appSettings)
    }
  }

Problem:

now my problem is critical, and that is I know I can take user to settings view, now what if user still do not allow the Permission and just get back to our App, in this case how to check if user has given us permission or not??

I am new to iOS and swift so please help me through example. I have searched a lot but did not find anything. In Android there are callback and also onResume could be used, but in iOS I used ViewWillAppear thinking as equivalent of onResume but that did not work.

1

There are 1 answers

0
10623169 On

If you had a refresh button you could do something like the following:

@IBAction func refreshButtonPressed(_ sender: UIButton) {
            ContactsService.sharedInstance.CNContactStore.requestAccess(to: .contacts, completion: { granted, error in
                if !granted {
                    //TODO: - Do something (e.g)
                    self.[method to display an access denied alert to the user]
                    return
                } else { 
                    [insert your code here]
            }
}

Also, as another user has stated in a reply to your original question: Why does viewWillAppear not get called when an app comes back from the background? may be of interest to you. You may want to call the contents of the ContactsService.sharedInstance.CNContactStore.requestAccess( .... { } block inside a function and hook that up to a listener for the UIApplication.willEnterForegroundNotification

https://developer.apple.com/documentation/contacts https://developer.apple.com/documentation/contacts/cncontactstore https://developer.apple.com/documentation/contacts/cncontactstore/1402873-requestaccess