7

I want to get the authorization status for CMMotionActivityManager. For other services like calendar and location we have some property in the API that gives us the user authorization status for these classes. How i can get the authorization status for CMMotionActivityManager class?

Madu
  • 4,849
  • 9
  • 44
  • 78
  • possible duplicate of [iOS - is Motion Activity Enabled in Settings > Privacy > Motion Activity](http://stackoverflow.com/questions/21005990/ios-is-motion-activity-enabled-in-settings-privacy-motion-activity) – Brandon Schlenker May 03 '14 at 01:47

4 Answers4

12

CMMotionActivityManager does not currently offer a way to check authorisation status directly like other frameworks.

iOS - is Motion Activity Enabled in Settings > Privacy > Motion Activity

However, as the comments in the above question mention, if you attempt a query using

queryActivityStartingFromDate:toDate:toQueue:withHandler

and the user has not authorised your application, the handler (CMMotionActivityQueryHandler) will return this error.

CMErrorMotionActivityNotAuthorized
Community
  • 1
  • 1
Brandon Schlenker
  • 5,078
  • 1
  • 36
  • 58
11

With introduction of IOS 11.* there is the possibility to call CMMotionActivityManager.authorizationStatus() which gives you a detailed status.

spassas
  • 4,778
  • 2
  • 31
  • 39
Hardy_Germany
  • 1,259
  • 13
  • 19
4

Here's how I'm doing it :

manager = CMMotionActivityManager()

let today = NSDate()

manager.queryActivityStartingFromDate(today, toDate: today, toQueue: NSOperationQueue.mainQueue(),
    withHandler: { (activities: [CMMotionActivity]?, error: NSError?) -> Void in

        if let error = error where error.code == Int(CMErrorMotionActivityNotAuthorized.rawValue){
            print("NotAuthorized")
        }else {
            print("Authorized")
        }

})
Zack Braksa
  • 1,628
  • 18
  • 26
  • 2
    Ok kids, remember to add manager.stopActivityUpdates() to the handler. :) – CodeReaper Mar 18 '16 at 09:42
  • Good catch! Thank you – Zack Braksa Mar 18 '16 at 12:33
  • 3
    @CodeReaper I don't think that's necessary, is it? `manager.startActivityUpdates(to:withHandler:)` has not been called. `manager.queryActivityStarting(from:to:to:withHandler:)` is a one-shot request for motion data and doesn't continuously update. – Stuart Aug 27 '18 at 17:59
3

I had to adjust Zakaria's answer a bit for Swift 3.0 and also the new Error made problems, so I had to convert it back to NSError to get the code but this is how my function looks now. Thanks!

func triggerActivityPermissionRequest() {
  let manager = CMMotionActivityManager()
  let today = Date()

  manager.queryActivityStarting(from: today, to: today, to: OperationQueue.main, withHandler: { (activities: [CMMotionActivity]?, error: Error?) -> () in
    if error != nil {
      let errorCode = (error! as NSError).code
      if errorCode == Int(CMErrorMotionActivityNotAuthorized.rawValue) {
        print("NotAuthorized")
      }
    } else {
    print("Authorized")
  }
  manager.stopActivityUpdates()
  }) 
}
makle
  • 1,237
  • 1
  • 15
  • 21