아이패치 스캔 기록 관리에 관련된 여러 기능 구현을 위해 핸드폰 기기 저장소에 대한 이해가 필요했다.
먼저 Flutter의 sqflite 라이브러리의 getDatabasePath() 함수를 통해 얻어오는 경로는 다음과 같다.
Android에는 내부 저장소와 외부 저장소가 존재한다.
Android의 경우 sqflite 라이브러리를 통해 저장한 기기 스캔 기록 테이블이 저장되어 있는 경로인 data/data/<package_name>는 내부 저장소에 해당한다. 때문에 사용자는 이 파일에 접근할 수 없다. 그래서 이를 다른 파일로 추출하여(CSV 파일) 외부에서 접근 가능한 외부 저장소에 저장하는 단계가 필요했다. (또한 전체 기록 테이블에서 사용자가 원하는 시간대의 부분 기록만 추출할 수 있는 기능도 필요했기 때문에 이 방법을 생각했다.)
iOS의 경우 App Sandbox라는 개념이 존재한다.
SandBox는 Bundle Container, Data Container, iCloud Container로 구성되는데 이 중 내가 살펴봐야 할 것은 앱의 데이터를 저장하는 Data Container이다. 이는 다음과 같이 구성되어 있다.
Documents 디렉토리에 CSV 파일을 저장하면 기기 스캔 기록을 외부에서 접근 가능하기 때문에 여기에 저장하도록 했다. (path_provider 라이브러리 사용하여 Documents 디렉토리의 경로를 가져올 수 있음.)
Android, iOS 저장소 접근 코드는 다음과 같다.
String path = '';
if (Platform.isAndroid) {
// 외부저장소의 다운로드 폴더로 경로 설정
path = await ExternalPath.getExternalStoragePublicDirectory(ExternalPath.DIRECTORY_DOWNLOADS);
}
else if (Platform.isIOS) {
// Documents 폴더로 경로 설정
Directory directory = await getApplicationDocumentsDirectory();
path = await getApplicationDocumentsDirectory().path;
}
// 해당 path에 디렉토리 생성
final directory = Directory("$path/EyePatch");
// * 권한 허용 필수
var status = await Permission.manageExternalStorage.status;
if (!status.isGranted) {
await Permission.manageExternalStorage.request();
}
if ((await directory.exists())) {
print("존재하는 디렉토리입니다.");
} else {
directory.create();
print('새로운 디렉토리를 하나 생성합니다.');
}
이렇게 외부 저장공간에 파일이나 폴더를 생성할 때에는 반드시 권한 허용을 해줘야 한다. permission_handler를 통해서 외부 저장공간 접근 허용을 해주었다.