Skip to content

Commit 22e5dd7

Browse files
[Release] v1.0.0
[Release] v1.0.0
2 parents 0845b80 + 99ec339 commit 22e5dd7

133 files changed

Lines changed: 3579 additions & 1136 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,6 @@ playground.xcworkspace
8787

8888
# Add this line if you want to avoid checking in source code from the Xcode workspace
8989
*.xcworkspace
90+
91+
## Google Firebase
92+
GoogleService-Info.plist

CHANGELOG.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,38 @@
2525
### Security
2626

2727

28+
## [1.0.0] (2025-11-14)
29+
30+
### Added
31+
32+
- 타이포그라피 시스템 업데이트
33+
- 페어링 및 연결 하이파이 디자인 적용
34+
- 가이딩 관련 토스트 추가
35+
- 따봉 버튼 기능 추가
36+
- 레퍼런스에 애니메이션 추가
37+
- 매직펜에 사라지는 애니메이션 추가
38+
- Wi-Fi 기능이 꺼져있을 때 연결 뷰에서 사용자에게 얼럿을 노출
39+
40+
### Changed
41+
42+
- 가이딩 토글 버튼에 따른 비활성화 상태 변경
43+
- Appearance를 Dark로 고정
44+
- 디자인 세부 조정 (카메라 뷰, 재연결 뷰, 프레임 가이딩)
45+
- `LocalEvent.browserStopped(let error)` / `LocalEvent.listenerStopped(let error)`에 대한 대응 방식 변경
46+
47+
### Removed
48+
49+
- "페어링이 왜 필요해요?" 레이블 숨김처리 (디자인 작업 완료 후 작업 예정)
50+
51+
### Fixed
52+
53+
- 연속 사진 촬영시 사진 저장 안되는 이슈 수정
54+
- `v0.3.3`에서 에셋 이미지 일부 누락되었던 문제 수정
55+
- `v0.3.3`에서의 디자인 QA 카메라, Photos 부분 수정
56+
- 재연결시 이전 커넥션을 잘 정리하지 않았던 문제 수정
57+
- 특정 디바이스에 연결 중인 상태에서 다른 디바이스 연결 버튼이 잘 작동하지 않았던 문제 수정
58+
59+
2860
## [0.3.3] (2025-11-07)
2961

3062
### Added
@@ -182,6 +214,7 @@
182214
- Wi-Fi Aware 연결 후, 라이브 포토 촬영 시 앱이 크래시되는 문제
183215
- 레퍼런스 삭제 후 재등록에 관한 상태 초기화 문제
184216

217+
[1.0.0]: https://github.com/DeveloperAcademy-POSTECH/2025-C6-A11-QueendomJaerim/compare/v0.3.3...v1.0.0
185218
[0.3.3]: https://github.com/DeveloperAcademy-POSTECH/2025-C6-A11-QueendomJaerim/compare/v0.3.2...v0.3.3
186219
[0.3.2]: https://github.com/DeveloperAcademy-POSTECH/2025-C6-A11-QueendomJaerim/compare/v0.3.1...v0.3.2
187220
[0.3.1]: https://github.com/DeveloperAcademy-POSTECH/2025-C6-A11-QueendomJaerim/compare/v0.3.0...v0.3.1

Documents/Attachments/ZZikZZa.png

1.63 MB
Loading

Documents/swift_format.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
### swift-format 설치
2+
3+
- 참고: [swift-format](https://github.com/swiftlang/swift-format)
4+
- homebrew로 설치하면 간편합니다
5+
```sh
6+
brew install swift-format
7+
```
8+
9+
#### 사용 방법
10+
11+
- 특정 파일을 포매팅하고 싶을 때
12+
- Editor - Structure - Format File with 'swift-format' 또는 `컨트롤 + 쉬프트 + I`
13+
![Run swift-format in Xcode](./Attachments/image0.png)
14+
- 모든 파일을 포매팅하고 싶을 때
15+
- 터미널로 QueenCam 디렉토리 이동 후, `swift-format . --recursive --in-place` 실행
16+
- 다만 내가 작업하지 않는 범위의 파일이 영향받지 않았는지 반드시 확인 후 푸시

QueenCam/QueenCam.xcodeproj/project.pbxproj

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10+
3D3ABD912EC45C9E001FD2C3 /* FirebaseAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = 3D3ABD902EC45C9E001FD2C3 /* FirebaseAnalytics */; };
11+
3D3ABD932EC45C9E001FD2C3 /* FirebaseCore in Frameworks */ = {isa = PBXBuildFile; productRef = 3D3ABD922EC45C9E001FD2C3 /* FirebaseCore */; };
12+
3D3ABD952EC45C9E001FD2C3 /* FirebaseCrashlytics in Frameworks */ = {isa = PBXBuildFile; productRef = 3D3ABD942EC45C9E001FD2C3 /* FirebaseCrashlytics */; };
1013
3D525A9C2EA7CC5B00B4860A /* Transcoding in Frameworks */ = {isa = PBXBuildFile; productRef = 3D525A9B2EA7CC5B00B4860A /* Transcoding */; };
1114
/* End PBXBuildFile section */
1215

