UIActivityViewController로 컨텐츠 공유하기

고라니·2023년 9월 13일
0

TIL

목록 보기
33/67

공식문서를 확인해보면 "A view controller that you use to offer standard services from your app." 라고 한다. 앱에서 기본 서비스를 제공하기 위해 사용하는 뷰컨트롤러? 아마 이 설명만으로는 이해가 되지 않을것이다. 하지만 우리가 아주 많이 사용하는 공유 기능과 관련된 뷰 이기 때문에 이미지만 봐도 UIActivityViewController가 무엇인지 알 수 있다.

UIActivityViewController?

UIActivityViewController는 사용자에게 컨텐츠(텍스트, 이미지, 링크 등)를 공유하거나 다양한 작업(이메일 보내기, 메시지 보내기, 인쇄, 소셜 미디어 게시 등)을 수행할 수 있는 인터페이스를 제공한다. 이를 통해 컨텐츠를 쉽게 공유할 수 있다.


초기화

init(activityItems:applicationActivities:)

공유하려는 항목과 함께 UIActivityViewController를 생성, 선택적으로 사용자 정의 액션도 추가 가능

  1. activityItems: any

    • 공유하거나 다른 액션을 적용하려는 데이터의 항목들의 배열. 이 배열 안에는 문자열, 이미지, URL 등 다양한 타입의 객체가 포함될 수 있음
    • ex) 텍스트와 이미지를 함께 공유하려면 둘 다 이 배열에 포함시켜야 한다.
  2. applicationActivities: UIActivity?

    • 사용자가 정의한 커스텀 액션들의 배열이다. 이 배열은 UIActivity의 서브클래스 인스턴스들오 구성되어 있다.
    • 이 파라미터는 선택적이므로 nil을 전달할 수 있다. nil이면 기본적으로 제공하는 액션만을 사용자에게 보여준다.
    • 만약 사용자 정의 액션을 제공하려면, 해당 액션을 구현한 UIActivity 서브클래스의 인스턴스들을 이 배열에 포함시켜야 한다.

init(activityItemsConfiguration:)

iOS 14.0 부터 UIActivityViewController에는 새로운 초기화 메서드 도입. 더 유연한 방식으로 공유 항목을 제공하거나 조작할 수 있음
activityItemsConfiguration
UIActivityItemconfiguration 는 프로토콜이며, 이를 구현한 객체를 사용하여 공유 항목, 제목, 미리보기 이미지 등을 동적으로 구성할 수 있다. 그러므로 특정 상황에 따른 다른 공유 항목을 제공하거나 공유 항목을 실시간으로 생성하고자 할 때 이 초기화 메서드가 유용하다.


액티비티 유형(Activity Type)

UIActivityViewController의 activityItems 배열에는 공유하거나 작업할 컨텐츠 데이터를 포함한다.
이 데이터 형식을 분석하여 사용 가능한 엑티비티 유형을 결정하고 사용자에게 제공한다.
ex) 문자열은 메시지 보내기 액티비티 사용, 이미지는 이미지 공유 액티비티 사용

액티비티 유형은 iOS에서 미리 정의된 상수를 사용하여 나타낸단. 일반적으로는 다음과 같은 것들이 있다.
Facebook에 게시하기, Twitter에 게시하기, 메시지 보내기, 이메일 보내기, 인쇄하기 등


특정 액티비티 유형 제외

위에서 컨텐츠 데이터 타입에 맞는 기본 액티비티 유형을 제공하기 때문에 개발자가 직접 지정해 줄 필요가 없는 경우가 많다. 하지만 특정 액티비티 유형을 제외하고 싶다면 excludedActivityType 속성을 사용하여 제외할 수 있다.


UIActivity

기본 제공하는 유형만으로 충분한 경우가 많지만 UIActivity 하위 클래스를 작성하여 특정 사용자 정의 액티비티 동작을 정의할 수 있다.

  1. UIActivity 하위 클래스 작성: 다음과 같은 메서드를 구현해야 한다.

    • activityType: 액티비티 유형을 정의하는 메서드. 액티비티를 식별하는데 사용.
    • activityTitle: 액티비티가 나타날 때 표시되는 제목을 반환하는 메서드
    • activityImage: 액티비티가 나타날 때 표시되는 이미지를 반환하는 메서드
    • canPerform(withActivityItems:): 액티비티가 주어진 컨텐츠 아이템을 처리할 수 있는지 여부를 확인하는 메서드 (만약 문자열만 처리하고 싶다면 액티비티 아이템이 문자열인지 확인후 맞다면 true반환, 아니라면 false 반환하면 된다.)
    • prepare(withActivityItems:): 액티비티가 실제 작업을 수행하기 전에 필요한 설정을 수행하는 메서드
    • perform(): 실제 액티비티 작업을 수행하는 메서드
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() {
        // 사용자 정의 작업을 수행하는 코드를 여기에 작성
    }
}
  1. UIActivityViewController에 추가: 사용자 정의 액티비티를 액티비티컨트롤러에 추가해야 한다. (액티비티컨트롤러 초기화 할 때)
// 위의 방법대로 작성한 UIActivity의 하위클래스인 MyCustomActivity의 인스턴스 생성.
let customActivity = MyCustomactivity()

// 액티비티뷰컨트롤러 초기화 할 때 applicationActivities에 MyCustomActivity의 인스턴스 할당
let activityViewController = UIAcitivyViewController(activityItems: [textToShare, imageToShare], applicationActivities: [customActivity]) 

사용하기

간단한 방법으로 UIActivityController를 사용해보자.

  1. 초기화
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)
  1. 기본 제공 서비스 중 사용하지 않을 서비스 선택(필수 아님)
activityViewController.excludedActivityType = [UIAcivityType.addToReadingList, UIActivityType.assignContact]
  1. 컨트롤러 나타내기(present)
present(activityViewController, animated: true, completion: nil)

마치면서

UIActivityViewController를 사용하면 간단한 방법으로 공유 기능을 구현할 수 있다. 특히 기존에 이미 많은 유형들이 구현되어 있어서 일반적인 경우에 번거롭게 유형을 새롭게 만들 일이 많이 없을 듯 하다.

profile
🍎 무럭무럭

0개의 댓글