UIPasteboard

jhk·2023년 3월 10일

Pasteboard

  • 앱 간에 데이터를 공유하기 위해 사용
  • 모든 앱이 공유 데이터에 액세스
  • 동일한 팀 ID를 가진 앱 사이에 공유가 필요한 경우 앱 그룹 구성
  • 일반적으로 사용자가 복사, 잘라내기, 복제 작업을 수행할 때 앱의 객체가 Pasteboard에 데이터를 작성함

iOS 14부터 사용자 의도 없이 다른 앱에서 생성된 Pasteboard 데이터를 수신할 때 마다 사용자에게 알리도록 변경되었다. 알림을 피하려면 특정 속성 및 메서드를 사용하여 임시보드 여부를 결정할 수 있다. 사용자에게 알림을 보내지 않고 조용하게 데이터를 처리할 수 있다.

시스템은 generic이라는 이름을 사용하여 모든 유형의 데이터를 공유하는데 사용할 수 있는 시스템 전반의 generic pasteboard를 식별한다. 이외에도 앱에서 동일한 팀 ID를 가진 다른 앱으로 데이터를 공유하기 위해 명명된 UIPasteboard를 만들 수 있다. (init(name:create:) 및 withUniqueName()을 사용)

UIPasteboard

해당 클래스는 pasteboard 항목을 읽고 쓰기 위한 메서드를 제공한다. 개별 pasteboard 혹은 한번에 여러개의 pasteboard 항목을 읽거나 쓸 수 있다. 데이터를 작성할 땐 3가지 방법중 하나를 사용할 수 있다.

  1. 데이터가 NSItemProbiderWriting을 준수하는 객체의 경우 -> setItemProviders(_:localOnly:expirationDate:)
  2. NSString, NSArray, NSDictionary, NSDate, NSNumber, UIImage, NSURL과 같은 공통 객체로 데이터를 나타낼 수 있는 경우 -> setData(_:forPasteboardType:)
  3. 데이터가 바이너리인 경우 -> setData(_:forPasteboardType:)

pastebaord에서 특정 데이터 유형을 읽기 전에 원하는 유형의 데이터가 있는지 확인해봐야 한다. UIPasteboard 클래스의 유형 검사 방법을 사용하여 이를 수행할 수 있다. 읽기전에 특정 유형의 데이터가 있는지 확인하면 오류를 방지하고 앱이 페이스트보드 데이터를 올바르게 처리하는지 확인할 수 있다.

hasString과 같은 UIPasteboard 클래스에서 제공하는 속성을 사용하여 문자열 데이터가 있는지 확인할 수 있다.

let pasteboard = UIPasteboard.general
if pasteboard.hasStrings {
    // Present string-data paste option to user
} else {
    // Do not present string-data paste option to user
}

사용자의 의도 없이 pasteboard의 데이터에 액세스할 때 사용자 알림을 트리거하지 않으려면 UIPasteboard 클래스에서 제공하는 특정 속성 및 메서드를 사용할 수 있다. 아래 속성과 메서드를 사용하면 불필요한 알림을 트리거하지 않고 필요한 경우에만 pasteboard 데이터에 액세스 할 수 있다.

  • numberOfItems: pasteboard 항목 수를 반환
  • types, types(forItemSet:): 사용할 수 있는 pasteboard 유형의 배열을 반환
  • itemSet(withPasteboardTypes:): 지정된 pasteboard 유형에 대해 사용할 수 있는 pasteboard 항목 집합을 반환
  • hasColors, hasImages, hasStrings, hasURLs: pasteboard에 지정된 유형의 항목이 포함되어 있는지 여부를 나타내는 부울 값을 반환
  • canLoadObject(ofClass:), canLoadObject(ofClass:): pasteboard에 지정된 클래스의 객체로 로드할 수 있는 데이터가 포함되어 있는지 여부를 나타내는 부울 값을 반환

Pasteboard items and representation types

  • pasteboard에 저장되는 객체는 key-value 값으로 저장
  • key 값은 representation type (혹은 pasteboard type)을 식별
  • UTI(Uniform Type Identifier)는 JPEG의 UTTypeJPEG와 같은 표현 유형의 키 역할
  • com.myCom.myApp.myType과 같은 고유성을 보장하기 위한 표현 유형을 지정할 수 있음

데이터 공유의 유연성을 제공하기 위해 복사 혹은 잘라내기 작업을 활용할 때 앱 내의 다양한 context에서 적절한 표시 유형을 사용할 수 있다. 예를 들어 사용자가 이미지를 복사하면 앱에서 PNG, JPEG, 및 GIF 데이터 형식과 같은 여러 표현 유형을 페이스트보드에 쓸 수 있다.

Sharing pasteboards between devices

사용자가 iCloud에 로그인하면 generic pasteboard 콘텐츠가 동일한 iCloud 계정을 사용하는 주변 기기로 자동 전송될 수 있다. 핸드오프 동작 및 항목 만료와 같은 옵션을 설정하여 generic pasteboard에 작성 할 때 이 동작을 제어할 수 있다.

  • setItemProviders(_:localOnly:expirationDate:): 이 메서드를 사용하여 NSItemProviderWriting 프로토콜을 준수하는 임시 보드 항목을 작성하고 필요에 따라 localOnly 및 expirationDate 매개 변수를 지정하여 Handoff 및 만료 동작을 제어
  • setObjects(_:localOnly:expirationDate:): 이 메서드를 사용하여 개체 리스트를 pasteboard에 쓰고 필요에 따라 localOnly 및 expirationDate 매개 변수를 지정
  • setItems(_:options:): 이 메서드를 사용하여 대지 항목의 배열을 작성하고 localOnly 및 expirationDate 옵션과 같은 옵션을 설정

임시 보드 항목의 만료 시간을 설정하려면 expriationDate 매개변수를 제공하거나 expriationDate 옵션과 함꼐 setItems(:option:)메서드를 사용하여 만료 시간에 도달하면 시스템이 pasteboard에서 항목을 자동으로 제거하도록 할 수 있다.

Using pasteboards with other objects

다음을 포함하여 다른 클래스 및 프로토콜을 활용하여 복사, 붙여넣기, 복제 작업을 사용할 수 있다.

  • UIEditMenuInteraction: 복사, 잘라내기, 붙여넣기, 선택 및 모두 선택과 같은 편집 작업이 포함된 메뉴를 표시
  • UIActivityItemsConfigurationReading: 이 프로토콜을 구현하는 개체는 데이터 복사 및 공유를 지원할 수 있음
  • UIPasteConfigurationSupporting: 이 프로토콜을 구현하는 개체는 특정 UIPasteConfiguration을 사용한 붙여넣기를 지원하는지 여부를 나타냄
  • UIResponder: 응답자는 canPerformAction(_:withSender:)을 구현하여 현재 컨텍스트에 따라 메뉴에서 명령을 활성화 또는 비활성화
  • UIResponderStandardEditActions: 응답자는 복사 및 붙여넣기와 같은 선택된 메뉴 명령을 처리하기 위해 이 비공식 프로토콜에 선언된 메서드를 구현
profile
Dart Night

0개의 댓글