[iOS] WebView 백그라운드 시 앱 새로고침 이슈

2025. 1. 25. 21:18iOS

반응형

카드사 앱에서 결제를 완료한 후 앱이 처음부터 재시작되는 문제는 앱의 상태 관리iOS의 메모리 관리 정책 또는 딥 링크 처리 방식과 관련이 있을 가능성이 높습니다. 아래에서 주요 원인과 해결 방안을 설명하겠습니다.


1. 앱의 프로세스가 종료되는 경우

iOS는 백그라운드에서 실행 중인 앱을 일정 시간 동안만 유지하며, 메모리가 부족하거나 시스템 리소스가 필요할 경우 앱을 종료시킬 수 있습니다. 카드 앱으로 전환 중 이런 상황이 발생할 수 있습니다.

원인

  • 카드사 앱 실행 시, iOS가 메모리를 확보하기 위해 웹뷰를 열어둔 앱을 종료.
  • 앱이 Background Execution을 지원하지 않는 경우.
  • 앱이 오래 백그라운드에 있거나 다른 작업을 수행해 메모리 부족 상황이 발생.

해결 방법

  1. 앱 상태 복원(UIApplicationRestoration)
    • iOS의 state restoration 기능을 활용하면 앱 종료 후에도 이전 상태를 복원할 수 있습니다.
    • 앱이 종료되더라도, 사용자 경험을 이어갈 수 있도록 상태를 저장해야 합니다.

AppDelegate에서 상태 복원 활성화:

func application(_ application: UIApplication, shouldSaveApplicationState coder: NSCoder) -> Bool { 
	return true
}

func application(_ application: UIApplication, shouldRestoreApplicationState coder: NSCoder) -> Bool { 
	return true 
}

상태 저장 및 복원:

  • NSUserActivity 또는 UserDefaults를 사용하여 결제 화면의 상태를 저장하고 복원합니다.

2. 딥 링크 또는 Universal Link의 처리 문제

카드사 앱이 결제 후 앱을 호출할 때 URL을 통해 돌아옵니다. 이때 앱이 올바르게 동작하지 않고 재시작되는 경우, URL 처리 방식에서 문제가 있을 가능성이 있습니다.

원인

  • 딥 링크나 Universal Link가 앱을 실행할 때 새 세션을 생성.
  • SceneDelegate 또는 AppDelegate에서 URL 처리 코드가 누락되었거나 잘못 구현.

해결 방법

  1. URL 처리 로직 확인
    • 앱이 URL 호출을 처리하지 못하면 iOS가 새 인스턴스를 생성할 수 있습니다.
    • AppDelegate 또는 SceneDelegate에서 URL 처리 코드를 점검하세요.

AppDelegate 예시:

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { 
	// URL 처리 로직 
    if url.scheme == "myapp", url.host == "payment-complete" { 
    	// 결제 완료 처리 
        print("앱이 정상적으로 호출됨") 
        return true 
    }
    return false 
}
  1. Universal Link 충돌 방지
    • Universal Link를 사용하는 경우, 앱에서 제대로 등록되지 않으면 문제가 발생할 수 있습니다.
    • Associated Domains가 설정되었는지 확인하세요.

3. 웹뷰 세션 관리 문제

웹뷰에서 상태가 유지되지 않으면 앱이 재시작처럼 보일 수 있습니다.

원인

  • 카드사 앱을 거쳐 복귀 시 웹뷰의 세션이 만료.
  • 결제 페이지로 돌아가지 않고 앱의 기본 화면으로 이동.

해결 방법

  1. 결제 상태를 서버에서 확인
    • 복귀 후 웹뷰에서 상태를 확인하지 말고, 서버에서 결제 완료 상태를 확인해 처리.
    • returnUrl을 서버로 지정하고 앱은 복귀 시 상태를 다시 요청.
  2. 웹뷰 캐시 및 쿠키 유지
    • 웹뷰가 세션 정보를 잃지 않도록 WKWebViewConfiguration에서 쿠키 및 캐시를 유지.
let webViewConfig = WKWebViewConfiguration() 
webViewConfig.websiteDataStore = WKWebsiteDataStore.default() 
let webView = WKWebView(frame: .zero, configuration: webViewConfig)

4. Background Mode 미지원

앱이 백그라운드에서 실행될 수 없는 경우, 카드 앱 전환 중 앱이 종료될 수 있습니다.

해결 방법

  1. Background Modes 활성화
    • Xcode에서 프로젝트의 Capabilities > Background Modes에서 Background Fetch 또는 Background Processing을 활성화.
  2. 결제 관련 작업 연장
    • 결제 요청 시, UIApplication.shared.beginBackgroundTask를 사용해 백그라운드 실행 시간을 늘립니다.
var backgroundTask: UIBackgroundTaskIdentifier = .invalid 

func startBackgroundTask() { 
	backgroundTask = UIApplication.shared.beginBackgroundTask { 
    	UIApplication.shared.endBackgroundTask(self.backgroundTask) 
        self.backgroundTask = .invalid 
    }
}

func endBackgroundTask() { 
	UIApplication.shared.endBackgroundTask(backgroundTask) 
    backgroundTask = .invalid 
}

5. iOS 버그 또는 카드사 SDK 문제

  • iOS 특정 버전에서 발생하는 문제일 수 있습니다.
  • 카드사 SDK 또는 연동 방식이 잘못 구현된 경우도 있을 수 있습니다.

해결 방법

  • 최신 iOS 버전에서 동일한 문제가 재현되는지 확인.
  • 카드사와 협력해 딥 링크 호출 방식 또는 결제 연동 방식의 정확성을 확인.

결론

  1. 앱이 처음부터 재시작되는 현상은 주로 메모리 관리딥 링크 처리 문제로 발생합니다.
  2. 상태 복원 및 URL 처리 코드를 점검하세요.
  3. 카드사와의 연동 방식(딥 링크/Universal Link)을 확인하고, 서버와의 상태 확인을 통해 앱 상태를 유지하도록 구현하세요.
반응형