구글에 “how to check first launching” 를 검색하면 다양한 플랫폼에서 앱의 첫 실행을 탐지하고 원하는 로직을 넣는 코드들을 볼 수 있습니다.
Flutter 에서는 친절한 설명글이 없어서... 어떤 상황에 이 로직이 필요한지, 어떻게 구현할 수 있는지 기록합니다.
Dependency
‘Shared_preferences’ pub 을 추가하고 설치합니다.
flutter pub add shared_preferences
flutter pub get
Bash
복사
Logic
main.dart
void main() async {
Constants.setEnvironment(Environment.STAGING);
WidgetsFlutterBinding.ensureInitialized();
initializeJsonMapper();
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
await firstLaunchingCheck(); 👈👈👈👈👈👈👈👈👈👈👈
runApp(App());
}
Future<void> firstLaunchingCheck() async {
final isAppLaunchedKey = 'LAUNCHED';
final prefs = await SharedPreferences.getInstance();
bool isFirstLaunching = !(prefs.getBool(isAppLaunchedKey) ?? false);
if (!isFirstLaunching) {
// 앱 첫 실행 시 수행되는 부분
await FirebaseAuth.instance.signOut();
}
prefs.setBool(isAppLaunchedKey, true);
}
Dart
복사
나는 왜 “FirebaseAuth.instance.singOut()” 을 앱 첫 실행시 수행하는가?
iOS의 Firebase SDK에서는 사용자 인증 정보를 Keychain에 저장합니다. Keychain 은 iOS 에서 제공하는 보안 저장소입니다. Keychain의 특징 중 하나는 생명주기가 앱과 다르다는 겁니다.
보통 iOS 는 앱마다 샌드박스라는 별도의 공간을 갖기 떄문에, 앱을 지우면 앱과 연관된 모든 정보가 사라집니다. 하지만 Keychain 은 앱에서 접근 가능하지만, 앱과는 분리된 공간에 저장됩니다. 단순히 앱을 지운다고 해서 사라지지 않습니다.
이 때문에 어떤 현상이 발생하는가.. 하면. 앱을 삭제 후 재설치했을때 자동으로 로그인 되어있는 경험을 해본적 있을겁니다. (당근마켓이 그러더라구요.)
keychain의 특성 상 앱을 새로 설치하더라도 인증정보가 남아있으니 자동로그인이 되어 있을 수 있지만, 사용자관점에서는 그닥 편리하지 않거나, 이런 특성을 몰라 해킹 위험이나, 보안적으로 취약하다고 느낄 수 있습니다.
그래서 앱을 재설치한 경우(= 앱 첫 실행시) signOut을 통해서 keychain 의 인증정보를 지우고 시작하도록 구성했습니다.