iOS清除权限的方式

有没有大佬知道iOS除了卸载重装之外,有没有重新触发申请系统权限弹框的方式啊?
另外想在权限弹框的时候截个图,但是拿不到弹框的时机,这个弹框时机有没有办法拿到呢?

有点复杂,iOS的大部分权限应该是tccd在管,位置单独由locationmananger管,推送、Siri、16新增的粘贴应该也有单独的管理(但这后几个我没看过)。照片的访问范围限制不知道归谁管,弹窗也不知道是谁弹的。
仅考虑权限重置,tccd内部有个do_TCCAccessResetInternal 函数可以重置特定bundleid的服务权限,位置可以用CLLocationManager的setAuthorizationStatusByType_forBundleIdentifier_函数设置成下次询问。其他的不知道
和清空存储一样,还不如卸载重装方便

1 个赞

大部分权限TCC管理,清除数据库就可以重置相关权限

➜  TCC pwd
/var/mobile/Library/TCC

➜  TCC sqlite3 TCC.db
SQLite version 3.8.10.2
Enter ".help" for instructions
sqlite>  delete from access where client="PackageName";

➜  launchctl unload -w /System/Library/LaunchDaemons/com.apple.tccd.plist
➜  launchctl load -w /System/Library/LaunchDaemons/com.apple.tccd.plist

定位权限文件:/private/var/root/Library/Caches/locationd/clients.plist

1 个赞

我也是找到TCC的数据库了,但是删除后没生效,原来是少了重启tccd进程这一步 :heart_eyes:

1 个赞

确实,清空TCC后推送和位置权限没有重新申请

do_TCCAccessResetInternal 如何调用呢?

1 个赞

你需要注入tccd的进程,(有ent要求大概),函数在导出表里,三个参数;
第一个可以用+[TCCDService serviceAll]的返回值,顾名思义这个是指全部权限,同一个类里有其他权限的名字,
第二个是包名(忘了是C字符串还是OC字符串了),
第三个参数是个数字,含义是操作类型,填0就行。

1 个赞

我在github上搜到个这个

1 个赞

这个是对前面那个的包装,里面是按照xpc消息处理了一下