앱을 개발하면서 많은 경우 앱 스토어에 등록하지 않고 APK 파일로 배포하는 상황이 발생할 수 있습니다. 예를 들어, 사내 테스트 앱이거나 앱 스토어 검수를 기다릴 필요 없이 사용자들에게 빠르게 업데이트를 배포해야 하는 경우가 그렇죠. 하지만 앱 스토어에 의존하지 않고 APK 파일로 직접 배포할 때, 자동 업데이트 기능을 어떻게 구현해야 할까요?
이 글에서는 APK 파일로 배포하는 플러터 앱에서 자동 업데이트 기능을 구현하는 방법을 단계별로 설명해 드리겠습니다.
1. 서버에서 최신 버전 정보 제공
첫 번째로 필요한 것은 최신 버전 정보를 제공할 서버입니다. 앱이 실행될 때마다 서버로부터 최신 버전 정보를 가져와서 현재 버전과 비교할 수 있도록 해야 합니다. 이를 위해 서버에서 최신 버전 번호와 APK 다운로드 링크를 제공하는 JSON 파일을 만들어 배포할 수 있습니다.
{
"version": "1.2.3",
"apkUrl": "https://yourserver.com/path-to-latest-apk.apk"
}
위와 같은 형식으로 서버에서 최신 버전 정보를 제공할 수 있습니다. version
필드는 최신 버전 번호를, apkUrl
필드는 사용자가 다운로드할 APK 파일의 링크를 담고 있습니다.
2. 현재 앱 버전과 최신 버전 비교하기
플러터 앱이 실행될 때, 현재 설치된 버전과 서버에서 제공하는 최신 버전 정보를 비교해야 합니다. 이를 위해 플러터에서 package_info_plus
패키지를 사용하여 현재 앱의 버전 정보를 가져올 수 있습니다.
다음은 서버에서 최신 버전 정보를 가져와 비교하는 코드입니다:
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:package_info_plus/package_info_plus.dart';
Future<void> checkForUpdate() async {
// 서버에서 최신 버전 정보 가져오기
final response = await http.get(Uri.parse('https://yourserver.com/version.json'));
if (response.statusCode == 200) {
final data = jsonDecode(response.body);
String latestVersion = data['version'];
String apkUrl = data['apkUrl'];
// 현재 앱 버전 가져오기
PackageInfo packageInfo = await PackageInfo.fromPlatform();
String currentVersion = packageInfo.version;
// 버전 비교
if (latestVersion.compareTo(currentVersion) > 0) {
// 업데이트 필요
_promptUpdate(apkUrl);
}
}
}
위 코드는 서버에서 제공하는 최신 버전과 현재 앱 버전을 비교하여 최신 버전이 있을 경우, 업데이트를 진행하는 코드를 호출합니다.
3. APK 다운로드 및 설치 안내
최신 버전이 존재하면 사용자가 새로운 APK 파일을 다운로드할 수 있도록 안내해야 합니다. 이를 위해 url_launcher
패키지를 사용하여 브라우저에서 APK 다운로드 링크를 열어 사용자에게 안내할 수 있습니다.
import 'package:url_launcher/url_launcher.dart';
void _promptUpdate(String apkUrl) async {
if (await canLaunch(apkUrl)) {
await launch(apkUrl);
} else {
throw 'Could not launch $apkUrl';
}
}
사용자가 앱을 열면 업데이트 알림을 띄우고, 새로운 APK 파일을 브라우저에서 열어 다운로드 및 설치하도록 유도합니다. 이는 사용자가 안전하게 APK를 다운로드하고 설치할 수 있는 방법입니다.
4. 권한 및 보안 설정
앱 외부에서 APK를 설치할 때 Android에서는 추가적인 보안 권한을 요구합니다. Android 8.0(Oreo) 이상에서는 사용자가 직접 설정에서 "알 수 없는 출처" 앱 설치를 허용해야 합니다. 따라서 앱 내에서 권한을 요청하거나 사용자가 직접 설정을 통해 권한을 변경할 수 있도록 안내해야 합니다.
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
위와 같은 권한을 AndroidManifest에 추가하여 앱이 설치 권한을 요청할 수 있게 합니다.
5. 사용자 경험 개선
업데이트를 진행할 때 중요한 것은 사용자의 경험(UX)을 고려하는 것입니다. 단순히 업데이트 알림을 띄우는 것보다 사용자가 업데이트를 수락하거나 나중에 하도록 선택할 수 있는 기능을 제공하면 더 나은 사용자 경험을 제공합니다.
팝업을 띄워 업데이트를 할지, 나중에 할지 선택할 수 있는 UI를 제공할 수 있습니다. 예를 들어, 사용자가 앱을 열었을 때 업데이트 알림을 주고, '지금 업데이트', '나중에 업데이트'와 같은 선택지를 줄 수 있습니다.
결론
플러터 앱에서 APK 파일로 배포하는 경우에도 자동 업데이트 기능을 구현하는 것은 충분히 가능합니다. 서버에서 최신 버전 정보를 제공하고, 앱에서 현재 버전과 비교하여 APK를 다운로드하도록 안내하는 방식으로 손쉽게 구현할 수 있습니다.
이 방법을 사용하면 앱 스토어에 의존하지 않고도 최신 버전을 사용자에게 제공할 수 있으며, 업데이트 과정에서 발생하는 번거로움도 최소화할 수 있습니다. 지속적으로 업데이트가 필요한 앱이라면 이런 방식의 자동 업데이트 시스템을 꼭 고려해 보세요!