App开发轮子--系统授权相关

1.permission_handler,请求系统的所有权限

  1. app_settings:, 跳转到app授权界面 They are caused a new issue that flutter app could not determiner the correct localization strings
    ## 授权实现方式
  2. 集中在某个页面授权
  3. 共享授权信息的storage
  4. 前后台切换重新获取授权(用户在设置修改)
  5. 某个页面需要依赖多个授权,需要建立依赖关系串行执行每个授权步骤

    • 下面是其中一种实现方式: 通过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;
    }
posted @ 2020-10-15 00:34  阿甘左  阅读(172)  评论(0编辑  收藏  举报