모바일 앱을 개발하다 보면 앱을 재실행 시키거나 코드에 의한 종료를 해야하는 경우가 발생합니다.
예를 들어서 앱의 전반에 걸쳐서 영향을 끼치는 설정을 초기화하고 새로 로딩해야 하는 경우가 있습니다. 이런 경우에는 해당 설정값만 다시 로딩하는 방법도 있겠지만, 이 값이 여러곳에 영향을 끼친다던가 초기화 해야하는 값들이 많다던가 하면 머리가 아파지고, 앱을 재시작 시켜서 자연스럽게 설정값을 읽어들지게 하는게 자연스러울 수 있습니다.
그런데, iOS와 안드로이드 모바일 환경에서는 코드에 의해서 앱을 재실행 시키거나, 종료 시키는 것에 대해서는 권장하지 않으며, iOS의 경우에는 이런 기능이 들어가면 앱 스토어 심사 단계에서 거부될 수 있습니다. 그래도 좋은 사용자 경험을 위해서 앱의 종료나 재시작이 꼭 필요한 경우에는 구현을 하는게 좋습니다.
앱 재시작
설정 초기화 후 앱을 재로딩이 필요한 경우라면 앱이 자동으로 재시작 되는 것이 앱이 종료되는 것 보다는 더 좋은 사용자 경험을 제공합니다. 그런데 iOS에서는 앱을 재시작 시킬 수 있는 방법을 찾지 못해서 안드로이드에서 재실행 시키는 방법만 정리하도록 하겠습니다.
flutter 에서 제공하는 기능만으로 앱을 재시작 시키는 방법은 아직 찾지 못했고, 메소드 채널을 이용하여 네이티브 코드로 구현하셔야 합니다.
PackageManager packageManager = getPackageManager();
Intent intent = packageManager.getLaunchIntentForPackage(getPackageName());
ComponentName componentName = intent.getComponent();
Intent mainIntent = Intent.makeRestartActivityTask(componentName);
startActivity(mainIntent);
System.exit(0);
참고 : https://ideajini.tistory.com/7
앱 종료
윈도우 환경과 같은 경우에서 앱을 종료하고자 하는 경우에는 exit() 함수를 이용하여 깔끔한 방법은 아닐 수 있으나 쉽게 앱을 종료할 수 있습니다. 참고로 exit() 함수는 안드로이드/iOS 환경에서도 동작을 하고 flutter에서도 exit() 함수를 지원합니다. 다만 디버그 환경과 같이 제한적인 경우에만 사용하라고 권장되고 있습니다.
flutter에서 제공하는 기능만으로 앱을 재실행 시킬수는 없고(제가 모를 가능성도 높습니다.), 앱 종료시키는 방법은 일반적으로 다음과 같이 사용하라 검색됩니다.
SystemNavigator.pop();
exit(0);
위 코드에서 SystemNavigator.pop() 는 최상위 flutter 인스턴스를 제거한다고 되어 있습니다. iOS에서는 root view controller의 popViewControllerAnimated: 또는 dismissViewControllerAnivated:completeion: 메서드를 호출하고 안드로이드에서는 activity를 스택에서 제거한다고 되어 있습니다. 실제 동작시켜 보면 iOS에서는 SystemNavigator.pop() 함수가 겉으로 보이는 효과는 없고 exit() 함수에 의해서 프로세스가 종료되고, 안드로이드에서는 SystemNavigator.pop() 함수에 의해서 앱이 스택에서 제거되는 것 처럼 보이고, exit() 함수에 의해서 프로세스가 종료됩니다.
그런데, iOS에서는 이 코드를 사용하면 앱을 종료를 시킬 수는 있으나, 심사 과정을 통과하지 못할 가능성이 높습니다. 그래서 앱 심사를 통과할 수 있게 좀 더 자연스럽게 앱이 홈으로 전환되는 것 처럼 보이게 하는 방법으로 앱 심사를 통과한 경험을 공유한 코드를 찾아서 활용합니다. (그런데, 이건 앱 심사하는 사람의 취향으로 심사를 통과했거나 심사 과정에서 해당 기능이 테스트 되지 않았을 수도 있습니다.)
다음 코드는 iOS에서 앱을 종료하는 코드입니다. 역시 메소드 채널을 통해서 네이티브 코드를 실행해야 합니다.
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
exit(0)
}
참고: https://stackoverflow.com/a/52515554
앱을 자연스럽게 홈으로 전환시키고, 앱이 백그라운드에 있는 상태에서 앱을 종료시키는 코드입니다. 사용자가 보기에는 홈버튼을 눌러서 홈으로 화면 전환하는 것과 같이 동작합니다.
사용자에게 좋은 사용 환경은 앱의 재시작이나 종료가 발생하지 않는 것이긴 합니다만, 부득이 필요하다면 위와 같은 방법을 적용하시면 되겠습니다. 혹시나 잘못된 내용이 있거나, 보완할 부분이 있으면 댓글을 남겨주시면 감사하겠습니다.
댓글
댓글 쓰기