공식문서를 확인해보면 "A view controller that you use to offer standard services from your app." 라고 한다. 앱에서 기본 서비스를 제공하기 위해 사용하는 뷰컨트롤러? 아마 이 설명만으로는 이해가 되지 않을것이다. 하지만 우리가 아주 많이 사용하는 공유 기능과 관련된 뷰 이기 때문에 이미지만 봐도 UIActivityViewController가 무엇인지 알 수 있다.
UIActivityViewController는 사용자에게 컨텐츠(텍스트, 이미지, 링크 등)를 공유하거나 다양한 작업(이메일 보내기, 메시지 보내기, 인쇄, 소셜 미디어 게시 등)을 수행할 수 있는 인터페이스를 제공한다. 이를 통해 컨텐츠를 쉽게 공유할 수 있다.
공유하려는 항목과 함께 UIActivityViewController를 생성, 선택적으로 사용자 정의 액션도 추가 가능
activityItems: any
applicationActivities: UIActivity?
iOS 14.0 부터 UIActivityViewController에는 새로운 초기화 메서드 도입. 더 유연한 방식으로 공유 항목을 제공하거나 조작할 수 있음
activityItemsConfiguration
UIActivityItemconfiguration 는 프로토콜이며, 이를 구현한 객체를 사용하여 공유 항목, 제목, 미리보기 이미지 등을 동적으로 구성할 수 있다. 그러므로 특정 상황에 따른 다른 공유 항목을 제공하거나 공유 항목을 실시간으로 생성하고자 할 때 이 초기화 메서드가 유용하다.
UIActivityViewController의 activityItems 배열에는 공유하거나 작업할 컨텐츠 데이터를 포함한다.
이 데이터 형식을 분석하여 사용 가능한 엑티비티 유형을 결정하고 사용자에게 제공한다.
ex) 문자열은 메시지 보내기 액티비티 사용, 이미지는 이미지 공유 액티비티 사용
액티비티 유형은 iOS에서 미리 정의된 상수를 사용하여 나타낸단. 일반적으로는 다음과 같은 것들이 있다.
Facebook에 게시하기, Twitter에 게시하기, 메시지 보내기, 이메일 보내기, 인쇄하기 등
위에서 컨텐츠 데이터 타입에 맞는 기본 액티비티 유형을 제공하기 때문에 개발자가 직접 지정해 줄 필요가 없는 경우가 많다. 하지만 특정 액티비티 유형을 제외하고 싶다면 excludedActivityType 속성을 사용하여 제외할 수 있다.
기본 제공하는 유형만으로 충분한 경우가 많지만 UIActivity 하위 클래스를 작성하여 특정 사용자 정의 액티비티 동작을 정의할 수 있다.
UIActivity 하위 클래스 작성: 다음과 같은 메서드를 구현해야 한다.
class MyCustomActivity: UIActivity {
// 사용자 정의 액티비티의 유형을 정의
override var activityType: UIActivity.ActivityType? {
return UIActivity.ActivityType("com.example.myapp.customactivity")
}
// 사용자 정의 액티비티의 제목을 정의합니다.
override var activityTitle: String? {
return "내 앱의 커스텀 액티비티"
}
// 사용자 정의 액티비티의 아이콘 이미지를 정의
override var activityImage: UIImage? {
return UIImage(named: "custom_activity_icon")
}
// 사용자 정의 액티비티가 주어진 컨텐츠 아이템을 처리할 수 있는지 확인
override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
// 처리 가능 여부를 확인하는 로직을 여기에 작성
return true
}
// 사용자 정의 액티비티가 실제 작업을 수행하기 전에 필요한 설정을 수행
override func prepare(withActivityItems activityItems: [Any]) {
// 작업을 수행하기 전에 필요한 설정을 여기에 작성
}
// 사용자 정의 액티비티의 실제 작업을 수행
override func perform() {
// 사용자 정의 작업을 수행하는 코드를 여기에 작성
}
}
// 위의 방법대로 작성한 UIActivity의 하위클래스인 MyCustomActivity의 인스턴스 생성.
let customActivity = MyCustomactivity()
// 액티비티뷰컨트롤러 초기화 할 때 applicationActivities에 MyCustomActivity의 인스턴스 할당
let activityViewController = UIAcitivyViewController(activityItems: [textToShare, imageToShare], applicationActivities: [customActivity])
간단한 방법으로 UIActivityController를 사용해보자.
let imageToShare: Image = UIImage(name: "imageName")
let urlToShare: String = "https://velog.io/@go90js"
let textToShare: String = "고라니"
let activityViewController = UIActivityViewController(activityItems: [imageToShare, urlToShare, textToShare], applicationActivities: nil)
activityViewController.excludedActivityType = [UIAcivityType.addToReadingList, UIActivityType.assignContact]
present(activityViewController, animated: true, completion: nil)
UIActivityViewController를 사용하면 간단한 방법으로 공유 기능을 구현할 수 있다. 특히 기존에 이미 많은 유형들이 구현되어 있어서 일반적인 경우에 번거롭게 유형을 새롭게 만들 일이 많이 없을 듯 하다.