iOS (7) 썸네일형 리스트형 백그라운드 상태에서, 알람 소리 켜기 제가 백그라운드 상태라는 것을 모를 때, 알람 기능을 개발할 때의 일입니다. 타이머 이후에 음악을 플레이를 하고 핸드폰 화면을 끄면 음악이 꺼지는 문제를 마주 했습니다. 당연히, 핸드폰 화면을 끈 상태에서 타이머가 지나도 음악이 플레이가 되지도 않았습니다. 접근 1. 노티피케이션 앱이 꺼진 상황에서도, 소리가 나거나 동작을 하는 기능이 있었는지를 고민하다보니 노티피케이션이 생각이 났습니다. 타이머가 끝난 상황에서, 노티피케이션을 통해 음악을 플레이를 하는 방법으로 진행을 했습니다. https://developer.apple.com/documentation/usernotifications/unnotificationsound UNNotificationSound | Apple Developer Document.. 배경색에 따른, 글자 색 변환 이전 글에서 작성했던 커스텀 Color Picker를 사용하다 보니, 글자색이 검정색인데 배경색이 어두운 경우 글자의 가시성이 떨어지는 문제를 발견했습니다. 이를 해결하기 위해 Color Picker에서 추출한 색상을 기반으로 글자색을 자동으로 결정하는 기능을 추가했습니다. 디자이너와 협업하여 가시성을 확보할 수 있는 기준점을 잡았습니다. 이러한 개선을 통해 카드의 색상과 상관없이 글의 가독성을 높일 수 있었습니다. 전체 코드 private func changeColorsAfterCardColorChange(){ let cardColor = card.cardColor let r = cardColor.components.r let g = cardColor.components.g let b = cardCol.. 커스텀 Color Picker 만들기 사용자가 선택한 노래를 저장하는 단위인 카드로 만드는 개발을 하고 있었습니다.디자이너님과 상의한 결과, 카드의 하단에는 노래와 관련한 정보들이 들어가기에 상단의 앨범커버의 최하단 중간의 색상을 카드의 전체적인 색상으로 결정하기로 했습니다. 하지만, 테스트 플라이트로 테스트를 해주신 분들이 색상을 고를 수 있으면 좋겠다는 피드백을 주셨습니다.기존의 색상 플레이트에서 색상을 뽑아 오는 것이 아닌, 앨범 커버 위에서 색상을 뽑으면 좋겠다고 의견이 모아져 Custom Color Picker를 만들게 되었습니다. 해결 과정ZStack{ // 앨범커버 Image(uiImage: viewModel.card.albumArtUIImage) // Color Picker 활성화 버튼 Button(action: .. 사용자 경험을 위한 최소버전 설정 일본 여행 중 앱을 사용하던 한 사용자가, 불안정한 네트워크 환경으로 인해 업데이트를 진행할 수 없어, 앱 사용이 불가하다고 연락을 주신 적이 있습니다. 결제 서비스를 제공하는 만큼, 결제 안정성을 위해 모든 사용자가 앱을 반드시 업데이트해야 했고, 이에 따라 사용자가 불편을 겪고 있다는 것을 알게 되었습니다. 최신 버전의 코드 업데이트 없이 바로 적용하는 하이브리드 앱이 해결책일 수 있으나, 저희는 전체 코드가 네이티브 코드로 이루어진 상황이었고 사용자의 불편함을 빠르게 해결하기 위해서 다른 방법을 고려해야 했습니다. 이 상황에서, 사용자에게 기존의 다른 기능들을 사용하는 것에 문제가 없으면서, 업데이트가 필요한 기능을 사용할 때만 업데이트를 유도한다면 사용자 경험을 높일 수 있을 것이라 결정을 내리게.. SwiftUI - 토스페이먼트, 결제 동의 관련 SwiftUI로 토스페이먼트 연동하여 결제를 하는 서비스를 만들던 중 '결제 동의'를 하지 않아도, 결제가 가능한 문제를 경험했습니다.결제 동의란의 체크표시를 하던, 하지 않던 결제가 가능했던 것인데요!결제 동의란의 상태 값을 제대로 받아오지 못하고 있다고 생각했습니다. 토스페이먼츠에서 깃허브에 제공한 코드를 활용하여 개발 하였고,당시 오픈 소스에 SwiftUI에 토스페이먼츠를 사용한 다른 코드가 없었기 때문에 오류를 수정하기란 쉽지 않았습니다. 토스페이먼츠 제공 코드:- https://github.com/tosspayments/payment-sdk-ios/blob/95a65f9b0e080b370dfcc762c0059f82bdd56c91/Examples/SwiftUI-Example/TossPayments.. 이미지 리사이징으로, 저장용량 줄이기 QR코드와 같은 정보를 저장하기 위해, 이미지를 편집하고 저장하는 기능을 개발하고 있었습니다. 단순하게 이미지를 지정된 구간만큼 자르고 저장을 하던 중, 이미지의 용량이 필요 이상으로 저장되고 있음을 확인했습니다. 사용자의 핸드폰에 저장공간을 필요 이상으로 사용하여, 앱 제거 대상이 되기 전 이미지 용량을 줄이기로 했습니다. 최적화 전 - 이미지를 자른 그대로 사용하기 let cropped = UIImage(cgImage: (이미지 크롭)) ) 최적화 후 - 자른 이미지를 QR 코드를 인식할 수 있거나, 정보를 분간하는데 문제가 없는 수준으로 줄이기 func getImageFileSize(image: UIImage) -> Int? { guard let imageData = image.jpegData(co.. 비동기적으로 NS 캐쉬를 사용하여, 네트워크 통신 줄이기 앱 개발 기능 중, 게시글에서 사용되는 다수의 이미지를 네트워크에서 로드해야 하는 상황이 발생했습니다.이미지 특성상 데이터의 사이즈가 크기 때문에, 이미지를 매번 불러올 때마다 이미지를 로딩하는 화면을 보아야 하는 상황이었습니다. 최적화 전 - 게시글에 해당하는 이미지를 매번 네트워크에서 요청하는 방식static func loadImageFromURL(url: URL, completion: @escaping (UIImage?) -> Void) { URLSession.shared.dataTask(with: url) { data, _, error in if let error = error { print("Error downloading image: \(error.localizedD.. 이전 1 다음