-
UIPasteboard를 통한 클립보드 사용하기iOS 2024. 5. 7. 18:49
안녕하세요. 그린입니다 🍏
이번 포스팅에서는 UIPasteboard에 대해 알아보고 해당 클래스를 사용해 실제 클립보드에 텍스트를 저장하고 외부 앱이나 어디서든 이 공유된 데이터를 사용해보는것을 학습해보겠습니다 🙋🏻
우선, 이전 포스팅에서 PasteButton 컴포넌트를 통해 현재 클립보드에 저장된 데이터를 붙여넣기 해보는것을 알아본적이 있어요.
이번에는 조금 더 나아가서, 꼭 이 버튼을 통한 동작이 아니더라도 현재 공유할 데이터를 클립보드에 저장하는 방식에 대해 알아봅니다!
UIPasteboard
UIPasteboard는 사용자가 앱 내의 한 위치에서 다른 위치로 혹은 다른 앱으로 데이터를 공유하는데 사용되는 클래스 객체입니다.
class UIPasteboard : NSObject
iOS 3 이상에서 지원되기에 사실상 UIKit이나 SwiftUI 어디서든 상관없이 사용할 수 있습니다.
Overview
다른 앱과 데이터를 공유할때 시스템 전체에 대해 이 Pasteboard를 사용할 수 있습니다.
일반적으로, 사용자 인터페이스에서 선택한 항목에 대해 복사하거나 잘라내기 혹은 복제 작업등을 요청할 때 앱이 이 Pasteboard의 데이터를 사용합니다.
사실 일반적으로는 사용자가 붙여넣기 작업을 요청할때 주로 사용되죠.
하나의 중요한 사실은 iOS 14부턴 시스템은 사용자의 의도없이 타 앱에서 가져오는 일반 클립보드 내용을 앱이 가져올 때 사용자에게 알려줍니다.
즉, 시스템은 사용자 상호작용, 예를들어서 시스템에서 제공하는 컨트롤을 사용하거나 Command-V를 누르는것과 같은 행위를 통해 사용자의 의도를 판단합니다.
다만 앞으로 알아볼 속성과 메서드를 사용해서 사용자에게 알리지 않고도 다양한 패턴의 클립보드 아이템이 일치하는지 여부를 판단할 수 있습니다.
해당 기능 자체는 개발자가 사용자의 명시적인 동의 없이도 클립보드 데이터를 읽는것을 방지하여 사용자 프라이버시를 보호하는데 도움을 주는 역할을 합니다.
The general pasteboard and named pasteboards
일반적으로 pasteboard를 사용할때 general을 통해 일반 pasteboard를 식별하여 모든 유형의 데이터를 사용할 수 있습니다.
즉, 어떻게보면 전역적으로 특정 pasteboard를 지정하지 않고 사용할 수 있죠.
다른 방법으로 앱 내에서 그리고 앱에서 동일한 팀 ID를 가진 앱으로 데이터를 공유하기 위해서 정의된 pasteboard를 생성할 수도 있습니다.
init(name:create:)와 withUniqueName()을 통해서 말이죠.
즉, 입맛대로 이 pasteboard를 생성해 사용할 수 있다는 소리입니다!
Using pasteboards
이 객체를 사용하기 위해서는 우선 데이터가 NSItemProvider를 준수해야하고 setItemProviders(_:localOnly:expirationData:)를 사용하면 됩니다.
NSString, NSArray, NSDictionary, NSDate, NSNumber, UIImage 혹은 NSURL 등을 setValue(_:forPasteboardType:) 메서드를 통해 pasteboard에 값을 쓸 수 있습니다.
만약, 데이터가 바이너리인 경우에는 setData(_:forPasteboardType:) 메서드를 통해 pasteboard에 쓸 수 있죠.
다만, 이 UIPasteboard 클래스는 단일 혹은 여러 pasteboard 항목에서 문자열, 이미지, URL 혹은 색상을 쓰고 읽기 편하게 메서드를 제공해주고 있습니다.
또한, 해당 특정 데이터 유형이 클립보드에 존재하는지 여부 등도 확인할 수 있는 속성들도 제공해줍니다.
예를들어, 문자열 데이터의 붙여넣기 옵션을 표시할지 여부를 다음과 같은 코드를 통해 결정할 수 있습니다.
if UIPasteboard.general.hasStrings { // Enable string-related control... }
시스템이 사용자 의도를 설정하지 않을 때 사용자 알림 및 경고를 방지하려면 다음 속성들을 이용해볼 수 있습니다.
시스템은 사용자가 해당 데이터에 액세스할 의도가 있는지 확인하지 못했을 경우 pasteboard에서 데이터를 가져오는 속성에 액세스하거나 메서드를 호출할 때 사용자에게 알립니다.
Pasteboard items and representation types
pasteboard에 개체를 쓰면 pasteboard는 해당 개체를 pasteboard 항목으로 저장합니다.
즉, 클립보드에서 값을 식별하는 하나 이상의 key value 쌍으로 구성됩니다.
이 균일 타입 식별자는 표현 타입의 키 역할을 하는 경우가 많습니다.
예를들어서 JPEG 데이터의 표현 타입의 키로 UTTypeJPEG로 사용하는 경우도 이에 포함되죠.
이 식별자 목록에 대해서는 아래 Uniform Type Identifiers를 참고해보면 좋을거에요 😃
Sharing pasteboards between devices
사용자가 iCloud에 로그인하면 일반 pasteboard는 해당 컨텐츠를 동일한 iCloud 계정을 사용하는 주변 기기로 자동으로 전송을 하는 역할을 해줍니다.
일반 pasteboard에 콘텐츠를 쓸 때 핸드오프 동작을 제어할 수 있고 메서드를 통해 사용 항목에 대한 만료기간등도 설정할 수 있습니다.
물론, 핸드오프에서 pasteboard를 제외할 수도 있습니다.
Using pasteboards with other objects
클래스는 복사 및 붙여넣기 등의 작업이 핵심이지만 UIPasteboard에선 이러한 작업에서도 다음과 같은 UIKit 클래스의 프로토콜과 인스턴스를 사용할 수 있습니다.
복사, 붙여넣기, 복제 작업을 구현하는 일반적인 앱은 사용자 인터페이스에서 관련 선택 항목도 관리하고 표시합니다.
또한 앱은 pasteboard 컨텐츠의 변경 사항과 데이터 모델의 변경 사항을 앱에 맞게 조정해야 합니다.
이렇게 UIPasteboard에 대해 알아봤으니 실제로 한번 코드로 사용해볼까요?
실제 사용해보기
우선 SwiftUI에서 사용해보겠습니다.
그런데 사실 이를 적용하는 로직 코드는 UIKit에서도 동일합니다.
코드부터 보시죠!
import SwiftUI struct ContentView: View { let textToCopy = "Greeeeeen" @State var pasteStr = "" var body: some View { VStack { Text(textToCopy) Button("복사하기") { UIPasteboard.general.string = textToCopy } .padding() .background(Color.blue) .foregroundColor(.white) .cornerRadius(5) TextField("붙여넣기", text: $pasteStr) } .padding() } }
버튼을 하나 구성합니다.
해당 버튼의 액션 로직만 집중하여 보면 됩니다!
UIPasteboard 객체를 사용하는데 여기서 커스텀하게 생성자를 통해 만들어준것이 아닌 general한 시스템 전체의 일반 보드를 사용했습니다.
그리고 해당 보드에 string으로 복사할 textToCopy 문자열을 담아주는것이죠.
만약 string이 아니라, 컬러나 URL 등의 데이터 타입을 사용하고 싶다면 아래 기본 정의된 타입들을 살펴보고 사용하면 됩니다!
이러면 사실 코드를 보는게 민망할 정도로 간단히 끝났어요ㅎㅎ
한번 돌려볼까요?
시뮬레이터 동작
복사하기 버튼 클릭 시 클립보드에 해당 텍스트가 복사되고 사용할 수 있음을 확인할 수 있습니다ㅎㅎ
마무리
요렇게 간단하게 복사 붙여넣기를 활용한 UIPasteboard 사용에 대해 알아봤습니다.
쿠폰이나 URL 등 복사할 수 있도록 많은 앱에서 지원되는것을 봤을거에요.
잘 활용해봅시다 😀
레퍼런스
'iOS' 카테고리의 다른 글
View Snapshot Capture (55) 2024.06.18 Haptic Feedback (58) 2024.06.11 Core Transferable 톺아보기 (62) 2024.04.18 Transferable 찍먹하기 (55) 2024.04.15 TexfField 시뮬레이터 버그 (Timeout) (65) 2024.03.25