투표로 관계의 재미를 찾아가는 서비스, YELL:O
https://testflight.apple.com/join/9xqm0VQa
👑 정채은 | 변희주 | 이지희 |
---|---|---|
chaentopia | Heyjooo | Zoe0929 |
추천친구, 내 옐로, 프로필 | 투표 (옐로하기) | 온보딩 |
아 옐로💛를 위해 코드짜고 있었는데 미치겠다 |
히주가 ??? 개발하고 싶대 답 : 옐로 💛 |
행복한 노란색 개발자 💛 |
1. Alamofire
- 서버 통신을 위한 관련 라이브러리
2. KakaoOpenSDK
- 카카오 소셜 로그인을 위한 라이브러리
3. KingFisher
- 서버 통신의 이미지를 가져오기 위한 라이브러리
4. Lottie
- 애니메이션 효과를 가진 뷰를 구현하기 위한 라이브러리
5. SnapKit
- Code base 개발을 원활하게 도와주는 라이브러리
6. SwiftKeychainWrapper
- Keychain을 관리해주는 라이브러리
7. Then
- Code base 개발을 원활하게 도와주는 라이브러리
1. 내가 구현할 기능이 생겼다면 ?? 일단 이슈를 판다 -> TodoList 작성하자 !
2. 만든 Issue에 해당하는 작업을 수행할 Feat 브랜치를 만든다 (ex: feat/#<이슈번호>)
3. 열심히 작업한다음 Add - Commit - Push를 한다 ! 그러면 remote에 내가 작업한 내용이 올라가겠죠 !
4. main 브랜치로 Pull Request를 날린다 : main브랜치랑 비교해서 내 브랜치에 생긴 변경사항을 봐주세요 ~ 이런느낌이라고 생각하면 되겠죠 ??
5. Pull Request가 작성되면 작성자 이외의 다른 팀원이 Code Review를 한다 !!
6. Code Review가 완료되면 내가 작업하던 브랜치에 이어서 수정작업을 거친다.
7. 수정작업한 것을 push 하면 pull request 밑에 추가됨 !!
8. Approve를 받은 다음, main branch를 pull 받는다.
- 왜 ?? pull request 날린 이후에 내가 코드리뷰 반영하고 이것저것 수정하는 동안 누군가 머지를 해서 main이 바꼈을 수도 있기 때문 !!
- 안전하게 가장 최신의 main을 가져오기 위해 pull을 해주는겁니당 !! : conflict 해결
9. Pull Request 작성자가 main Branch로 merge ! 끝.. !
**릴리즈 관리를 위해서 develop 브랜치와 main 브랜치를 분리합니다.**
📦 YELLO-iOS
┣ 📜 .swiftlint
┣ 📂 Storyboard
┃ ┣ 📜 LaunchScreen
┃
┣ 📂 Application
┃ ┣ 📜 Appdelegate
┃ ┣ 📜 SceneDelegate
┃
┣ 📂 Global
┃ ┣ 📂 Extension
┃ ┣ 📂 Literals
┃ ┃ ┣ 📜 Image
┃ ┃ ┣ 📜 String
┃ ┣ 📂 Resources
┃ ┃ ┣ 📂 Font
┃ ┃ ┣ 📜 Font
┃ ┃ ┣ 📜 Color
┃ ┃ ┣ 📜 Assets
┃ ┃ ┣ 📜 Info.plist
┃ ┣ 📂 Protocols
┃
┣ 📂 Presentation
┃ ┣ 📂 Base
┃ ┣ 📂 Splash
┃ ┣ 📂 Onboarding
┃ ┃ ┃ ┣ 📂 ViewController
┃ ┃ ┃ ┣ 📂 Views
┃ ┃ ┃ ┣ 📂 Cells
┃ ┣ 📂 Tabbar
┃ ┣ 📂 Inviting
┃ ┣ 📂 Voting
┃ ┣ 📂 Recommending
┃ ┣ 📂 Around
┃ ┣ 📂 MyYello
┃ ┣ 📂 Profile
┃
┣ 📂 Network
┃ ┣ 📂 Base
┃ ┣ 📂 Onboarding
┃ ┃ ┃ ┣ 📂 DTO
┃ ┃ ┃ ┃ ┣ 📂 Request
┃ ┃ ┃ ┃ ┣ 📂 Response
┃ ┃ ┃ ┣ 📂 Router
┃ ┃ ┃ ┣ 📂 Service
┃ ┣ 📂 Recommending
┃ ┣ 📂 Voting
┃ ┣ 📂 MyYello
┃ ┣ 📂 Profile
이름 | 스크린샷 | 설명 |
---|---|---|
Splash | DispatchQeue 를 이용해서 스플래쉬가 2.3초 재생 후에 로그인 화면으로 이동하도록 구현했습니다. 로고 부분의 애니메이션은 Lottie 파일을 이용해서 한번만 재생되도록 설정했습니다. ( 참고: SceneDelegate.swift) |
|
카카오로그인 | 카카오 로그인 API를 이용해서 소셜 로그인을 구현했습니다. 카카오톡 설치 여부를 확인해서 카카오톡이 설치되어있지 않다면 카카오 계정으로 로그인하도록 분기처리를 했습니다. 소셜 로그인에 성공한다면 카카오톡 유저의 정보를 자체 API를 통해 서버에 전달합니다. UserDefault 를 이용해서 로그인 여부를 저장하여 자동로그인을 구현합니다. |
|
카카오 친구 연결 | �카카오 소셜 API를 연결하여 User의 친구 정보를 전달받아 자체 서버로 전송합니다. (현재 카카오에서 API 이용 관련 인가를 해주지 않아서 Team Member만 친구 연결이 가능합니다.) | |
학교 입력 | 학교 정보를 입력합니다. UITextFieldDelegate 를 이용해서 텍스트 필드에 입력(focusing)이 감지되면 새로운 모달뷰를 띄워 학교 검색을 진행합니다. 현재 학교가 추가되어 있지 않다면 helperButton 을 통해 구글 폼으로 연결됩니다.학교 검색을 하는 새로운 모달뷰에서는 TextField 에 addTarget 을 통해 textFieldDidChange 을 연결합니다. 이 때 이벤트는 'editingChanged'를 감지시켜서 변화하는 값을 실시간으로 사용할 수 있도록 구현했습니다. 이를 이용해서 입력에 대한 실시간 검색을 진행합니다. 학과 검색에 대한 결과는 테이블뷰로 표시되며 한 페이지당 10개씩 전달을 받아 무한 스크롤을 구현했습니다. 자세한 구현 사항은 트러블슈팅에 기록하였습니다. 그 후 테이블 셀을 선택하면 tableViewDelegate 를 이용해서 선택한 셀에 대한 정보를 저장하고 delegate에 의해 이전뷰에 정보가 전달됩니다.텍스트 필드에 값이 입력되게 되면 custom TextField인 YelloTextField의 상태가 변화하게 되고 변화된 UI가 적용됩니다. |
|
학과, 학번 정보 입력 | 학과 검색은 학교 검색과 같은 뷰와 기능을 가지고 있습니다. 따라서 BaseSearchViewController 를 이용해서 컴포넌트와 기능 구현을 재사용하도록 작성했습니다. 학과 검색 뷰에서 해당하는 학과를 선택하면 tableViewDelegate 를 이용해서 선택한 셀에 대한 정보를 저장하고 delegate에 의해 이전뷰에 정보가 전달됩니다. 이 때는 그룹에 대한 아이디가 함께 전달되어 추후 학교 친구를 찾을 때 사용하게 됩니다.학번에 대한 정보를 저장할 때는 iOS 16 이상의 기기에서는 sheetPresentationController 을 이용해서 하프 모달 뷰를 present하도록 구현했고 그 이하의 기기에서는 커스텀된 하프 모달뷰를 사용했습니다. |
|
�이름, 아이디 입력 부분 | 이름과 아이디를 입력합니다. 정규식을 통해 이름은 한글만 입력할 수 있도록, 아이디는 소문자와 숫자,온점(.), 밑줄(_)만 입력이 가능하도록 제한했습니다. UITextFieldDelegate 를 이용해서 텍스트필드의 입력이 끝났음을 감지하고 이외의 입력이 입력되었을 때는 TextField의 UI를 업데이트합니다. 서버 통신을 통해 아이디 중복성을 검사하여 아이디가 중복될 경우에는 에러 UI를 업데이트합니다. |
|
카톡 친구 추가 | 카카오 소셜 연결로 가져온 친구 목록 중 옐로에 가입한 친구들만 보이도록 API를 이용해서 검색하고 테이블 뷰를 이용해서 사용자에게 보여줍니다. 이때, 학교검색과 학과 검색에 사용한 무한 스크롤 방식을 이용해서 무한 스크롤을 구현했습니다. | |
추천인 코드 | 추천인 코드를 입력하는 뷰입니다. 이전에 사용했던 ID 중복성 API를 이용해서 추천인 코드에 해당하는 ID가 존재하는지에 대해 검색하고 존재하는 아이디가 아닌 경우에는 에러 TextField UI로 업데이트합니다. 건너뛰기를 하게 되면 추천인 코드에는 빈 문장(””)아 입력되게 됩니다. | |
온보딩 완료 뷰 | 온보딩 완료 안내 화면입니다. Lottie를 이용해서 애니메이션을 구현하였습니다. 이전에 입력한 정보들은 User라는 싱글톤 객체에 저장이 되어 옐로하러가기 버튼을 클릭 시 서버에 POST로 전송됩니다. |
프로젝트를 진행하며 어려웠던 점에 대해 트러블 슈팅을 작성했습니다.