Skip to content

다함께 앱을 만들어 나아가면서 Swift 스터디를 진행하는 iOS 프로젝트입니다.

Notifications You must be signed in to change notification settings

sueunal/TogetherApp

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 

Repository files navigation

Affinity

🗓 프로젝트 소개 : 신발 커뮤니티 앱
🗓 기간 : 2022.10.15 ~ 2023.3.21
🗓 팀원: 로이, , , 소낙, 리넴, 루비


Affinity에 대하여

많은 인기를 얻고 있는 신발이 무엇이 있는지를 확인해볼 수 있습니다.
신발과 관련하여 자유롭게 이야기를 나눌 수 있는 커뮤니티 기능을 담고 있습니다.


App Icon


App Store

Download on the App Store


업데이트 패치노트

  • 1.0.5
    • 프로필 화면 수정
    • 배너 이미지 변경
    • 로딩 화면 변경
    • 로딩 화면 수정
    • 로그인 이슈수정
    • 앱 삭제 했을 경우 로그아웃 수정
    • 버그 수정

백로그

업데이트 예정

기능 추가

팀원 소개

👨🏻‍💻👩🏻‍💻👩🏻‍🎨 Team

Developer Product Manger Developer Developer Developer Designer
Roy Min Sonak Young Linem Ruby

App UI


🛠 Developement Environment

Environment Version
Swift
Xcode
iOS Deployment Target

사용한 협업툴

  • Notion , Figma

사용한 라이브러리

  • Kingfisher , SwiftLint, Firebase , Moya , PopupView, lottie

사용한 자동화

  • Fastlane , Slack

디자인 패턴

  • MVVM 패턴

사용한 api

📝 신발 관련 MOCK API

let url = URL(string : "https://640de3d61a18a5db83827295.mockapi.io/shoes")

📝 신발 상세 MOCK API

let url = URL(string : "https://640de3d61a18a5db83827295.mockapi.io/shoes/id")

키워드

  • @published
  • @State
  • @EnvironmentObject
  • Combine
  • 커스텀 폰트
  • 커스텀 컬러
  • extension view
  • Moya 통신
  • 컴포넌트 분리
  • Search bar
  • Firebase RemoteConfig
  • Firebase Crashlytics
  • Firebase FCM
  • 앱이 삭제 되었을때 로그아웃
  • 공유

구현 내용

  • 로그인 안했을경우 프로필뷰 숨김처리
  • 프로필 사진 변경
  • push 알림
  • 커스텀 폰트
  • 커스텀 팝업
  • 소셜 로그인
  • 신발 검색
  • 앱 공유

폴더링

📦── MarketApp
│   ├── Info.plist
│   📦── Resources
│   │   📂── Firebase
│   │   📂── Assets.xcassets
│   │   📂── ColorAssets.xcassets
│   │   📂── IconImage
│   │   📂── Loading.json
│   │   📂── MarketApp.entitlements
│   │   📂── Preview Content
│   │   📂── mockData.json
│   📦── Sources
│   │   📂── Application
│   │   📂── Util
│   │   │    📂── AppCheck
│   │   │    📂── Authoriation
│   │   │    📂── Color
│   │   │    📂── Extensions
│   │   │    📂── Font
│   │   │    │    📂── CustomFont
│   │   │    └─   📂── FontAsset
│   │   │    📂── ImageManger
│   │   │    📂── SignUPCheck
│   │   │    📂── View
│   │   │    │    📂── ModalView
│   │   │    │    📂── ScrollView
│   │   │    │    📂── ACarousel
│   │   │    │    📂── EditImage
│   │   │    └─   📂── ScreenSize
│   │   📂── UI
│   │   │   📂── View
│   │   │   │    📂── Component
│   │   │   │    │   📂── Alert
│   │   │   │    │   📂── Lanch
│   │   │   │    │   📂── List
│   │   │   │    │   📂── Lottie
│   │   │   │    │   📂── Page
│   │   │   │    │   📂── Search
│   │   │   │    │   📂── Share
│   │   │   │    │   📂── TextField
│   │   │   │    └─  📂── WebView
│   │   │   │    📂── Authorization
│   │   │   │    │    📂── FindEmail
│   │   │   │    │    📂── FindPassword
│   │   │   │    │    📂── Login
│   │   │   │    └─   📂── SignUP
│   │   │   │    📂── Home
│   │   │   │    📂── Notice
│   │   │   │    📂── ProductDetail
│   │   │   │    📂── ProductList
│   │   │   │    📂── Profile
│   │   │   │    📂── Search
│   │   │   │    📂── Tab
│   │   │   └─   📂── Favorite
│   │   📂── ViewModel
│   │   │    📂── MainShoesViewModel
│   │   │    📂── ProfileViewModel
│   │   └─   📂── SignUpViewModel
│   │   📂── Model
│   │   │    📂── ShoesModel
│   │   📂── Network
│   │   │    📂── MainService
│   │   │    📂── MarketAPI
│   │   └─   📂── APIError
│   📦── MarketAppTests
│   │    │    📂── MainViewModelTest
│   │    │    📂── SignUPViewModelTest
│   │    │    📂── ProfileViewModelTest
│   📦── MarketAppUITests
📦── fastlane
│    📂── metadata
│    │    📂── ko
│    │    📂── review_information
│    📂── output
│    📂── screenshots
│    │    📂── ko
└──  📂── test_output

