트러블 슈팅
-
[iOS/Swift] WKWebKit 약관 상세 페이지 전환하여 띄우기
우리는 노션 웹페이지로 두 개의 상세 페이지를 보여준다. ( 페이지는 현재 제외되었다.)같은 형식의 뷰에, title과 WebView의 링크만 바뀐다. 다만 여기서 버튼을 눌렀을 때, 바깥의 약관 선택 페이지에서도 해당 표시가 반영되어야 했다. 구조를 고민하다가, 위의 3개 페이지가 전부 같은 뷰모델을 공유하여 상태 값들을 전달받을 수 있도록 구현했다.WKWebView 사용WebView의 구현 방식에서는 3가지가 있다. 1. WKWebKit2. open safari3. SFSafariViewController나는 이 중에서도 닫기 버튼을 커스텀하고, 따로 웹에서 작업할 것 없이 앱 내에서 보여주기만 할 것이기에 WKWebKit을 사용하였다. 노션으로 약관을 정의했는데, 약관의 내용이 수정되었을 때 굳..
2024.07.07
-
[iOS/Swift]카카오톡 공유하기 구현 3. openURL, 앱이 suspended일 때, query Parameter에 한글이 있을 때
2024.07.05 - [iOS/트러블 슈팅] - [iOS/Swift]카카오톡 공유하기 구현 1.이미지 URL 설정 + FileManager에 UIImage 저장 [iOS/Swift]카카오톡 공유하기 구현 1.이미지 URL 설정 + FileManager에 UIImage 저장우리 서비스 roome는 방탈출 프로필을 생성하는 것이 가장 주된 기능이다. 때문에 이 프로필을 다른 사람들에게 공유하는 것이 필수였다. 네이버, 인스타 등 여러 가지 매체를 고민했는데 프로필mintraum.tistory.com2024.07.05 - [iOS/트러블 슈팅] - [iOS/Swift]카카오톡 공유하기 구현 2. 사용자 정의 템플릿 사용 [iOS/Swift]카카오톡 공유하기 구현 2. 사용자 정의 템플릿 사용2024.07.0..
2024.07.05
-
[iOS/Swift]카카오톡 공유하기 구현 2. 사용자 정의 템플릿 사용
2024.07.05 - [iOS/트러블 슈팅] - [iOS/Swift]카카오톡 공유하기 구현 1.이미지 URL 설정 + FileManager에 UIImage 저장 [iOS/Swift]카카오톡 공유하기 구현 1.이미지 URL 설정 + FileManager에 UIImage 저장우리 서비스 roome는 방탈출 프로필을 생성하는 것이 가장 주된 기능이다. 때문에 이 프로필을 다른 사람들에게 공유하는 것이 필수였다. 네이버, 인스타 등 여러 가지 매체를 고민했는데 프로필mintraum.tistory.com이전글에 이어서 공유하기 템플릿에 대해서도 고민이 있었다. 우리 팀은 보낸 이와 받는 이가 다르게 보이길 원했다.정확히는 "확인하러 가기" 버튼이 굳이 본인에게 보일 필요가 없다고 생각했다. 때문에 위 사진처럼 ..
2024.07.05
-
[iOS/Swift]카카오톡 공유하기 구현 1.이미지 URL 설정 + FileManager에 UIImage 저장
우리 서비스 roome는 방탈출 프로필을 생성하는 것이 가장 주된 기능이다. 때문에 이 프로필을 다른 사람들에게 공유하는 것이 필수였다. 네이버, 인스타 등 여러 가지 매체를 고민했는데 프로필 이미지를 보여주면서 클릭 시 우리 앱으로 연결을 하는 것에는 카카오만이 적합하다는 결론이 나와 카카오톡 공유하기만 사용하기로 했다.1. 흐름공유하기가 이루어지는 과정은 다음과 같다. -----보내는 이-----1. 사용자가 ViewController에서 공유하기 버튼을 누른다. 2. ViewModel에서 KakaoShareApi를 사용해 공유용 템플릿을 생성하고, 전달한다. 3. 전달 후 되돌아온다.-----받는 이-----1. 확인하러 가기 버튼을 누른다.2. -1) 앱 미설치 시 카카오 디벨로퍼스의 플랫폼에 설..
2024.07.05
-
[iOS/Swift]버튼은 한 번만 눌렀는데 View가 두 번 불린다?
아주 요상한 일이 있었다. 이미지 저장하기를 눌렀는데, 저장 완료 혹은 저장 실패 팝업이 두 번 불리는 게 아닌가?로직에서 문제가 있었나 싶어서 팝업을 호출하는 부분에 브레이크 포인트를 찍어보았는데, 브레이크 포인트도 한 번만 잡혔다!!왜 팝업 호출은 한 번 만 되는데 뷰는 두개가 불리지...? 이거 엑스코드 잘못 아니야?! 라고 괜한 탓을 해보았지만.언제나 코드는 거짓말을 안하는~ 응 동일한 뷰모델 공유한 내 잘못~현재 내 프로젝트에는 프로필 이미지를 볼 수 있는 순간이 두 번 존재한다.1. 처음에 프로필을 다 생성한 후 2. 마이 페이지에서 프로필 카드 버튼을 누른 경우뷰에는 차이가 있기에 각기 다른 뷰를 만들고 뷰모델만 공유해 줬었는데, 이때 각자 다른 뷰모델을 생성해서 넣어준 것이 아니라 DIMa..
2024.07.04
-
[iOS/Swift] UIView to UIImage without Display
요즘 IT 동아리 프로그라피에서 사이드 프로젝트를 하는 중이다. 프로필 이미지를 만들어서 보여주는 프로젝트인데, 1:1 정방향의 프로필과 3:4 세로형의 프로필 사진 구현을 보여주면서 고민이 생겼다. 디자인 상 이미지 밑의 버튼이 겹치지 않기 위해 3:4 세로형의 height를 미리 구현한 뒤 이미지로 만들어 저장하고 보여줄 때는 가로 넓이를 세로 길이에 맞추어 줄이는 형식으로 구현해야 했다.물론, 이렇게 보이는 것과는 다르게 이미지로 저장하기를 누르면 3:4의 경우 옆의 회색 없이 카드 이미지만 저장되어야 했다. 때문에 view 계층의 제일 밑에서 CardView를 그리고, 해당 UIView를 UIImage로 저장하여 불러왔다. 그런데 이때 시점의 차이 때문에 UIImage가 뜨지 않았다. 고민하다 처..
2024.07.02
-
[iOS] Image url 통해 가져와서 view에 띄우거나 갤러리 다운로드하는 방법 2가지 비교
이번에 unsplash의 api를 받아서 json 데이터를 확인해보니 신기한 점이 있었다. image는 따로 url 종류로 주어지고, 해당 url을 다시 받아와서 사용해야 한다는 것! 때문에 image를 다운로드 하여 imageView에 넣어주는 protocol을 하나 만들었다. protocol ImageViewDownloadable { var imageView: UIImageView { get set } } 그리고 extension으로 이 프로토콜을 채택하고 있다면 image를 보여줄 수도 있고, 갤러리에 다운받을 수도 있는 메서드들을 각각 구현하였다. 1. URLSession.shared.dataTask , @escaping closure 그렇게 만든 첫 방법은 dataTask의 @escaping c..
2024.02.14
-
[iOS] UICollectionViewFlowLayout으로 Pinterest Layout 구현하기
처음 과제로 받은 피그마에 Pinterest로 구현된 View를 보고, Compositional로 도전해야지! 라고 호기롭게 생각했다. 그러나 Compositional의 벽은 높았고.. item과 group, section으로 크기를 주는 것에서 item 크기들을 어떻게 다르게 줘야 할지 감이 안 잡히더라. Section별로는 쉬운데!! 다른 라이브러리들을 까보면, Compositional + Combine의 조합으로 pinterest가 구현되어 있었다. 그러나 RxSwift나 Combine을 아직 잘 모르는데, 과제 기간은 매우 짧았기에 차마 이번에 도전할 자신은 없었다. 이미 collectionView, diffable data source, compositional 등 처음 써보는 것이 산더미.....
2024.01.31
-
[iOS] Test 파일을 넣을 Asset 생성시 오류_ Bundle 사용
테스트용 JSON 파일은 이후에는 사용하지 않을 것이기에 test 폴더에 따로 Asset catalog를 만들어서 그곳에서만 넣어두고 사용하고 싶었다. 때문에 폴더를 하나 만들어서 이름을 Json.xcassets 으로 선언하고 그 안에 파일을 넣었다. 그런데 asset catalog의 모양이 기존의 것과는 달랐다. 확인해보니 asset catalog를 만들때는 단순하게 폴더를 만드는 것이 아니라 File → New → File을 타고 들어가 Resource의 Asset Catalog를 선택하여 만들어야 했다. 그 후 test code를 작성하여 돌리는데 이번에는 NSDataAsset을 가져오는 guard문에서 계속 retrun으로 빠지며 종료되었다. guard let json = NSDataAsset(n..
2024.01.28
-
[iOS] TableViewCell에서 layoutMarginsGuide 사용
테이블뷰의 Custom Cell을 설정할 때 처음에 제약조건을 ContentView에만 맞췄다. private func configureCellConstraint() { NSLayoutConstraint.activate([ contentStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), contentStackView.topAnchor.constraint(equalTo: contentView.topAnchor), contentStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), contentStackView.bottomAnchor.constraint(e..
2024.01.06
궁금증
-
[iOS] ARC_객체 수명, weak와 unowned 차이
Swift에서 struct와 같은 값 타입이 아니라, class와 같은 참조 타입을 사용하면 참조 카운트, Reference Count가 발생하게 됩니다. 이는 애플에서 메모리를 관리하는 방법으로 메모리를 할당하거나, 참조할 때 카운트를 증가시키고 사용을 완료하면 감소시킵니다.Objective -C에서는 이를 개발자가 직접 관리했었고, 그것을 MRC Manual Reference Counting 이라고 부릅니다.그리고 현재 Swift에서는 직접적으로 참조 카운트를 삽입하고 해제하는 코드를 작성할 필요 없습니다. complier가 컴파일 타임에 자동으로 구문 분석을 통해 알아서 관련 코드를 삽입하여 메모리 관리를 해주는데 이를 ARC Automatic Reference Counting이라고 합니다..
2024.03.21
-
[iOS] Swift의 컴파일러 _ LLVM
❤️ Swift Compiler _ LLVM LLVM은 2000년 일리노이 대학에서 Chris Lattner 외 몇 명으로 구성된 연구 팀에서 프로그래밍 언어의 정적 및 동적 컴파일을 모두 지원할 수 있는 현대적인 컴파일 전략을 제공하기 위한 연구 프로젝트로 시작되었다. intermediate / binary 기계 코드를 구성, 최적화, 생성하는 데 사용되는 라이브러리로 프로그래머가 작성한 코드를 컴퓨터가 읽을 수 있는 intermediate, binary 코드로 컴파일 하는데 사용된다. 📒 컴퓨터의 하드웨어는 Binary Code만 읽을 수 있다. 때문에 우리가 작성한 코드들을 하드웨어가 읽을 수 있게 바꿔주는 작업을 거쳐야 하는데 이때 Intermediate Representation, 즉 중간표현을..
2024.03.12
-
[NSCache&URLCache]왜 이미지 파일이 URLCache에서 메모리가 아닌 디스크에 저장될까?
데이터들은 어디에 저장되고 어떻게 사용될까? 먼저 하드 디스크에 우리의 데이터들이 전부 저장된다. 때문에 하드 디스크는 용량이 매우 크고, 기억을 하는 것에 치중되어 있다. RAM, 메모리는 그러한 하드 디스크에서 앱을 실행하는데에 필요한 중요 데이터들을 들고 있다. 그러나 여전히 내용은 방대하고, RAM은 디스크보단 기억할 수 있는 양이 적고, CPU와 가까워서 빠르지만 어찌 되었건 기억을 하는 것에만 능력이 치중되어 있다. CPU는 RAM에서 받은 데이터들을 이용해 앱을 실행한다. 기억보다는 성능이 중요해, 꾸준하게 성능이 업그레이드 되어 왔다. 때문에 RAM과 CPU는 기억과 성능으로 각자의 목적이 다르기에 서로서로 성능차이가 점점 심하게 나게 된다. RAM이 CPU를 쫓아가지 못해 CPU가 RAM..
2024.01.28
-
[UIKit]loadView에 view는 언제 할당될까?
코드베이스로 짠 코드에서 실험해 본 내용이다. 예상으로는, super.loadView()가 실행되기 전까지는 view가 nil이기 때문에 값이 없을 것이라고 생각했다. 때문에 LLDB로 view를 loadView() 함수 내부에서 찍어보았다. 그런데 예상과는 다른 일이 있었다. super.loadView()가 불리기 전에 po view로 찍어보니, loadView와 loadView끝이 찍히더니, 값이 뜨는 것이다! 참고로 옆에 UIViewController의 view는 (id) 0x0으로 할당되어 있지 않았다. 오류인가? 왜 view가 찍히지? 그래서 loadView()를 여러번 찍어보고 하나씩 내려가면서 po view를 찍어보니, 매번 새로운 view가 출력되었다. If you access this p..
2024.01.27
-
[Swift]super.init()이 반드시 필요했던 경우
super.init()에 대해서 이것저것 찾아보다 신기한 경우를 찾았다. class A { init(some: String) { print("a") } } A와 같이 매개변수가 있는 init의 경우에는, 상속을 해서 내부에 변화를 줄 때 class B: A { override init(some: String) { super.init(some: some) print("b") } } 반드시 super.init을 불러야 한다는 에러 메세지가 떴다. 2단계 초기화에서 보면, customize된 초기화는 1. superClass와 subclass가 있을 때 subClass 초기화 2. superClass 초기화 순으로 올라간 후 3. superClass에서부터 값이 할당 되는 과정을 거친다. 이처럼 overrid..
2023.11.08
개념
-
[Network] TLS/SSL
암호화 통신 프로토콜SSL(Secure Socket Layer) / TLS(Transport Layer Security)는 모두 웹 브라우저와 웹 서버 간 통신을 암호화하는 프로토콜이다. SSL은 웹 브라우저 개발사에서 만든 프로토콜로 인터넷 기술 표준화 단체인 IETF가 TLS로 다시 설계하여 인터넷 표준으로 삼았다.📖 장점기밀성(암호화) : 서버와 주고 받는 데이터가 스니핑 되는 것을 방지한다.데이터 무결성 : 패킷 전달 과정에서 데이터가 제 3자에 의해서 악의로 변경되는 것을 방지한다.서버 인증 : 서버가 신뢰할 수 있는 서버라는 것을 확인한다.📖 암호화TLS는 보안과 성능상의 이유로 두 가지 암호화 방법을 혼용해서 사용한다. 암호화를 위해서는 키가 필요하다.이때 암호화와 복호화에 사용하는 키는..
2024.10.28
-
[패러다임] 함수형 프로그래밍
소프트웨어를 구축하는 패러다임에는 함수형 프로그래밍, 객체 지향 프로그래밍 등이 있다. 이때 함수형 프로그래밈은 프로그램의 상태 변경과 가변 데이터 사용을 최소화하고, 순수 함수와 불변 데이터를 강조하는 프로그래밍하는 접근 방식이다. 한 마디로 사이드 이펙트가 없는 기능을 만드는 것에 집중하는 프로그래밍 방식으로 코드의 가독성과 유지보수성을 높이고, 부작용(Side Effect)을 줄이는 것을 목표로 한다. 여러가지 특징들에 대해서 좀 더 자세히 알아보자. Random 함수는 절대 순수할 수 없다.순수 함수란 무엇일까? 동일한 Input에는 언제나 동일한 Output을 하는, 사이드 이펙트가 발생하지 않는 함수이다. 때문에 예측이 가능하고, 테스트하기 쉬운 코드 작성할 수 있다. 그러나 Random 함수..
2024.10.23
-
[iOS]Unit Test의 사용
이번 과제를 진행하면서 가장 필요성을 절실히 느꼈던 것이 바로 이 test였다. 여기까지는 문제가 없다는 것을, 안전하다는 것을 확신하고 다음 코드를 짜고 싶은 그 마음..!! 그런데 마침 활동학습에서 Unit Test와 TDD가 나왔길래, 정리해보았다. Unit Test Unit Test는 메서드별 기능이 의도한 대로 구현되어 있는지 검증하는 것이다. 소스 코드의 특정 모듈이 의도된대로 정확히 작동하는지 검증하는 절차를 통해 작성한 코드의 안정성을 부여한다. 그렇다면 어떤 Test를 작성해야 할까? FIRST 원칙 Fast 빠르게 Independent / Isolated 독립적으로 Repeatable 반복 가능한 Self-Validating 스스로 검증하는 Timely 적시에 F. 테스트라는 목적에 맞..
2024.02.05
-
[디자인 패턴]Delegate Pattern
delegate pattern은 주로 화면의 전환에서 사용된다. 화면은 어떻게 전환될까? 1번 화면과 2번 화면이 있다. 다시 말해, 1번 view controller와 2번 view controller가 있다. 1번 view controller에서 버튼을 눌러 2번 view controller로 화면이 넘어갈 때, 1번 화면은 단순히 사라지는 것이 아니다. 2번 화면이 1번 화면의 위에 쌓이게 되는 것이다. 이때 2번 화면이 생기면서 2번 view conroller는 초기화되어 생성되는 것으로 1번 view controller로부터 정보들을 받아오게 된다. 그런데 만일 2번 화면에서 뒤로가기 버튼으로 다시 1번 화면으로 돌아가게 되면 어떻게 될까? 1번 화면이 나오면서 새롭게 1번 view contro..
2024.01.27
-
[디자인 패턴]Observer Pattern
옷가게에서 일할 때 있었던 일이다. 우리는 무작위적으로 할인 행사를 열었는데 타이밍을 놓친 손님들이 한결같이 투덜거리고는 했다. 할인 할 때 문자 좀 주면 좋겠다고. 매번 며칠 전까지 할인 했다는 걸 알고 나면 속상하다고. 옵저버 패턴은 이러한 손님들을 위한 문자 발송과 같다. “관찰자”라는 단어를 보면 해당 이름표를 달고 있는 객체는 어떠한 역할을 수행할 것 같은가? 누군가를 면밀히 지켜보는 역할은 아닐까? 옵저버 패턴에서는 이 옵저버의 의미가 조금 다르다. 단순히 지켜본다, 보다는 `연락을 기다린다`라는 것이 더 옳은 표현일 것이다. 마치 옷가게 할인 행사 문자를 기다리는 손님과 같다. 옷가게를 주시하고, 관찰하지만 결국 옷가게에서 문자를 보내주어야 손님은 행동을 결정할 수 있다. 옷가게를 들릴지, ..
2024.01.27
Deploy
-
[Reject] Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage
5.1.1(ii) PermissionApps that collect user or usage data must secure user consent for the collection, even if such data is considered to be anonymous at the time of or immediately following collection. Paid functionality must not be dependent on or require a user to grant access to this data. Apps must also provide the customer with an easily accessible and understandable way to withdraw consent..
2024.09.01
-
[Reject] Guideline 2.3.3 - Performance - Accurate Metadata
2.3.3Screenshots should show the app in use, and not merely the title art, login page, or splash screen. They may also include text and image overlays (e.g. to demonstrate input mechanisms, such as an animated touch point or Apple Pencil) and show extended functionality on device, such as Touch Bar.Issue DescriptionSome or all of the provided screenshots do not sufficiently show the app in use. ..
2024.09.01
-
[Reject] Guideline 2.1 - Performance - App Completeness
(a) Submissions to App Review, including apps you make available for pre-order, should be final versions with all necessary metadata and fully functional URLs included; placeholder text, empty websites, and other temporary content should be scrubbed before submission.Make sure your app has been tested on-device for bugs and stability before you submit it, and include demo account info (and turn ..
2024.08.31
-
[Reject] Guideline 1.5 - Safety
1.5 Developer InformationPeople need to know how to reach you with questions and support issues. Make sure your app and its Support URL include an easy way to contact you; this is particularly important for apps that may be used in the classroom. Failure to include accurate and up-to-date contact information not only frustrates customers, but may violate the law in some countries or regions. Als..
2024.08.31