여태까지 문제가 없다가 갑자기 왜?
iOS 애플리케이션에서 파일 다운로드 후 해당 파일이 3rd-party app으로 공유되지 않는 이슈가 리포트됐습니다.
이를 수정하기 위해 처음 리포트됐을 때는 확인하다가 큰 문제가 아니라고 생각하고 할일에만 넣어두고 보지 않았죠.
그러다 점점 문의가 쌓이고, 도저히 가만 놔둘 수 없겠다. 하는 생각이 들어 수정을 결심했습니다.
하지만 아무리 AI에게 물어봐도 해결되지 않고, 구글링을 해도 동일한 케이스의 문서가 없어서 골머리를 앓았습니다.
문제점
파일 다운로드를 할 때, 추가적인 패키지를 쓰고싶지 않아 dio 패키지의 download 메서드를 사용하여 파일을 직접 Write 했습니다.
제 생각에는 이 동작이, 시스템에서 수행하는 다운로드가 아닌 앱에서 자체 write를 하여 iOS의 샌드박스로 인한 문제점으로 생각했습니다.
또한 AI도 그렇게 말해줬죠. (할루시네이션일까?는 내가 모바일 Native 개발자는 아니라 어렵네요.)
해결 방안
파일 다운로드 로직을 dio에서 background_downloader로 변경 후, open_filex 패키지도 제거하였습니다.
// 다운로드 Task 생성
final task = DownloadTask(
requiresWiFi: false,
url: url,
filename: fileName,
headers: Http.headers,
updates: Updates.statusAndProgress,
);
// 다운로드 수행 (혹은 enqueue로 변경해도 무방)
await FileDownloader().download(
task,
onProgress: (progress) => setDownloadPercent(progress * 100),
onStatus: (status) => _handleStatus(status, task),
);
Future<void> _handleStatus(TaskStatus status, DownloadTask task) async {
switch (status) {
case TaskStatus.enqueued:
showProgress();
case TaskStatus.complete:
if (Platform.isAndroid) {
final newFilepath = await FileDownloader().moveToSharedStorage(task, SharedStorage.downloads);
await FileDownloader().openFile(filePath: newFilepath);
} else {
await FileDownloader().openFile(task: task);
}
hideProgress();
case TaskStatus.failed:
// 다운로드 실패시 알림
AlertUtils.createAlert(title: tr('download.failure'), message: task.filename, onTap: null);
hideProgress();
case TaskStatus.notFound:
case TaskStatus.canceled:
case TaskStatus.running:
case TaskStatus.waitingToRetry:
case TaskStatus.paused:
break;
}
}
위와 같이 변경 범위도 간단하고, 사용법도 간단했습니다.
거기에 테스트를 해보니 문제가 해결되었습니다.
부디 나와 같은 케이스의 개발자가 없기를 바랍니다.
'개발 > Flutter' 카테고리의 다른 글
플러터 웹뷰에서 물리 키보드 방향키가 동작하지 않는다. (0) | 2024.02.06 |
---|---|
플러터에서 CocoaPods 라이브러리 최신화하기 (0) | 2023.12.13 |
Flutter에서 Google Spreadsheet에 데이터를 추가해보자. (0) | 2023.10.19 |
다국어 처리를 통해 Flutter 앱 이름을 언어에 맞게 설정해보자. (0) | 2023.09.14 |
Flutter Transition에 대해 한눈에 알아보자. (0) | 2023.08.30 |
댓글