안양대학교의 학생들은 학식을 확인하기 위해 주로 안양대학교의 웹사이트에 직접 들어가 확인해야 했습니다. 이를 개선하기 위해 바로 학식의 정보를 바로 알려줄 수 있는 앱을 만들었습니다.
- 1인 개발
- iOS 15.0+
- watchOS 9.0+
- 학식 정보를 받는 기능
- 학식 날짜별 좋아요 기능
- SwiftUI
- Alamofire
- MVVM
- Node.js
- WatchOS
- 기존에는 SwiftSoup와 CoreData를 이용하여 일주일에 한번 웹 사이트를 크롤링 해오는 식으로 구현
- 학교 서버에 대한 부담을 덜기 위함과, 좋아요 기능등의 추가를 이유로 Node.js 서버를 만들어 도입
1. SwiftSoup을 사용한 데이터 파싱 시 발생하는 예외 처리 문제, Node.js 서버를 도입하여 서버 업데이트로 예외처리를 가능하게 구현, 또한 유저 당일주일에 한번씩 요청에서 서버에서 요청 1회만으로 파싱 요청을 크게 줄임
func fetchMeal() {
if let url = URL(string: urlString) {
do {
let webString = try String(contentsOf: url)
let document = try SwiftSoup.parse(webString)
if let inputElement = try document.select("input#mealList").last() {
let value = try inputElement.attr("value")
// ....
}
func callRequest(_ kind: APIURLs) {
let manager = APIRequestManager()
manager.callRequest(kind.type, api: kind) { result, error in
if case .call = kind {
self.meals?.data = result as? [Meal]
}
self.meals?.error = error
}
}
2. 서버의 속도가 빠르지 않아 사용자 경험 저하 이슈, 기존에는 정보를 받아오기 전까지 ‘학식 정보가 없습니다’를 오랫동안 표기 하였으나 Alamofire의 Request 구문을 전/후로 나누어 각기 다른 문구를 표시하여 사용자 경험 개선
Group {
if meals.isEmpty {
Text("학식 정보가 없습니다.\n이번주가 휴무 이거나,\n방학일 가능성이 있습니다.\n\n\n그것도 아니라면\n개발자가 열심히 작업중입니다.")
.multilineTextAlignment(.center)
.font(.title)
} else {
List {
ForEach(meals, id: \.self) { item in
Section {
Text(item.date ?? Date(), formatter: dateformatter)
.foregroundStyle(.secondary)
Text(item.meal ?? "정보없음")
}
}
}
}
}
@ViewBuilder
private var mainView: some View {
switch viewModel.responseState {
case .successAndEmptry:
mealEmptyView
case .fail:
mealFailView
case .success:
mealView
case .load:
mealloadView
}
}
📦AnyangMeal
┣ 📂Extension
┣ 📂Model
┣ 📂Service
┣ 📂View
┃ ┣ 📂InfoView
┃ ┃ ┗ 📂View
┃ ┗ 📂MainView
┃ ┣ 📂View
┗ ┃ ┗ 📂ViewModel
뷰 | 이미지 |
---|---|
메인 뷰 |