devxoul
2/14/2017 - 10:02 AM

Open Settings > Privacy > Location Service in iOS 10

Open Settings > Privacy > Location Service in iOS 10

// Example Usage
func openLocation() {
  guard let workspaceClass = NSClassFromString("LSApplicationWorkspace") else { return }
  let workspace: AnyObject = execute(workspaceClass, "defaultWorkspace")
  let url = URL(string: "Prefs:root=Privacy&path=LOCATION")!
  execute(workspace, "openSensitiveURL:withOptions:", with: url)
}

private func getImplementation(_ owner: AnyObject, _ name: String) -> IMP {
  let selector = Selector(name)
  let method: Method
  if let cls = owner as? AnyClass {
    method = class_getClassMethod(cls, selector)
  } else {
    let cls: AnyClass = object_getClass(owner)!
    method = class_getInstanceMethod(cls, selector)
  }
  return method_getImplementation(method)
}

func execute(_ owner: AnyObject, _ name: String, with arg1: Any? = nil, arg2: Any? = nil, arg3: Any? = nil) -> AnyObject {
  let implementation = getImplementation(owner, name)
  typealias Function = @convention(c) (AnyObject, Selector, Any?, Any?, Any?) -> Unmanaged<AnyObject>
  let function = unsafeBitCast(implementation, to: Function.self)
  return function(owner, Selector(name), arg1, arg2, arg3).takeRetainedValue()
}

func execute(_ owner: AnyObject, _ name: String, with arg1: Any? = nil, arg2: Any? = nil, arg3: Any? = nil) {
  let implementation = getImplementation(owner, name)
  typealias Function = @convention(c) (AnyObject, Selector, Any?, Any?, Any?) -> Void
  let function = unsafeBitCast(implementation, to: Function.self)
  return function(owner, Selector(name), arg1, arg2, arg3)
}