사회에 첫 발걸음을 내딛기 전 필수 요소라고 할 수 있는 인턴 경험, 어떻게 준비해야할 지 막막하다면?
인턴을 처음 준비하는 대학생에게, 인턴을 준비하지만 어려움을 겪고 있는 대학생에게, 인턴을 경험했거나 하고 있는 대학생에게
가장 먼저 생각나는 서비스가 되길 바라며 제안하게 되었습니다.
- 개발 기간 : 2019년 12월 21일 ~ 2020년 1월 3일
- 커밋 메세지는 영어로
- 변수 명은 low camel 사용
- 강제 옵셔널 금지
- 각자 분담한 스토리보드 외에 건들기 금지
- 커밋시 반드시 서로에게 알릴것
- pod 'Alamofire', '~> 4.8.2'
- pod 'Kingfisher', '~> 4.10.1'
- pod 'CHIPageControl', '~> 0.1.3'
- pod 'Tabman', '~> 2.6'
- pod 'FSCalendar'
- 11.3
기능 | 개발 여부 | 기타사항 | 담당 |
---|---|---|---|
스플래쉬 | ○ | 주연 | |
온보딩 | ○ | 어플 첫 실행 시 동작 | 담 |
로그인 | ○ | 주연,담 | |
회원가입(기본정보) | ○ | 이메일 중복 체크 ○ | 담 |
회원가입(관심직무 + 프로필 설정) | △ | 첫 번째 로그인 한 경우에만 지정 | 담 |
프로필 설정 | △ | 첫 번째 로그인 한 경우에만 지정 | 담 |
홈(맞춤 공고) | △ | 회사 url 연결 | 담 |
홈(추천 프로필) | △ | 상세 프로필 연결 | 담 |
홈(오늘의 스토리) | △ | 상세 스토리뷰 연결 | 담 |
공고 | ○ | 전체공고 / 지난 공고 순으로 정렬 | 담 |
공고 추가 | ○ | 관심있는 공고를 캘린더 일정에 추가 | 담 |
공고 필터 | △ | 보고 싶은 직무를 필터에 따라 설정 | 담 |
공고 캘린더 | ○ | 월별 공고 조회, 추가한 공고 리스트를 캘린더에 표시 | 담 |
스토리 | ○ | 최신순 / 조회순 정렬 | 담 |
카테고리 별 스토리 조회 | 인턴 / 대외활동 / 공모전 / 동아리 / 자격증 / 기타 에 따라 조회 | 담 | |
스토리 상세글 | ○ | 담 | |
스토리 댓글 | ○ | 댓글보기 + 댓글쓰기 | 담 |
개인 프로필 | △ | 정보: 회원가입시의 한 줄 소개 + 프로필 사진 + 관심 직무 | 주연 |
개인 프로필 쪽지 | ○ | 대화를 나눈 유저 리스트 | 주연, 담 |
개인 프로필 쪽지 상세 내용 | △ | 주연 | |
개인 프로필 타임라인 조회 | ○ | 주연 | |
개인 프로필 타임라인 추가 | △ | 플러팅버튼을 통해 타임라인 추가 | 주연 |
타임라인 스토리 리스트 조회 | ○ | 주연, 담 | |
개인 프로필 스토리 추가 | △ | 주연 | |
개인 프로필 스토리 팔로우 리스트 | ○ | 주연, 담 |
- splash
- onBoarding
- Login & Signup
- FirstLogin
- home tab : 추천 공고, 추천 프로필, 최신 스토리
- announcement tab
- 전체 공고, 지난 공고 정렬 선택
- 공고 필터 : 보고 싶은 직무 1개 선택, 필터에 따라 정렬
- 공고 캘린더 : 관심 추가한 공고를 캘린더에 추가
- story tab
- 스토리 최신순, 조회순 정렬
- 탭 바 : 인턴, 대외활동, 공모전, 동아리, 자격증, 기타에 따른 스토리 조회
- 스토리 상세글
- 스토리 댓글
- profile tab
- 개인 프로필 정보 조회
- 개인 활동에 대한 타임라인 작성 및 조회
- 개인 프로필 > 타임라인 > 각 타임라인에 대해 작성한 스토리 리스트 조회
- 팔로잉 / 팔로워 조회
- 쪽지 주고 받기
- 서버에서 받아온 데이터가 decode 되지 않음
-> ResponseString 수정 (https://app.quicktype.io 참고 )
enum CodingKeys: String, CodingKey {
case timelineIdx, userIdx, title
case start_date = "start_date"
case end_date = "end_date"
case category
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
timelineIdx = (try? values.decode(Int.self, forKey: .timelineIdx)) ?? 0
userIdx = (try? values.decode(Int.self, forKey: .userIdx)) ?? 0
title = (try? values.decode(String.self, forKey: .title)) ?? ""
start_date = (try? values.decode(String.self, forKey: .start_date)) ?? ""
end_date = (try? values.decode(String.self, forKey: .end_date)) ?? ""
category = (try? values.decode(String.self, forKey: .category)) ?? ""
}
- UIPicker + Tool Bar 생성 -> 코드로 작성
// 1. 전체를 잡는 view 생성 + constraint 걸기
self.picker.isHidden = false
self.picker.frame = CGRect(x: 0, y: view.frame.height - 220, width: view.frame.width, height: 150)
view.addSubview(self.picker)
// 2. Tool Bar 에 들어갈 버튼 생성
let btnDone = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.testfunc))
// 3. UIPicker Toolbar 생성 + 속성 setting
let barAccessory = UIToolbar(frame: CGRect(x: 0, y: 0, width: picker.frame.width, height: 44))
barAccessory.barStyle = UIBarStyle.default
barAccessory.isTranslucent = true
barAccessory.items = [btnDone]
picker.addSubview(barAccessory)
// 4. UIPickerView 생성
self.pickerView.frame = CGRect(x: 0, y: barAccessory.frame.height, width: view.frame.width, height: picker.frame.height - barAccessory.frame.height)
self.pickerView.delegate = self
self.pickerView.dataSource = self
self.pickerView.backgroundColor = UIColor.whiteFour
picker.addSubview(self.pickerView)
- CalendarView 를 기획에 맞게 커스텀 하기
- FSCalendar Library 설치 ( https://rhammer.tistory.com/126 )
- DateFormatter 를 사용해 원하는 날짜에 이벤트 생성
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "ko_KR")
formatter.dateFormat = "yyyy-MM-dd"
let xmas = formatter.date(from: "2019-12-25")
let sampledate = formatter.date(from: "2019-12-22")
dates = [xmas!, sampledate!]
extension CalendarViewController: FSCalendarDataSource{
func calendar(_ calendar: FSCalendar, numberOfEventsFor date: Date) -> Int {
if self.dates.contains(date){
return 1
}
return 0
}
}
- UITabBar 사용하기
- Tabman Library 설치 ( https://github.com/uias/Tabman )
- TMBarItem 공식 문서 참조해 custom
// Create bar
let bar = TMBar.ButtonBar()
bar.layout.transitionStyle = .snap
// Customize button color
bar.buttons.customize { (button) in
button.tintColor = UIColor.brownishGreyTwo
button.selectedTintColor = UIColor.marigold
}
bar.indicator.tintColor = UIColor.marigold
addBar(bar, dataSource: self, at: .top)
- Navigation Bar Line Custom
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if shadowImageView == nil {
shadowImageView = findShadowImage(under: navigationController!.navigationBar)
}
shadowImageView?.isHidden = true
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
shadowImageView?.isHidden = false
}
private func findShadowImage(under view: UIView) -> UIImageView? {
if view is UIImageView && view.bounds.size.height <= 1 {
return (view as! UIImageView)
}
for subview in view.subviews {
if let imageView = findShadowImage(under: subview) {
return imageView
}
}
return nil
}
iOS 개발 경험이 없어 시행착오를 많이 겪으며 성장하는 중입니다. 인턴즈 체고 주연이 체체고
‼️ 😘
앱개발은 처음이라 능숙치 못했지만 좋은 팀원 덕분에 많이 성장할 수 있던 뜻깊은 시간이었습니다! 은자이 체체고 ❣️