적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

반응형

분류 전체보기 592

통화 중 음성 안내 + 스피커폰 (feat. AVAudioEngine)

SendBirdCalls 사용해서 전화 상담 기능을 제공하고 있는데상담이 끝나기 전, '5분 뒤 상담이 종료됩니다'라는 안내 메시지 음성을 추가해달라는 요청이 들어왔다. 음성 파일 넣는 건 어렵지 않았다. 통화 중일 때 AVAudioPlayer 사용하니 음성 파일 재생은 잘 되는데, 문제는 스피커폰일 때... let audioSession = AVAudioSession.sharedInstance()audioSession.overrideOutputAudioPort(.speaker)이렇게 스피커폰으로 설정 변경하니까 음성 안내가 너무 작아서 안들리는 건지 소리가 안나오는 문제가 있더라!! OMG... 아주 간단한 작업일 줄 알았는데, 이렇게 생각지도 못한 문제가 터질 줄이야 ㅎㅎㅎ 기존 코드enum Re..

[iOS] 롤링 배너 노출 트래킹

광고 배너가 도입되면서 배너 노출 및 클릭 트래킹 기능을 구현하게 되었다. 문제는 화면마다 UI 구현 및 작동 방식이 다 다르다는 것.. 😱 [홈 / 커뮤니티 / 전문가 찾기] 이렇게 세가지 탭에 배너가 적용이 되어 있는데, 클릭 수는 명시적이지만 노출 수 감지하는 게 문제였다. 네이버 카카오 등등 보통 광고 배너는 롤링 방식이 아니라 하나만 노출하고 새로고침될 때 다른 배너로 바뀌는 형태가 많던데우리는 롤링을 유지하면서 화면에 배너가 보였을 때 정확한 노출 수 집계를 해야하는 것... 화면마다 배너가 적용된 방식을 먼저 살펴보자면, 1. 홈 배너- SwiftUI의 ScrollView 내에 위치ScrollView { VStack { ... bannerView ..

iOS에서 WebView로 Analytics 사용하기 (feat. AnyCodable)

웹뷰로 만든 앱에서 Firebase logEvent에 purchase 가 제대로 잡히지 않는 이슈가 있었다. 웹에서 받아온대로 firebase 에 전송하도록 되어 있었는데, purchase 의 프로퍼티가 사전 정의된 [String: String] 형태가 아니라 [String: Any] 형태로 보내지고 있었던 것!! Firebase 에서 기본적으로 제공하는 이벤트들이 있다. login, purchase, sign_up 등.. (오래된 문서인것 같지만 여기 참고 👉🏻 [GA4] 추천 이벤트) Firebase 의 logEvent는 [String: Any] 형태로만 보낼 수 있고, nested array 형태를 직접 받을 수는 없지만purchase 같은 기본 제공 이벤트에서는 받을 수 있다. 아니, 그렇게..

[Swift iOS] setNavigationBarHidden 상단 네비게이션 바 숨기기

웹뷰를 열었는데, viewDidLoad 에서navigationController?.navigationBar.isHidden = true해주면 처음 웹뷰 뜰 때는 상단 navi 없이 잘 뜬다. 문제는.. 웹뷰에서 native 화면을 push 로 열었다가 다시 pop 해서 뒤로 돌아갈 때..자꾸 상단 네비게이션이 뜨는 것이 아닌가!! viewWillAppear 이랑 viewDidAppear 에 navigationController?.navigationBar.isHidden = truenavigationController?.setNavigationBarHidden(true, animated: false) 설정해줘도 무조건 잠시 보였다가 사라지는 것..popViewController transition 애니..

[Swift 알고리즘] Programmers 할인 행사

○Level 2 연습문제 (슬라이딩 윈도우) Programmers 할인 행사 10일 동안 원하는 제품을 모두 할인 받을 수 있는 회원등록 날짜의 총 일수를 return 하는 문제 통과하긴 했지만 무지성으로 풀었긔.. 슬라이딩 윈도우 사용해서 푸는 법1. discount 배열을 하루씩 이동하며 길이 10인 slice를 만들어 비교2. 각 slice마다 해당 기간의 제품 종류와 수량이 want 와 number를 만족하는지 확인 func solution(_ want:[String], _ number:[Int], _ discount:[String]) -> Int { var result = 0 // 원하는 제품과 수량을 딕셔너리로 변환 let wantMap = Dictionary(uniqu..

전문가 찾기 필터 - 화면 및 데이터 통합 (feat. OrderedSet)

전문가 찾기 필터 리뉴얼 작업단순 UI 개선.. 이 아니라 아예 다 새로 만드는 작업이었다 ^^ 1. 기존에 각 필터 별로 따로 관리되던 바텀시트를 하나로 통합2. 날짜 및 시간 선택을 단일 선택에서 다중 선택으로 변경3. UIKit -> SwiftUI=> 데이터 흐름 구조 개선으로 이후 필터 관련 기능 확장 시 개발 속도 향상 기존 구조의 문제28개의 배열로 서로 타입이 다른 필터 항목들을 각각 관리 하고 있어, 통합 시 하나로 관리하기가 어려웠다.또한 필터 관련 api 와 로직들을 전문가 찾기 화면 ViewModel에서 다 관리하고 있어 뷰모델이 방대해지고 분리에 어려움이 있었다. 통합 전통합 후

AppsFlyer 이벤트 로그 보내는 법 + Test

1. AppsFlyer 이벤트 로그 보내기2. Test Device 등록3. 실시간 이벤트 트래킹 Test 예전에도 했었는데 기억이 가물가물해서 문서로 남겨본다. 1. AppsFlyer 이벤트 로그 보내기AppsFlyer SDK 연동 - 인앱 이벤트 - 이벤트 구조여기서 사전 정의된 이벤트 이름을 확인할 수 있다. 앱스플라이어를 포함해서 meta ads 등 다른 플랫폼에 맵핑되는 이벤트 값들을 함께 확인할 수 있다. AppsFlyer iOS SDK In-app events여기서 로그이벤트 보내는 방법 및 코드를 참고할 수 있다. 다음과 같이 보내주면 됨AppsFlyerLib.shared().logEvent(AFEventAddToWishlist, withValues: [ AFEventParamP..

용마산 실내 지구력 일지 - 중랑 스포츠클라이밍 경기장

2025-04-10 (목)하.. 클라이밍 오래도 쉬었다. 거의 세 달만에 다시 간건가봄이 오기 전에 열심히 해서 턱걸이 10개 하고 10b 찍을거라던 꿈은 어디가고턱걸이는 다시 1개로 돌아왔고 클라이밍 실력은... 없..다... 오랜만에 갔더니 문제가 다 바뀌어있더라2층 가서 한바퀴 몸 풀고 1층 내려와서 오늘은 제일 쉽다는 빨간색 두번하고 시마이맛보기로 어려운 왼쪽벽 흰색 4번까지 잡아보기만,, ㅎㅎㅎ아직 흰색 파란색 밖에 없어서 둘 중에는 흰색이 더 쉬운거같긴한데 아직 세팅 중인건가..?감 다 떨어진 것도 있지만 홀드가 넘 안좋자나여,, 오늘도 클존감 하락하고 갑니다 ㅋㅋㅋㅋㅋ 이제 다시 열심히 해봐야디 날씨가 좋아서 외벽에도 사람이 엄청 많더라!!용마 외벽 같이 가실분 구함.. ㅎ 2025-04-..

운동/클라이밍 2025.04.11

[재현 불가] 같은 푸시가 동시에 두 개 들어온다구요?

대표님이 직접 스레드에 글을 남겨주셨다. 바로상담 알림 설정했을 때, 푸시가 두 번 연달아 오셨다고.. 한 기기에서 여러 계정으로 로그인 한 이력이 있을 때 푸시가 중복 수신될 수 있는지 확인을 요청해주셨다. 아마도 그럴 가능성은 거의 없지만..원인 파악을 위해 앱에서도 확인을 해보고자 동일 기기에서 계정 두 개로 번갈아 로그인했을 경우, 푸시가 여러개 오는 경우가 있는지 체크를 해보았다.  바로상담 푸시 알림은 하루에 한 번만 오게 되어 있어, 테스트를 위해 개발 db에서 푸시 전송 기록을 지워주었다.좌측 상단에 SQL 누르면 Script 화면이 열리고, 쿼리를 입력해 데이터를 조회할 수 있다.last_push_sent_time 을 NULL 값으로 수정해준 후 Save 하고 바로상담 키면 알림을 계속 ..

DBeaver로 db 수정해보기

바로상담 리뉴얼하면서 기존에 있던 화면이 없어지고, 다른 화면으로 통합되면서 로직이 제대로 작동하는지 테스트가 필요했다.그런데 바로상담은 한 번 진입하면 다른 유저들이 동시에 들어오지 못하도록 5분 간 lock 이 걸리기 때문에, 기능 테스트를 자유롭게 하기 위해서는 테스트할 때마다 개발 db에서 lock 데이터를 지워줘야 했다.  1. Table 조회- 원하는 테이블을 찾아서 열고2. Sort- registered_time column을 ordered by DESC 내림차순으로 설정해 최신순으로 정렬해준다.3. Delete Row- 내가 테스트 중인 user id 값 중 가장 최신 로우를 삭제해준다.4. Save- 하단의 save 버튼을 눌러야 저장이 됨이렇게 하면 lock 을 수동으로 지워주고 마음껏..

728x90
반응형