플랫폼 통신(IOS) - Method Channel
플랫폼 통신(Android) - Method Channel
이번 글에서는 앱을 강제 종료 시키는 방법에 대해서 알아 보도록 하겠다.
Flutter를 사용해서 강제 종료 시키는 방법과 네이티브에서 강제종료 시키는 방법에 대해서 살펴보면서, 어떤 차이점이 있는지 살펴볼 예정이다.
앱 강제 종료는 주로 Android에서 시스템 뒤로가기 키로 인해서 처리하는 경우가 많고 IOS에서는 주로 처리하지 않는 추세였다. 하지만 IOS에서도 요세 앱을 강제 종료 시켜버리는 추세로 변화하고 있다.
IOS는 Android 디바이스에 비해 메모리 용량이 크지 않아 시스템에 의해서 백그라운드 상태의 앱이 강제로 새로고침 되는 상황이 빈번하게 일어나고 있다. 이렇다 보니 서비스를 제공하는 앱의 원활한 사용을 위해 일정 시간이 지나면 백그라운드에서 앱을 강제 종료 시켜 다시 앱을 진입할 때에는 초기 실행 단계를 거치게 하는 경우가 많아졌다.
Flutter에서 강제 종료를 실행하는 방법에 대해서 알아보고, Flutter가 아닌 Native에서도 강제 종료를 실행하는 방법을 알아보도록 하겠다.
먼저 Flutter에서 앱을 강제 종료시키는 방법에 대해서 알아보자. Flutter에서는 간단한 코드로 앱을 강제 종료 시킬 수 있다.
exit(0);
SystemNavigator.pop();
이번에는 네이티브에서 앱을 강제 종료하는 방법에 대해서 살펴보기 위해, Flutter <> Native 간의 플랫폼 채널을 사용하도록 하겠다. 플랫폼 채널은 Method Channel을 사용하였고, Method Channel에 대해서는 위에 공유한 링크를 참고하면 된다.
플랫폼 채널을 위해 Method Channel을 등록해주고, 채널명을 넣어주면 된다.
MethodChannel _closedChannel = const MethodChannel("tyger/closed");
Method 채널의 콜 네임을 호출하여 네이티브를 호출해보자. 해당 함수가 호출되면 앱은 강제 종료 될 것이다.
await _closedChannel.invokeMethod("close");
Swift 코드에서도 FlutterMethodChannel을 등록하자.
let closedChannel = FlutterMethodChannel(name: "tyger/closed",
binaryMessenger: (window?.rootViewController as! FlutterViewController).binaryMessenger)
해당 채널의 핸들러를 사용하여 Call 네임이 호출됬을 때에, exit(0) 함수를 사용하여 앱을 강제 종료 시키면된다.
exit(0) 함수가 어디서 본 함수일 것이다. 바로 Flutter에서 IOS를 강제 종료 시키는 함수와 동일하다. 하지만 이렇게 종료시키면 마치 앱이 크래시가 발생한 것처럼 종료가 된다.
closedChannel.setMethodCallHandler({
[weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in
if(call.method == "close"){
result("System Exit !!")
exit(0)
}else{
result("Not Call Method !!")
}
백그라운드 프로세스에서 앱을 강제 종료시키는 거라면 크게 문제가 되지 않지만, 자연스럽게 종료를 하고 싶다면 다른 방법으로 앱을 종료시키도록 해보자. 앱을 서스펜드로 보내놓고 0.5초 후에 exit(0)르 호출하는 방법이다. 좀 더 자연스럽게 앱을 강제 종료 시킬 수 있다.
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
exit(0)
}
Kotlin에서도 MethodChannel을 등록하고, Call 네임이 호출되었을 때에 finish 함수를 실행시켜 주면 앱을 강제 종료 시킬 수 있다.
private val closedChannel = "tyger/closed"
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, closedChannel).setMethodCallHandler{
call, result ->
if(call.method == "close"){
result.success("System Finish !!")
finish()
}else{
result.success("Not Call Method !!")
}
}
Kotlin에서는 finish 외에도 강제 종료 시키는 방법이 여러가지 방법이 있다.
Activity.finishAffinity(this)
System.exit(0)
현재 작업 중인 쓰레드가 종료되면, 앱을 강제 종료하는 방법이다.
System.runFinalization()
간단하게 앱을 강제 종료하는 방법에 대해서 살펴보았다. 상황에 맞게 네이티브 플랫폼에서 처리하는 경우가 있다면 참고하면 좋을 것 같다.