App开发轮子--系统授权相关
1.permission_handler,请求系统的所有权限
- app_settings:, 跳转到app授权界面
They are caused a new issue that flutter app could not determiner the correct localization strings
## 授权实现方式 - 集中在某个页面授权
- 共享授权信息的storage
- 前后台切换重新获取授权(用户在设置修改)
某个页面需要依赖多个授权,需要建立依赖关系串行执行每个授权步骤
下面是其中一种实现方式: 通过requestQueue.count来控制会调
for (int i = 0; i < permissions.count; ++i) { PermissionGroup value;
[permissions[i] getValue:&value];
PermissionGroup permission = value;
id <PermissionStrategy> permissionStrategy = [PermissionManager createPermissionStrategy:permission];
[_strategyInstances addObject:permissionStrategy];
[permissionStrategy requestPermission:permission completionHandler:^(PermissionStatus permissionStatus) {
permissionStatusResult[@(permission)] = @(permissionStatus);
[requestQueue removeObject:@(permission)];
[self->_strategyInstances removeObject:permissionStrategy];
if (requestQueue.count == 0) {
completion(permissionStatusResult);
return;
}
}];
}
特别注意,在flutter工程中,授权弹框有一定的几率终端flutter的widget layout过程,可以将需要的授权集中起来在一个页面单独管理,或者推迟到widget构建第一帧完成之后。
授权框架实现
- 整体采用了策略模式,对各种权限进行统一的行为定制,采用统一的策略进行管理
- 局限性: 部分status的状态差异化无法很好的区分,比如iOS的location定位,安卓部分机型照片权限的读写权限区分,有一定的捆绑关系在里面
Issues记录
1. iOS Location权限问题
- iOS授权有一个单次定位,另外授权状态个数多余系统定义的base授权状态
- permission_handler中针对于iOS location的授权状态有并列case,在代码中需要有先检查
kCLAuthorizationStatusAuthorizedWhenInUse
,如果是whenInUse
状态则后面的always
检查成功的结果需要忽略Objective-C switch (authorizationStatus) {
case kCLAuthorizationStatusNotDetermined:
return PermissionStatusUnknown;
case kCLAuthorizationStatusRestricted:
return PermissionStatusRestricted;
case kCLAuthorizationStatusDenied:
return PermissionStatusDenied;
case kCLAuthorizationStatusAuthorizedAlways:
case kCLAuthorizationStatusAuthorizedWhenInUse:
return PermissionStatusGranted;
}