@@ -70,6 +73,9 @@
7073
isa = PBXFrameworksBuildPhase;
7174
buildActionMask = 2147483647;
7275
files = (
76+
3D3ABD912EC45C9E001FD2C3 /* FirebaseAnalytics in Frameworks */,
77+
3D3ABD952EC45C9E001FD2C3 /* FirebaseCrashlytics in Frameworks */,
78+
3D3ABD932EC45C9E001FD2C3 /* FirebaseCore in Frameworks */,
7379
3D525A9C2EA7CC5B00B4860A /* Transcoding in Frameworks */,
7480
);
7581
runOnlyForDeploymentPostprocessing = 0;
@@ -135,6 +141,9 @@
135141
name = QueenCam;
136142
packageProductDependencies = (
137143
3D525A9B2EA7CC5B00B4860A /* Transcoding */,
144+
3D3ABD902EC45C9E001FD2C3 /* FirebaseAnalytics */,
145+
3D3ABD922EC45C9E001FD2C3 /* FirebaseCore */,
146+
3D3ABD942EC45C9E001FD2C3 /* FirebaseCrashlytics */,
138147
);
139148
productName = QueenCam;
140149
productReference = 3D5E6BEE2E7D687300A0E03A /* QueenCam.app */;
@@ -222,6 +231,7 @@
222231
packageReferences = (
223232
3D6CDA672E8E3EDD006C445A /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */,
224233
3D525A9A2EA7CC5B00B4860A /* XCRemoteSwiftPackageReference "Transcoding" */,
234+
3D3ABD8F2EC45C9E001FD2C3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */,
225235
);
226236
preferredProjectObjectVersion = 77;
227237
productRefGroup = 3D5E6BEF2E7D687300A0E03A /* Products */;
@@ -460,6 +470,7 @@
460470
GENERATE_INFOPLIST_FILE = YES;
461471
INFOPLIST_FILE = QueenCam/Info.plist;
462472
INFOPLIST_KEY_CFBundleDisplayName = "찍자";
473+
INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO;
463474
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.photography";
464475
INFOPLIST_KEY_NSCameraUsageDescription = "사진을 촬영하기 위해 카메라 접근이 필요합니다.";
465476
INFOPLIST_KEY_NSMicrophoneUsageDescription = "라이브 포토 촬영 시 오디오 녹음을 위해 마이크 접근이 필요합니다";
@@ -469,11 +480,12 @@
469480
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
470481
INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
471482
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
483+
INFOPLIST_KEY_UIUserInterfaceStyle = Dark;
472484
LD_RUNPATH_SEARCH_PATHS = (
473485
"$(inherited)",
474486
"@executable_path/Frameworks",
475487
);
476-
MARKETING_VERSION = 0.3.3;
488+
MARKETING_VERSION = 1.0.0;
477489
PRODUCT_BUNDLE_IDENTIFIER = com.queendom.QueenCam;
478490
PRODUCT_NAME = "$(TARGET_NAME)";
479491
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -508,6 +520,7 @@
508520
GENERATE_INFOPLIST_FILE = YES;
509521
INFOPLIST_FILE = QueenCam/Info.plist;
510522
INFOPLIST_KEY_CFBundleDisplayName = "찍자";
523+
INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO;
511524
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.photography";
512525
INFOPLIST_KEY_NSCameraUsageDescription = "사진을 촬영하기 위해 카메라 접근이 필요합니다.";
513526
INFOPLIST_KEY_NSMicrophoneUsageDescription = "라이브 포토 촬영 시 오디오 녹음을 위해 마이크 접근이 필요합니다";
@@ -517,11 +530,12 @@
517530
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
518531
INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
519532
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
533+
INFOPLIST_KEY_UIUserInterfaceStyle = Dark;
520534
LD_RUNPATH_SEARCH_PATHS = (
521535
"$(inherited)",
522536
"@executable_path/Frameworks",
523537
);
524-
MARKETING_VERSION = 0.3.3;
538+
MARKETING_VERSION = 1.0.0;
525539
PRODUCT_BUNDLE_IDENTIFIER = com.queendom.QueenCam;
526540
PRODUCT_NAME = "$(TARGET_NAME)";
527541
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -662,6 +676,14 @@
662676
/* End XCConfigurationList section */
663677

