App開發輪子--系統授權相關
阿新 • • 發佈:2020-10-15
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;
}