|
3 | 3 |
|
4 | 4 | <div align="center">
|
5 | 5 |
|
6 |
| - |
7 |
| -<center><a href="https://drive.google.com/file/d/1CNYS-sfW_2_-8XrEFUkVxtWWV8voyOw8/view?usp=sharing">🌈 기획서<a href="https://github.com/boostcampwm-2021/iOS01-Booster/wiki">📁 위키<br></a> |
8 |
| -<br> |
9 |
| - |
10 |
| -[](https://hits.seeyoufarm.com)<br> |
11 |
| -[](https://developer.apple.com/kr/swift/) [](https://developer.apple.com/kr/xcode/) |
12 |
| -[](https://cocoapods.org/) [](https://github.com/realm/SwiftLint) [](https://github.com/realm/SwiftLint) |
13 |
| -</center> |
14 |
| -</div> |
15 |
| - |
16 |
| ---- |
17 |
| - |
18 |
| - |
19 | 6 | ## 멤버
|
20 | 7 | <div align="center">
|
21 | 8 | <center>
|
22 |
| - |
23 |
| -| <img src="https://cdn4.iconfinder.com/data/icons/logos-3/504/Swift-2-512.png" width=15px> S014_김태훈 | <img src="https://cdn4.iconfinder.com/data/icons/logos-3/504/Swift-2-512.png" width=15px> S025_신명섭 | <img src="https://cdn4.iconfinder.com/data/icons/logos-3/504/Swift-2-512.png" width=15px> S050_이하원 | <img src="https://cdn4.iconfinder.com/data/icons/logos-3/504/Swift-2-512.png" width=15px> S060_최희주 | |
| 9 | + |
| 10 | +|<img src="https://i.imgur.com/wIXr1QY.png" width=18px> <b style="color:#FF5C00">S014_김태훈</b> | <img src="https://i.imgur.com/wIXr1QY.png" width=18px> <b style="color:#FF5C00">S025_신명섭</b> | <img src="https://i.imgur.com/wIXr1QY.png" width=18px> <b style="color:#FF5C00">S050_이하원</b> | <img src="https://i.imgur.com/wIXr1QY.png" width=18px> <b style="color:#FF5C00">S060_최희주</b> | |
24 | 11 | |:-:|:-:|:-:|:-:|
|
25 | 12 | |<img src="https://i.imgur.com/I3g5HkU.png" width="150">|<img src="https://i.imgur.com/GNC10jI.png" width="150">|<img src="https://i.imgur.com/jFNY6Sy.png" width="150">|<img src="https://i.imgur.com/cdOsNrV.png" width="150">
|
26 | 13 | | [@KTH-INHA-16](https://github.com/KTH-INHA-16) | [@s1gnature](https://github.com/s1gnature) | [@Hani-Levenshtein](https://github.com/Hani-Levenshtein) | [@rose6649](https://github.com/rose6649) |
|
27 | 14 |
|
28 | 15 | </center>
|
29 | 16 | </div>
|
| 17 | +<center> |
| 18 | +<h2></h2> |
| 19 | +<h2><a href="https://drive.google.com/file/d/1CNYS-sfW_2_-8XrEFUkVxtWWV8voyOw8/view?usp=sharing">🌈 기획서</a> |
| 20 | +<br> |
| 21 | +<br> |
| 22 | +<a href="https://github.com/boostcampwm-2021/iOS01-Booster/wiki">📁 위키</a><br> |
| 23 | +<br> |
| 24 | +</h2> |
| 25 | +<br> |
30 | 26 |
|
31 |
| -## 팀 룰 |
32 |
| -- 시간 약속 🕑 |
33 |
| - - 체크인 10:00 |
34 |
| - - 점심 12:00 ~ 13:00 |
35 |
| - - 회의 시 40분마다 10분씩 휴식시간 |
36 |
| -- 매일 아침 스크럼을 진행하고 issue에 `🗣 데일리스크럼 & 회고` 라벨을 붙여 스크럼 결과를 작성합니다. |
37 |
| - - 이후 저녁 회고는 자율적으로 작성합니다. |
38 |
| -- 주 회고는 매주 금요일 18:00 ~ 19:00에 이야기 한 내용을 바탕으로 작성합니다. |
39 |
| - |
40 |
| -## 커밋 컨벤션 |
41 |
| -**커밋 메세지 룰 (대괄호 없고, 소문자)** |
42 |
| -> `prefix: ~~~` |
43 |
| -KEYWORD 목록 |
44 |
| -- `add:` 기능 및 코드의 추가가 있을 때 사용합니다. add: |
45 |
| -- `fix:` 올바르지 않은 동작을 고친 경우에 사용합니다. |
46 |
| -- `delete:` 코드의 삭제가 있을 때 사용합니다. |
47 |
| -- `refac:` 코드의 '재건축'이 있을 때 사용합니다. (결과는 같게, 코드는 다시 짜기) |
48 |
| -- `setting:` 프로젝트의 설정에 관련된 사항이 있을 때 사용합니다. → 리더 전용 👑 |
49 |
| -- `docs:` readme와 관련된 문서 작성 및 수정이 있을 때 사용합니다. |
50 |
| - |
51 |
| -## 코드 컨벤션(Swift Lint) |
52 |
| -[GitHub - StyleShare/swift-style-guide: StyleShare에서 작성한 Swift 한국어 스타일 가이드](https://github.com/StyleShare/swift-style-guide#%EB%B3%80%EC%88%98) |
53 |
| - |
54 |
| -축약어 지양(btn, img 금지!) |
55 |
| -한줄 길이 제한: Swift Lint Default 설정을 따름 |
56 |
| - |
57 |
| -```swift |
58 |
| -/* 컨벤션 템플릿 */ |
59 |
| -(열려있는 순서) 사이사이 띄어쓰기 |
60 |
| -static |
61 |
| -internal |
62 |
| -private |
63 |
| -let |
64 |
| -var |
65 |
| -computed property |
66 |
| - |
67 |
| -// MARK: - Enum |
68 |
| - |
69 |
| -// MARK: - @IBOutlet |
70 |
| - |
71 |
| -// MARK: - Variables |
| 27 | +[](https://hits.seeyoufarm.com)<br> |
| 28 | +[](https://developer.apple.com/kr/swift/) [](https://developer.apple.com/kr/xcode/) [](https://www.figma.com/) |
| 29 | +[](https://cocoapods.org/) [](https://github.com/ReactiveX/RxSwift/) |
| 30 | +</center> |
| 31 | +</div> |
| 32 | +<br> |
| 33 | +<H1> |
| 34 | +</H1> |
| 35 | +<br> |
| 36 | +<div> |
| 37 | +<center> |
| 38 | + <img src="https://i.imgur.com/6BZsKkQ.png" width=120px><br><br> |
| 39 | + <H3>부스터는 <b style="color:#ff5c00">오늘의 걸음 수</b>를 보여주고<br><br> |
| 40 | + 걸음을 <b style="color:#ff5c00">트래킹</b>하면서<br><br> |
| 41 | + <b style="color:#ff5c00">산책 기록을 모아</b> 추억을 쌓는 🍎 iOS 앱입니다 |
| 42 | + </H3> |
72 | 43 |
|
73 |
| -// MARK: - Subscript |
74 | 44 |
|
75 |
| -// MARK: - viewDidLoad or init |
| 45 | +##### 산책으로 오늘 하루도 힐링해보시는 건 어떠세요? 🚶🚶🏼🚶🏼 |
| 46 | +</div> |
| 47 | +</center> |
| 48 | + |
| 49 | +<br> |
| 50 | +<br> |
| 51 | + |
| 52 | +## 설치 방법 |
| 53 | + **Booster를 직접 사용해 보아요 🚀🔥** |
| 54 | +1. Xcode 13(권장) 이상과 Cocoapods이 설치되어있어야 합니다. |
| 55 | + > `brew install cocoapods` - Cocoapods 설치 |
| 56 | +2. 프로젝트를 로컬에 클론 하게 되면 프로젝트 디렉토리에서 |
| 57 | + `pod install`을 실행 시켜 주세요. |
| 58 | +3. 이후 Booster.xcworkspace를 실행 한 이후 `command + R`을 통해 체험 가능합니다. |
| 59 | +<br> |
| 60 | +<br> |
| 61 | + |
| 62 | +## 기능 소개 |
76 | 63 |
|
77 |
| -// MARK: - @IBActions |
| 64 | +| 오늘의 걸음 수 ✨ | 걸음 수 통계 ✨ | 산책 트래킹 ✨ | |
| 65 | +| -------- | -------- | -------- | |
| 66 | +| <img src="https://i.imgur.com/n0ZJPhL.jpg" width=200px> | <img src="https://i.imgur.com/NfQ9oz1.jpg" width=200px> | <img src="https://i.imgur.com/A1li5NA.png" width=200px> | |
78 | 67 |
|
79 |
| -// MARK: - @objc |
| 68 | +| 산책 기록들 ✨ | 하나의 기록도 소중히 ✨ | 마이페이지 ✨ | |
| 69 | +| -------- | -------- | -------- | |
| 70 | +| <img src="https://i.imgur.com/pPI6gVY.png" width=200px> | <img src="https://i.imgur.com/7OTm0N8.png" width=200px> | <img src="https://i.imgur.com/XHpNEXG.png" width=200px> | |
80 | 71 |
|
81 |
| -// MARK: - functions |
82 | 72 |
|
83 |
| -``` |
| 73 | + |
| 74 | +<br><br> |
| 75 | +## 아키텍쳐 |
| 76 | +> Booster에서 사용한 아키텍쳐를 도식화한 이미지입니다. |
| 77 | +> MVVM을 기본으로 하는 아키텍쳐 입니다. |
84 | 78 |
|
| 79 | + |
85 | 80 |
|
| 81 | +ViewModel이 각 Manager들에 접근해야 하는데, 해당 로직을 ViewModel에서 모두 처리하기에는 ViewModel의 크기가 커지기에 UseCase를 남겨두고 해당 비지니스 로직을 UseCase에서 처리했습니다. |
| 82 | +> [🍌참고](https://github.com/boostcampwm-2021/iOS01-Booster/wiki/MVVM%3F-or-Clean-Architecture-%EA%B3%A0%EC%B0%B0%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B2%B0%EA%B3%BC) |
86 | 83 |
|
87 |
| ---- |
| 84 | +<br><br> |
| 85 | + |
| 86 | +## 프레임워크 |
| 87 | +> Booster에서 사용한 프레임워크 입니다. |
| 88 | + |
| 89 | + |
| 90 | + |
| 91 | +#### HealthKit |
| 92 | +- 같은 애플 계정을 공유하는 기기간 연동된 건강 데이터를 활용하기 위해 선택하였습니다 |
| 93 | +- 앱을 다운로드 받기 전과 트래킹하지 않았을 때의 걸음 수까지 보여주기 위해 사용하였습니다 |
| 94 | +- 트래킹 정보를 저장한 뒤, 건강 앱에도 기록되어 이 정보를 앱에 함께 불러올 수 있었습니다 |
| 95 | + |
| 96 | +#### CoreData |
| 97 | +- 네트워크 상황에 관계 없이 기록을 저장하고 보여주기 위하여 사용하였습니다 |
| 98 | +- NSPredicate 사용해 CRUD를 구현하여 CoreData에 접근을 용이하게 하도록 구현하였습니다 |
| 99 | +- 동시성을 위해 main loop가 아닌 private context(child context)를 활용하였습니다 |
| 100 | + |
| 101 | +#### MapKit |
| 102 | +- 다른 라이브러리를 이용하지 않고, 애플 지도를 이용하여 사용자의 트래킹 정보를 표현하기 위해 사용하였습니다 |
| 103 | +- 트래킹한 사용자의 위치 정보를 지도상에 나타내기 위해 MKPolyLine을 이용하였습니다 |
| 104 | +- 사용자의 현 위치에 마일스톤 기록을 남기기 위하여 MKAnnotationView를 커스텀 하여 표현하였습니다 |
| 105 | + |
| 106 | +#### RxSwift |
| 107 | +> 계기 |
| 108 | +- escaping closure와 같은 비동기 처리가 많아졌고, 이를 처리하는 방식이 매개변수와 같이 있어 다른 방법으로 표현할 수 없을까 고민하였습니다 |
| 109 | +- 데이터 바인딩, UI 이벤트 처리에 대한 코드가 나눠져서 불편함이 생겨 코드를 보았을 때 이해하기 쉽도록 하고 싶었습니다 |
| 110 | + |
| 111 | +> 도입 결과 |
| 112 | +- IBAction/UIGesture와 Target method를 통합하여 하나의 스트림으로 표현할 수 있었습니다 |
| 113 | +- escaping closure에서 벗어나 리턴값으로 Observable을 사용하게 되면서 간결한 코드로 나타낼 수 있었습니다 |
| 114 | +- 기존에 직접 만든 Observable 클래스 만으로는 할 수 없었던 NSObject에서도 Rx에 관한 작업들을 할 수 있었습니다 |
| 115 | + |
| 116 | +#### CoreLocation |
| 117 | +- 디바이스의 위치 정보를 추적하여 사용자의 위치를 실시간으로 추적하고자 사용하였습니다 |
| 118 | +- 사용자의 위치에 대한 위도/경도 정보를 통해 지역명으로 받아오고자 CLGeocoder를 이용했습니다 |
0 commit comments