기본적으로 내 앱에서 Share를 하게 되면 다른 앱들이 만들어 놓은 Share extension이 알아서 뜨게 된다. 그 중에 특정 앱은 띄우지 않도록 하고 싶다면, exclude 할 수 있다.

let activityViewController = UIActivityViewController(
  activityItems: activityItems,
  applicationActivities: applicationActivities
)

activityViewController.excludedActivityTypes = [
  .print,
  .addToReadingList,
  .saveToCameraRoll,
  .openInIBooks,
  .postToTwitter,
  .postToFacebook,
  .init(rawValue: "com.someCompany.SomeApp.Share")
]

uiViewController.present(activityViewController, animated: true)

activityViewController.completionWithItemsHandler = { (activity, success, info, error) in
  // handle when share is compltede
}

excludedActivityTypes 에 UIActivity.ActivityType을 넣어주면 제외됨

애플에서 제외할 수 있도록 enum case를 제공하는 앱은 제외가 잘 되었음(위의 twitter, facebook)

enum case에 없더라도, 다른 앱의 share extension bundleId를 넣어서 ActivityType을 생성할 수 있을 것 같은데, 일단 다른 앱의 share extension bundleId를 알기가 쉽지 않음. 메인앱 bundleId까지는 어찌어찌 알수 있어서 넣어봤지만 제외되지 않음

share extension bundleId 넣어서 시험해볼 필요가 있음

참조

https://openradar.appspot.com/radar?id=6078718283874304

https://johnszumski.com/blog/excluding-third-party-apps-from-ios-8-share-sheet

https://stackoverflow.com/questions/31792506/how-to-exclude-notes-and-reminders-apps-from-the-uiactivityviewcontroller