feat: Khởi tạo dự án Swift cơ bản với cấu hình Git và kế hoạch kiểm thử XCTest.
This commit is contained in:
1
apps/app-client-base-swift/AppClientBaseSwift
Submodule
1
apps/app-client-base-swift/AppClientBaseSwift
Submodule
Submodule apps/app-client-base-swift/AppClientBaseSwift added at 9f3cfadcc3
33
apps/app-client-base-swift/AppClientBaseSwift.xctestplan
Normal file
33
apps/app-client-base-swift/AppClientBaseSwift.xctestplan
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"configurations" : [
|
||||
{
|
||||
"id" : "C5F2D2E7-8F4A-4B3C-9D1E-6A5B4C3D2E1F",
|
||||
"name" : "Test Scheme Action",
|
||||
"options" : {
|
||||
|
||||
}
|
||||
}
|
||||
],
|
||||
"defaultOptions" : {
|
||||
"testTimeoutsEnabled" : true
|
||||
},
|
||||
"testTargets" : [
|
||||
{
|
||||
"parallelizable" : true,
|
||||
"target" : {
|
||||
"containerPath" : "container:AppClientBaseSwift.xcodeproj",
|
||||
"identifier" : "AppClientBaseSwiftTests",
|
||||
"name" : "AppClientBaseSwiftTests"
|
||||
}
|
||||
},
|
||||
{
|
||||
"parallelizable" : true,
|
||||
"target" : {
|
||||
"containerPath" : "container:AppClientBaseSwift.xcodeproj",
|
||||
"identifier" : "AppClientBaseSwiftUITests",
|
||||
"name" : "AppClientBaseSwiftUITests"
|
||||
}
|
||||
}
|
||||
],
|
||||
"version" : 1
|
||||
}
|
||||
165
apps/app-client-base-swift/README.md
Normal file
165
apps/app-client-base-swift/README.md
Normal file
@@ -0,0 +1,165 @@
|
||||
# App Client Base Swift
|
||||
|
||||
Ứng dụng iOS native cho nền tảng GoodGo, xây dựng bằng Swift và SwiftUI.
|
||||
|
||||
## 📱 Tổng quan
|
||||
|
||||
App client iOS native sử dụng kiến trúc MVVM với SwiftUI, tương tự như `app-client-base-net` (MAUI) nhưng dành riêng cho nền tảng Apple.
|
||||
|
||||
## 🛠️ Công nghệ
|
||||
|
||||
| Công nghệ | Phiên bản | Mục đích |
|
||||
|-----------|-----------|----------|
|
||||
| Swift | 5.9+ | Ngôn ngữ lập trình |
|
||||
| SwiftUI | iOS 15+ | UI Framework |
|
||||
| Xcode | 15+ | IDE |
|
||||
| URLSession | Native | Networking |
|
||||
| Keychain | Native | Secure Storage |
|
||||
|
||||
## 📂 Cấu trúc thư mục
|
||||
|
||||
```
|
||||
AppClientBaseSwift/
|
||||
├── App/
|
||||
│ └── AppClientBaseSwiftApp.swift # @main entry point
|
||||
├── Core/
|
||||
│ ├── Constants/
|
||||
│ │ └── Constants.swift # App-wide constants
|
||||
│ └── Extensions/
|
||||
│ ├── View+Extensions.swift # SwiftUI View helpers
|
||||
│ └── String+Extensions.swift # String utilities
|
||||
├── Models/
|
||||
│ └── User.swift # User data model
|
||||
├── ViewModels/
|
||||
│ └── HomeViewModel.swift # MVVM ViewModel
|
||||
├── Views/
|
||||
│ └── Screens/
|
||||
│ ├── ContentView.swift # Main tab container
|
||||
│ ├── WelcomeView.swift # Onboarding screen
|
||||
│ ├── HomeView.swift # Home tab
|
||||
│ ├── ExploreView.swift # Explore tab
|
||||
│ └── ProfileView.swift # Profile tab
|
||||
├── Services/
|
||||
│ ├── APIService.swift # HTTP client
|
||||
│ └── AuthManager.swift # Authentication
|
||||
├── Resources/
|
||||
│ ├── Assets.xcassets/ # Images & Colors
|
||||
│ ├── en.lproj/ # English strings
|
||||
│ └── vi.lproj/ # Vietnamese strings
|
||||
└── Info.plist # App configuration
|
||||
```
|
||||
|
||||
## 🚀 Bắt đầu
|
||||
|
||||
### Yêu cầu
|
||||
|
||||
- macOS 14.0+ (Sonoma)
|
||||
- Xcode 15.0+
|
||||
- iOS 15.0+ target
|
||||
|
||||
### Mở project
|
||||
|
||||
1. Mở Xcode
|
||||
2. Chọn **File > Open** hoặc nhấn `⌘O`
|
||||
3. Chọn thư mục `app-client-base-swift`
|
||||
4. Build và chạy trên Simulator (`⌘R`)
|
||||
|
||||
### Tạo Xcode Project (Nếu chưa có)
|
||||
|
||||
Do project này chỉ chứa source files, bạn cần tạo Xcode project:
|
||||
|
||||
```bash
|
||||
# Mở Xcode và tạo project mới
|
||||
# 1. File > New > Project
|
||||
# 2. Chọn "App" template
|
||||
# 3. Product Name: AppClientBaseSwift
|
||||
# 4. Team: Chọn team của bạn
|
||||
# 5. Organization Identifier: vn.goodgo
|
||||
# 6. Interface: SwiftUI
|
||||
# 7. Language: Swift
|
||||
# 8. Lưu vào thư mục app-client-base-swift
|
||||
# 9. Xóa các file generated và thay thế bằng files trong thư mục này
|
||||
```
|
||||
|
||||
## 🎨 Kiến trúc
|
||||
|
||||
### MVVM Pattern
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ VIEW (SwiftUI) │
|
||||
│ ContentView, HomeView, ExploreView, ProfileView │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌──────────────────────────────────┐ │
|
||||
│ │ @StateObject │ │
|
||||
│ │ @EnvironmentObject │ │
|
||||
│ └──────────────────────────────────┘ │
|
||||
│ │ │
|
||||
├────────────────────────────▼────────────────────────────────┤
|
||||
│ VIEWMODEL │
|
||||
│ HomeViewModel (ObservableObject) │
|
||||
│ - @Published properties │
|
||||
│ - async/await methods │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌──────────────────────────────────┐ │
|
||||
│ │ Protocol / Dependency │ │
|
||||
│ │ Injection │ │
|
||||
│ └──────────────────────────────────┘ │
|
||||
│ │ │
|
||||
├────────────────────────────▼────────────────────────────────┤
|
||||
│ SERVICES │
|
||||
│ APIService, AuthManager │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Key Features
|
||||
|
||||
- **SwiftUI**: UI declarative hiện đại
|
||||
- **Async/Await**: Xử lý bất đồng bộ native
|
||||
- **Keychain**: Lưu trữ token bảo mật
|
||||
- **Localization**: Hỗ trợ đa ngôn ngữ (VI/EN)
|
||||
- **Dark Mode**: Hỗ trợ giao diện tối
|
||||
|
||||
## 📋 Conventions
|
||||
|
||||
### Coding Style
|
||||
|
||||
```swift
|
||||
// ViewModel với ObservableObject
|
||||
@MainActor
|
||||
class HomeViewModel: ObservableObject {
|
||||
@Published var isLoading: Bool = false
|
||||
|
||||
func loadData() async {
|
||||
// Async data loading
|
||||
}
|
||||
}
|
||||
|
||||
// View với MVVM binding
|
||||
struct HomeView: View {
|
||||
@StateObject private var viewModel = HomeViewModel()
|
||||
|
||||
var body: some View {
|
||||
// SwiftUI body
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Comments (Bilingual)
|
||||
|
||||
```swift
|
||||
/// Load home screen data
|
||||
/// Tải dữ liệu màn hình home
|
||||
func loadData() async { }
|
||||
```
|
||||
|
||||
## 🔗 Liên kết
|
||||
|
||||
- [app-client-base-net](../app-client-base-net) - .NET MAUI client
|
||||
- [web-client](../web-client) - Web client
|
||||
|
||||
## 📄 License
|
||||
|
||||
Copyright © 2026 GoodGo. All rights reserved.
|
||||
Reference in New Issue
Block a user