1. 程式人生 > 實用技巧 >App開發輪子--系統授權相關

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;
    }