iOS 개발시 UIPasteboard 클래스를 이용해서 클립보드에 저장된 데이터를 읽고 쓰는 것이 허용됩니다. UIPasteboard 클래스의 general 속성을 이용해서 pasteboard 객체를 가져와 string 속성에 저장할 수 있습니다. SwiftUI 에서도 동일하게 사용할 수 있습니다. 다음 예제는 문자열을 클립보드에 저장하는 기능을 합니다. let p = UIPasteboard.general p.string = "OK" 반대로 값을 가져와 사용해야 하는 경우 다음과 같이 처리합니다. if let str = p.string { // str 은 클립보드의 데이터 } 다만 iOS 14 이전에는 사용자 동의 없이 클립보드 데이터를 액세스 할 수 있었습니다. 하지만 보안상 문제가 되어 사용자의 동의..
eventChangedNotification 최근에 스위프트 UI 프로젝트를 진행하고 있습니다. 또한 새롭게 나온 SwiftData 를 적용하면서 여러가지 문제를 해결해 가고 있던 중 CloudKit 동기화까지 진행하게 되었습니다. SwiftData 가 효율적이고 좋은 것은 맞는 것 같지만 너무 자료가 없고 사용자체가 너무 추상화 되어 있기 때문에 세세한 컨트롤이 좀 어렵다고 생각합니다. 물론 제가 그걸 몰라서 그렇긴 하겠지만요. 첫 번째 난관이 Cloud 킷의 로드 완료 이벤트를 알고 싶었는데 해결이 되서 블로그에 남깁니다. ▼ 우선 이벤트 수신을 위해서 @State 로 다음 변수를 선언합니다. eventChangedNotification 는 이벤트가 변경될 때 마다 수신하게 됩니다. @State pr..
배열에 배열을 추가하는 방법은 총 3가지가 있으며 선호하는 방식으로 사용할 수 있습니다. 우선 테스트를 위한 배열 2개를 만들어보겠습니다. 주의 하실 것은 첫번째 배열의 경우 mutable로 선언했다는 것입니다. 그래서 두번째 배열을 병합할 수 있습니다. var first = ["서울", "부산"] let second = ["경기", "대전"] 1. 첫번째로 append(contentsOf:) 메서드를 이용해서 이 둘을 병합할 수 있습니다. first.append(constentsOf: second) 2. 두번째로 += 연산자로 두 배열을 병합할 수 있습니다. first += second 3. 마지막으로 이 두 배열을 + 연산자로 더해서 다른 변수에 할당할 수 있습니다. let third = first ..
뷰 모델 생성 뷰 모델을 생성합니다. 이름은 UsersViewModel 이고 ObservableObject를 상속합니다. 다음 두 개의 속성을 @Publised 래퍼로 가지고 있습니다. users : 통신의 결과 값인 User 객체의 배열 isLoading : 통신 중을 확인하는 Boolean 값 fetchUsers()라는 함수를 만들어서 통신 결과 값 데이터를 반환합니다. final class UsersViewModel: ObservableObject { @Published var users: [User] = [] @Published var isLoading = false func fethUsers() async throws { isLoading = true defer { isLoading = fals..
스위프트 Charts 라이브러리 iOS 개발을 하다보면 다음과 같은 차트 라이브러리를 많이 사용하게 됩니다. 차트 라이브러리를 사용하게 되면 그중에 ValueFormatter를 커스텀 해야 할 때가 있습니다. 텍스트의 크기나 라벨의 문구를 반복적으로 수정하는 일이 필요할 때 사용하며 때에 따라 알맞게 사용하면 됩니다. https://github.com/danielgindi/Charts/tree/master GitHub - danielgindi/Charts: Beautiful charts for iOS/tvOS/OSX! The Apple side of the crossplatform MPAndroidChart. Beautiful charts for iOS/tvOS/OSX! The Apple side of ..
카드 형태의 이미지를 만들 때 많이 사용하는 효과를 extension으로 쉽게 구현해 보겠습니다. 위의 이미지에서 보듯이 카드를 이용한 디자인을 할 때 디자이너들이 곡선과 함께 쉐도우를 주는 작업을 많이 합니다. 플랫 한 디자인이 아닌 약간 입체적으로 보이기 위해서 사용하는데 익스텐션을 이용해서 만들어보겠습니다. 다만 특정 UIView를 감싼 컨테이너가 필요하다는 점에 유의해 주세요. ▼ 실습에 앞서서 다음 두개의 라이브러리를 추가해 줍니다. import SnapKit import Then ▼ 그리고 뷰 컨트롤러에 컨테이너와 Box 뷰를 생성하겠습니다. 단순히 Conatiner 뷰를 화면에 붙이고 그 안에 box를 넣은 상태입니다. box의 경우 300의 높이 값을 가지고 상단, 좌우로 100 만큼 떨어..
다국어 앱 스키마 언어 설정 Xcode로 다국어 앱을 제작할 때 여러 언어로 테스트해보기가 쉽지 않은데 Xcode에서 간단한 설정으로 다국어 테스트를 해볼 수 있습니다. 다만 실제 단말에서 테스트하기 위해서는 직접 단말에 시스템 설정에서 Region이나 App Language를 바꿔야 합니다. 하지만 단순히 언어의 Localization을 확인하기 위해서는 시뮬레이터를 여러 개 만들어서 사용해 보기 편리합니다. ▼ 프로젝트 파일을 열고 타겟이 아닌 프로젝트 메뉴에서 해당 프로젝트를 선택하고 하단에 Localizations 영역을 확인합니다. ▼ Xcode 상단바에서 프로젝트 아이콘을 눌러 Edit Scheme 메뉴를 선택합니다. ▼ Run 스키마의 Options 메뉴에서 App Languages를 Eng..
iOS 개발시 AppDelegate의 applicationWillTerminate 호출이 되지 않거나 macOS의 NSApplicationWillTerminateNotification이 호출되지 않을 때 다음과 같이 Info.plist에서 해당 값을 확인해 볼 필요가 있습니다. 해당 값을 NO 로 설정하고 앱을 재실행하면 terminator가 잘 호출 되는 것을 확인 할 수 있습니다. Application can be killed immediately when user is shutting down or logging out NSSupportsSuddenTermination ▼ 아래 코드는 위젯 상태를 업데이트 하기 위해서 applicationWillTerminate 호출시 로그아웃 명령을 하는 코드로 ..
Xcode DeviceSupport Xcode를 사용하다보면 새로운 iOS 버전이 출시될 때마다 Xcode를 다운로드 업데이트해야 새로운 iOS 버전을 빌드 할 수가 있습니다. 하지만 지원 버전이 낮은 서비스를 위해서는 Xcode를 매번 업데이트 할 수 없습니다. 다른 IDE와 다르게 매우 불편할 수 있는데 이를 해결하기 위해서는 해당 단말기의 DeviceSupport DiskImage를 다운로드해서 기존 Xcode 라이브러리 폴더에 추가해서 동작시킬 수 있습니다. Xcode 빌드시 다음 문구를 보셨다면 Xcode를 지원하지않는 장치를 사용했기 때문인데 베타 버전이거나 최신 Xcode에서도 지원하지 않는 버전이 아니라면 해당 절차를 통해서 실행 시킬 수 있습니다. Could not locate devic..
테스트 플라이트 (TestFlight) 수출 규정 관리 문서 앱을 개발하다 테스트 플라이트에 앱을 배포할 일이 많이 있습니다. 사실 앱스토어에 앱을 업데이트 하기 전에 한번은 거처야 하는 과정입니다. 그런데 앱을 배포할 때마다 "수출 규정 관리 문서 누락"이란 메시지를 만나게 됩니다. 물론 관리에서 설정을 해주면 제출 준비 완료 상태로 변하면서 앱을 테스트 할 수 있는 상태가 됩니다. ▼ 다음과 같은 화면이 나오면 관리 버튼을 눌러서 암호화 되지 않음으로 선택해야 제출준비상태가 되고 그제서야 테스터들이 테스트 할 수 있습니다. ▼ 이제 프로젝트로 가서 info.plist 파일을 찾아 다음과 같이 App Uses Non-Exempt Excription 을 No(false) 값으로 변경해줍니다. ▼ 만약 코..
아이폰 롱터치 방지 아이폰 개발을 하다보면 웹뷰를 사용할 때가 많습니다. 하이브리드 앱을 개발하다보면 WebKit의 특성을 발견하게 됩니다. 네이티브 앱으로 개발할 때는 텍스트를 길게 누르거나 선택을 할 수 없지만 보통 하이브리드 앱으로 개발된 iOS 웹 앱을 보면 텍스트가 보통 선택되기 마련입니다. ▼ 텍스트 선택 방지 코드로 웹뷰가 로드 된 뒤에 didFinish 이벤트에서 설정해주면 됩니다. Web CSS 공식 문서를 보면 iOS Safari 디스플레이의 callout 기능이 포함 되어 있는 것을 확인 할 수 있습니다. https://developer.mozilla.org/en-US/docs/Web/CSS/-webkit-touch-callout -webkit-touch-callout - CSS: C..
Swift Date 객체 변환하기 Swift에서 날짜 객체를 수정하거나 바꾸기 위해서는 보통 Calendar 클래스를 사용합니다. 날짜를 다루는 일이 생각보다 복잡하고 어려울 때가 있는데 오늘은 단순히 날짜에 값을 더해서 반환하는 방법을 알아보겠습니다. 앱 개발을 하면서 갑자기 1일을 더해서 Date 객체를 사용해야 하면서 기억하기 쉽게 블로그에 글을 남깁니다. 우선 1일을 추가해서 데이트 객체를 만들려면 우선 기준이 되는 Date 객체를 하나 만들어 줍니다. ▼ 다음과 같이 today 변수에 오늘 날짜를 가리키는 새로운 Date 객체를 생성합니다. ▼ 이제 Calendar 클래스를 이용해 값을 추가해 줍니다. date 함수의 파라미터는 각각 다음의 파라미터를 인자로 받습니다. 저는 day로 설정해서 하..