네트워크 통신

import Foundation
import Moya

enum MainShoesService {
    case mainShoesData
}

extension MainShoesService: TargetType {
    var baseURL: URL {
        return URL(string: "https://640de3d61a18a5db83827295.mockapi.io")!
    }
    
    var path: String {
        switch self {
        case .mainShoesData:
            return AffinityAPI.MainShoes
        }
    }
    
    var method: Moya.Method {
        switch self {
        case .mainShoesData:
            return .get
        }
    }
    
    var task: Task {
        switch self {
        case .mainShoesData:
            return .requestPlain
        }
    }
    
    var headers: [String : String]? {
        switch self {
        case .mainShoesData:
            return [
                "Accept": "application/json",
                "Content-Type": "application/json"
            ]
        }
    }
}

Design System

FONT

import UIKit
import SwiftUI

enum NanumSquareNeoFamily: String {
    case aLt, bRG, cBd, dEb, eHv
}


struct NanumSquareNeoFont: ViewModifier {
    var family: NanumSquareNeoFamily
    var size: CGFloat
    var color: Color
    
    func body(content: Content) -> some View {
        return content.font(.custom("NanumSquareNeoTTF-\(family)", fixedSize: size))
            .foregroundColor(color)
    }
}

extension View {
    func nanumSquareNeo(family: NanumSquareNeoFamily, size: CGFloat, color: Color) -> some View {
        return self.modifier(NanumSquareNeoFont(family: family, size: size, color: color))
    }
}

extension UIFont {
    static func nanumSquareNeo(family: NanumSquareNeoFamily, size: CGFloat, color: Color) -> UIFont?{
        let font = UIFont(name: "NanumSquareNeo-\(family)", size: size)
        return font
    }
}

extension Font {
    static func nanumSquareNeo(family: NanumSquareNeoFamily, size: CGFloat, color: Color) -> Font{
        let font = Font.custom("NanumSquareNeo-\(family)", size: size)
        return font
    }
}

Color

import Foundation
import SwiftUI

struct ColorAsset {
    let backGroudColor = Color("BackgroundColor")
    let mauve = Color("mauve")
    let mainColor = Color("MainColor")
    let mauve2 = Color("mauve2")
    let gray = Color("Gray")
    let lightBlack = Color("LightBlack")
    let black = Color("Black")
    let blueGray = Color("BlueGray")
    let lightGray = Color("LightGray")
    let beige = Color("Beige")
    let white = Color("White")
}

extension Color {
    static let colorAsset = ColorAsset()
}

🐈‍⬛ Git

1️⃣ Git branching Strategy

  • Origin(main branch)

    • Origin(dev branch)
      • Local(feature branch)
  • Branch

    • Main
    • Dev
    • Feature
    • Fix
  • 방법

      1. Pull the Dev branch of the Origin
      1. Make a Feature branch in the Local area
      1. Developed by Feature branch
      1. Push the Feature from Local to Origin
      1. Send a pull request from the origin's Feature to the Origin's Dev
      1. In Origin Dev, resolve conflict and merge
      1. Fetch and rebase Origin Dev from Local Dev

Commit 규칙

커밋 제목은 최대 50자 입력
본문은 한 줄 최대 72자 입력
Commit 메세지

🪛[chore]: 코드 수정, 내부 파일 수정.
✨[feat]: 새로운 기능 구현.
🎨[style]: 스타일 관련 기능.(코드의 구조/형태 개선)
➕[add]: Feat 이외의 부수적인 코드 추가, 라이브러리 추가
🔧[file]: 새로운 파일 생성, 삭제 시
🐛[fix]: 버그, 오류 해결.
🔥[del]: 쓸모없는 코드/파일 삭제.
📝[docs]: README나 WIKI 등의 문서 개정.
💄[mod]: storyboard 파일,UI 수정한 경우.
✏️[correct]: 주로 문법의 오류나 타입의 변경, 이름 변경 등에 사용합니다.
🚚[move]: 프로젝트 내 파일이나 코드(리소스)의 이동.
⏪️[rename]: 파일 이름 변경이 있을 때 사용합니다.
⚡️[improve]: 향상이 있을 때 사용합니다.
♻️[refactor]: 전면 수정이 있을 때 사용합니다.
🔀[merge]: 다른브렌치를 merge 할 때 사용합니다.
✅ [test]: 테스트 코드를 작성할 때 사용합니다.


Commit Body 규칙

제목 끝에 마침표(.) 금지
한글로 작성
브랜치 이름 규칙

  • STEP1, STEP2, STEP3

Git flow

  • main 브랜 치는 앱 출시
  • Dev는 테스트 및 각종 파일 merge
  • 각 스텝 뱔로 브런치 생성해서 관리

About

다함께 앱을 만들어 나아가면서 Swift 스터디를 진행하는 iOS 프로젝트입니다.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Swift 95.6%
  • Ruby 4.4%