iOS UIResponder UIActivityViewController [UIActivityViewController] Dismiss Bug 해결

[UIActivityViewController] Dismiss Bug 해결

UIActivityViewController는 OS 공유화면으로 매우 널리 쓰인다.
String, Image 등 손쉽게 다른 앱에 컨텐츠를 공유할 수 있다.

일반적인 상황은 아래와 같이 사용이 가능하다.

let title: String
let image: UIImage
let activityViewController = UIActivityViewController(activityItems: [title, image], 
  applicationActivities: nil)
self.present(activityViewController, 
  animated: true, 
  completion: nil)

Image

문제의 상황

presentViewController에서 UIActivityViewController를 present 시, “이미지 저장” 등 특정 상황에서 UIActivityViewController 가 자동으로 닫히며 presnetViewController 도 같이 닫힌다. 닫기나 다른 앱에 공유하는 액션은 문제되지 않는다.

Image

아마 애플 버그 인듯?

해결

completionWithItemsHandler를 통해 완료 시점의 클로저를 제공해주는데 이를 활용해서 버그를 막을 수 있다. 코드는 아래와 같다.

let title: String
let image: UIImage
let activityViewController = UIActivityViewController(activityItems: [title, image], 
  applicationActivities: nil)

let tempViewController = UIViewController()
tempViewController.modalPresentationStyle = .overFullScreen
activityViewController.completionWithItemsHandler = { [weak tempViewController] _, _, _, _ in
  if let presentingViewController = tempViewController?.presentingViewController {
      presentingViewController.dismiss(animated: false, completion: nil)
  } else {
      tempViewController?.dismiss(animated: false, completion: nil)
  }
}

present(tempViewController, animated: false) { [weak tempController] in
  tempViewController?.present(activityViewController, 
    animated: true, 
    completion: nil)
}

presentViewController 가 같이 닫히는 문제는 해결할 수가 없다.
그럼 어떻게 처리할까?

우리에겐 꼼수라는 좋은 프로그래밍 방법이 있다.

버그 발생 시 버그로 닫히는 dummyViewController를 생성하고 버그 발생 시 dummyViewController가 대신 닫히도록 한다.

이거.. 생각보다 깔끔하게 처리된다.

댓글남기기