664678
/* Begin XCRemoteSwiftPackageReference section */
679+
3D3ABD8F2EC45C9E001FD2C3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = {
680+
isa = XCRemoteSwiftPackageReference;
681+
repositoryURL = "https://github.com/firebase/firebase-ios-sdk";
682+
requirement = {
683+
kind = exactVersion;
684+
version = 12.5.0;
685+
};
686+
};
665687
3D525A9A2EA7CC5B00B4860A /* XCRemoteSwiftPackageReference "Transcoding" */ = {
666688
isa = XCRemoteSwiftPackageReference;
667689
repositoryURL = "https://github.com/0tak2/Transcoding";
@@ -681,6 +703,21 @@
681703
/* End XCRemoteSwiftPackageReference section */
682704

683705
/* Begin XCSwiftPackageProductDependency section */
706+
3D3ABD902EC45C9E001FD2C3 /* FirebaseAnalytics */ = {
707+
isa = XCSwiftPackageProductDependency;
708+
package = 3D3ABD8F2EC45C9E001FD2C3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
709+
productName = FirebaseAnalytics;
710+
};
711+
3D3ABD922EC45C9E001FD2C3 /* FirebaseCore */ = {
712+
isa = XCSwiftPackageProductDependency;
713+
package = 3D3ABD8F2EC45C9E001FD2C3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
714+
productName = FirebaseCore;
715+
};
716+
3D3ABD942EC45C9E001FD2C3 /* FirebaseCrashlytics */ = {
717+
isa = XCSwiftPackageProductDependency;
718+
package = 3D3ABD8F2EC45C9E001FD2C3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */;
719+
productName = FirebaseCrashlytics;
720+
};
684721
3D525A9B2EA7CC5B00B4860A /* Transcoding */ = {
685722
isa = XCSwiftPackageProductDependency;
686723
package = 3D525A9A2EA7CC5B00B4860A /* XCRemoteSwiftPackageReference "Transcoding" */;

QueenCam/QueenCam/App/QueenCamApp.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import SwiftUI
99

1010
@main
1111
struct QueenCamApp: App {
12+
@UIApplicationDelegateAdaptor(QueenCamAppDelegate.self) var delegate
13+
1214
var body: some Scene {
1315
WindowGroup {
1416
MainView()
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//
2+
// QueenCamAppDelegate.swift
3+
// QueenCam
4+
//
5+
// Created by 임영택 on 11/12/25.
6+
//
7+
8+
import SwiftUI
9+
import FirebaseCore
10+
import FirebaseAnalytics
11+
12+
final class QueenCamAppDelegate: NSObject, UIApplicationDelegate {
13+
func application(
14+
_ application: UIApplication,
15+
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil
16+
) -> Bool {
17+
FirebaseApp.configure()
18+
19+
return true
20+
}
21+
}

QueenCam/QueenCam/Common/Dependencies/DenpencyContainer.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import Foundation
99

10-
// FIXME: Temporary DI Implementation
1110
final class DependencyContainer {
1211
static let defaultContainer: DependencyContainer = .init()
1312

@@ -23,4 +22,7 @@ final class DependencyContainer {
2322
lazy var cameraSettingServcice: CameraSettingsServiceProtocol = CameraSettingsService()
2423

2524
lazy var notificationService: NotificationService = NotificationService()
25+
26+
// lazy면 NotificaitonCenter 기반 이벤트 로깅이 작동하지 않을 수 있음
27+
let analyticsService: AnalyticsService = AnalyticsService()
2628
}

QueenCam/QueenCam/Common/Notification.Name+.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,7 @@ extension Notification.Name {
1313

1414
/// 역할 변경 알림. userInfo에 "newRole"을 키로, 새로운 역할의 Role 값을 같이 실어 보낸다
1515
static let QueenCamRoleChangedNotification = Notification.Name("QueenCam.RoleChangedNotification")
16+
17+
/// 애널리틱스 이벤트 알림. 반드시 userInfo에 "event"를 키로 해서, AnalyticsEvent 타입 객체를 보내야한다.
18+
static let QueenCamAnalyticsEventNotification = Notification.Name("QueenCam.AnalyticsEventNotification")
1619
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<!-- 프로젝트 팀원으로부터 GoogleService-Info.plist를 전달받아 이 위치에 복사하시기 바랍니다 -->
2+
<?xml version="1.0" encoding="UTF-8"?>
3+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
4+
<plist version="1.0">
5+
<dict>
6+
<key>API_KEY</key>
7+
<string>YOUR_API_KEY</string>
8+
</dict>
9+
</plist>

0 commit comments

Comments
 (0)