전체 글

MPNowPlayingInfoCenter 제어센터 초기세팅 및 갱신하는 방법
뮤직플레이어앱을 개발하면서 제어센터를 사용하기 위해 코드를 짰지만 webview에서 동영상을 재생하는 방식인 우리 앱에선 동작하지 않아 버리기엔 아까워 코드를 공유하고자 남깁니다. // 제어센터 초기세팅import MediaPlayerfunc MPNowPlayingInfoCenterSetting() { // 제어 센터 이벤트 수신 시작 // Info.plist에 // UIBackgroundModes : audio 또는 // Required background modes : App plays audio or streams audio/video using AirPlay 해주어야 합니다. UIApplication.shared.beginReceivi..

UITableView 로 가사 기능(트래킹, 하이라이팅, 탐색) 개발 기록
왁타버스 뮤직 앱을 개발하면서 가사 기능을 구현했던 내용을 기록하기 위해 작성한 글입니다.요구사항 및 결과 화면1. 가사 트래킹 기능: 시간이 흐르면 재생중인 가사가 가운데로 스크롤되어야 함2. 가사 하이라이팅 기능: 재생중인 가사를 하이라이팅해야 함3. 스크롤 가사 탐색 기능 : 가사를 스크롤하면 멈춘 위치의 가사를 재생 기능 구현 트래킹 기능1. JSON 으로 받아온 가사를 가사 딕셔너리로 변환가사를 요청하면 아래와 같은 형식의 json이 날아옵니다.[{"identifier":"1","start":17.17,"end":19.9,"text":"기억나 우리 처음 만난 날","styles":""},{"identifier":"2","start":19.9,"end":23.77,"text":"내게 오던 너의 ..

Tuist Project 'Could not build Objective-C module' 오류 해결법
Tuist 로 프로젝트를 진행하다가 Could not build Objective-C module 'RXSwift' 라는 오류메시지를 마주해 해결한 방법을 공유합니다. 1. XCode Settings -> Locations -> Derived Data 로 이동2. XCode 를 종료합니다.3. Derived Data 폴더에 많은 폴더들이 있을텐데, 문제가 되는 프로젝트명이 붙은 폴더를 전부 삭제합니다.(Ex: TestProject-dqiwebnaks)4. tuist clean, tuist generate 를 순서대로 해줍니다.5. xcworkspace를 열어 재빌드합니다. 위와같이해서 문제를 해결했습니다 !
![[백준] BOJ-15649 N과 M (1)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FKTNmH%2FbtrSqXX0l7B%2FAAAAAAAAAAAAAAAAAAAAADWOfISbRQOn6o2Qe30VyYVva6UoLInkwSFuvZtdLtu4%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3DCZk84IFwIEZVNqpcqgRiRToMghE%253D)
[백준] BOJ-15649 N과 M (1)
문제 N과 M을 입력받아 nPm 의 순열을 구하는 문제였다. 풀이 import Foundation let nm = readLine()!.split(separator: " ").map { Int($0)! } let n = nm.first! let m = nm.last! let nums = Array(1...n) // [1, 2, ..., n] /// nPr func permutation(n elements: [Int], r: Int) -> [[Int]] { var result = [[Int]]() var visited = [Bool](repeating: false, count: n) func permu(_ temp: [Int]) { if temp.count == r { result.append(temp) ..
![[SwiftUI] 사라질 때 transition이 적용안되는 경우 (SwiftUI removal transition not animated)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbJBHV5%2FbtrSq8Zo4Af%2FAAAAAAAAAAAAAAAAAAAAAG8UmEUoT-BJqFX_6oPs-u_46jXDvix7DAFCiDX6b8c3%2Fimg.gif%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3D%252Ft5jKfJI3m1rMh1VoRQvPY2Coj8%253D)
[SwiftUI] 사라질 때 transition이 적용안되는 경우 (SwiftUI removal transition not animated)
문제Color 로 덮여있는 화면을 탭하면 Lottie 뷰가 아래에서 나타나고,Lottie 뷰를 다시 탭하면 아래로 사라지도록 했다.뷰가 나타나는 건 잘되는데, 사라질 때 왜 애니메이션이 안먹을까? 원인 및 해결ZStack { Color.green.ignoresSafeArea() if isAnimating { CustomLottieView() .transition(.move(edge: .bottom)) }}// @State isAnimating, onTapGesture 는 생략위 코드처럼 구성이 되어있는데 .ignoresSafeArea() 를 풀어보면 removal transition 시, CustomLottieView 의 ZIndex 가 0으로 변경되면서 Color 보다 아..
![[백준] BOJ-14889 스타트와 링크](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FHgaZg%2FbtrSa77Wphs%2FAAAAAAAAAAAAAAAAAAAAAPOLqV6olsaAMPbrCcH8BP8rt75MX7q4gGY38ocyAUO0%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3DoICtbyOazOkqzMdYVVEavUPK33E%253D)
[백준] BOJ-14889 스타트와 링크
문제 문제 풀이 알고리즘 스터디 1주차 문제로, DFS, 백트래킹 알고리즘으로 접근하며 문제풀이를 시작했다. 백트래킹은 "DFS를 기반으로 하며, 어느 정도의 Depth 에 도달하면 탐색을 중단 하는 알고리즘" 정도로 이해하고 접근했다. n이 무조건 짝수로 제공되고, 절반 씩 팀을 나누기 때문에 dfs로 순차 탐색을 진행하다가 n / 2 일 경우 탐색을 중단하고 팀원을 구성하도록 했다. 두 팀간의 능력치 차이가 가장 적은 경우의 능력치 차이를 출력하는 문제이기에 result 변수의 초기값을 Int.max 로 설정해둔 후, min() 과 abs() 함수를 사용해 두 팀 간의 능력치 차이를 구하고 result 와 비교해 더 적은 값으로 업데이트 하도록 했다. import Foundation let n = I..
![[Git] gitignore에 등록해도 DS_Store가 자꾸 Stage에 올라가요](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FddOaMA%2FbtrQCiV8OF3%2FAAAAAAAAAAAAAAAAAAAAALbY8URxVRsVulZP8_rQ8oPg7FFgMBRXpYmSd7BGoDpu%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3DaM5kRG8hIBmCaOQ7iRhH8%252FwcYsY%253D)
[Git] gitignore에 등록해도 DS_Store가 자꾸 Stage에 올라가요
DS_Store 파일은? DS_STORE 파일이란 Desktop Services Store의 약자로, 애플에서 정의한 파일 포맷이다. 애플의 맥 OS X 시스템이 finder로 폴더에 접근할 때 자동으로 생기는 파일로써, 해당 폴더에 대한 메타데이터를 저장하는 파일이다. 윈도우의 thumb.db 파일과 비슷하다. 분석해보면 해당 디렉토리 크기, 아이콘의 위치, 폴더의 배경에 대한 정보들을 얻을 수 있다. 맥 OS 환경에서만 생성 및 사용되지만, 파일을 공유하는 과정에서 이 파일도 같이 공유되는 경우가 있다. DS_store 파일은 프로젝트와 관련없는 파일이며, git status를 사용했을 때 발견되는 파일이니, github로 넘기지말고 삭제해도 된다. 문제 .gitignore 에 *.DS_Store 를..

CocoaPods pod install 시 minimum deployment target 경고가 뜰 때
프로젝트를 Clone 후 의존성 설치를 위해 pod install 을 했다.분명 예전에도 pod install 후 워닝이 떠서 minimum deployment target 를 최소 지원 버전과 맞춰 놨는데, pod install 을 하면 다시 초기화되는 경우가 발생했다. 새로운 팀원이 들어오거나 프로젝트 파일을 새로 여는 경우 매번 minimum deployment target 을 설정해주는건 번거로운 일이다. 그래서 이참에 자동화 하는 방법을 찾아서 적용해두었다.. # 이런 저런 초기 설정...target 'YourApp' do # 당신의 앱의 이런저런 외부 의존성... # ex) pod 'KakaoSDKTalk' # ex) pod 'Alamofire'endpost_install do..
![[소프트웨어 공학] 블랙박스 테스트-1](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FlS93N%2FbtrQtVnP5SR%2FAAAAAAAAAAAAAAAAAAAAAFdrTydr7BnFF2O5hd3rj_SVkOnebxpoG2PFOprWfs5r%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3DxNxIjR32%252FnbIAepUwnMFyha%252B3H0%253D)
[소프트웨어 공학] 블랙박스 테스트-1
블랙박스 테스트 명세 기반 테스트(ISO/IEC/IEEE 29119) 명세에 따른 올바른 구현여부 테스트 명세 정보 등을 이용하여 테스트 케이스 설계 요구사항 분석 / 시스템 인터페이스 / UI 명세 원시 코드 정보를 이용하지 않음 사용자 입장에서 테스트 케이스 설계 가능 개발 초기 단계부터 테스트 케이스 설계 가능 단위, 통합, 시스템, 인수 테스트 전 과정에 사용 동일 명세로 구현된 여러 시스템에 재사용 가능 기능 (누락) 오류 / 명세 오류 검출 예시 입력이 1024 이하이면 입력 값, 크면 1 증가 값 반환 // BlackBoxTest.java public class BlackBoxTest { public int bTest(int x) { return x; } } 명세에 따라 1024 이하인 경우..

앱스토어 첫 심사와 리젝 대응 : Guideline 2.1
첫 심사시험 하루 전날이었지만,첫 개인 앱이 세상 밖으로 나갈 준비를 마치니까 몸이 근질거려 시험공부는 때려치고 처음으로 심사를 넣어보았다!앱스토어에 등록될 스크린샷(6.5/5.5)도 직접 만들고인생 첫심사라니 뿌듯해하던것도 잠시 심사에 들어간지 2시간 정도만에 답장이 왔다.첫 리젝이게 뭐지? 하고 읽어보니 리젝당했다는 뜻이었다. 처음 읽을때만해도 통과는 됐는데 뭘 바꾸라는건가? 싶었음ㅋㅋㅋㅋㅋ가이드라인과 함께 내용을 파파고와 함께 읽어보니2.1 앱 완전성 앱 심사 팀에 제출하는 앱(사전 주문용 앱 포함)은 필요한 모든 메타데이터가 있고 URL이 정상적으로 작동하는 최종 버전이어야 합니다. 플레이스홀더 텍스트, 빈 웹 사이트와 기타 임시 콘텐츠는 제출하기 전에 삭제해야 합니다. 앱을 제출하기 전에 기기에..

협업 시 팀원과 Provisioning Profile 및 Certificate 공유하기
iOS 앱개발을 하다보면 혼자서만 작업하는게 아닌 협업을 자주 하게 되는데요.혼자서 개발할땐 거의 Automatically manage signing 을 켜둔 상태에서 개발하다보니XCode 가 알아서 Provisioning Profile 을 만들어주고, 이렇게 만들어진 Provisioning Profile 엔 내 App ID, Signing Certificate, Device 가 등록되어있을테니 내 작업환경에선 실기기 빌드도 잘되고 문제가 없습니다. 하지만 팀원은 인증서와 프로비저닝 프로파일이 없기 때문에 실기기를 빌드하려고 하면 오류가 나게 됩니다. 따라서 수동으로 프로비저닝 프로파일(Provisioning Profile)과 인증서(Certificate) 을 만들고 팀원들에게 공유해 준다음 팀원들이 등..
![[소프트웨어 공학] JUnit](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2Fn29bV%2FbtrN4OrLvkc%2FAAAAAAAAAAAAAAAAAAAAAAD14PmCKS88tIohFlU-iS-AzJU2Wekd20MVdnYPe_hL%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3DM0Ctu2B90bgr5HdBRBNpq%252B2UVR0%253D)
[소프트웨어 공학] JUnit
JUnit 이란? 자바 프로그램의 단위 테스트 프레임워크 어노테이션으로 쉽고 간결한 테스트 코드 테스트를 위해 코드에 출력문을 삽입할 필요 없음 예시 src/main/java(kr.se) 폴더에서 Calc 클래스 생성 -> File -> New -> Class 선택 package kr.se; public class Calc { //Calc.java private int res=0; public void add(int x, int y) { res=x+y; } public void sub(int x, int y) { res=x-y; } public int getResult( ) { return res; } } src/test/java(kr.se) 폴더에서 CalcTest 클래스 생성 -> Flie -> N..