Skip to content
Merged

2.0.2 #210

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
214fa8e
[fix] #203 즐겨찾기 필터 설정 후 필터 해제 시 로직 문제 수정
ShapeKim98 Sep 6, 2025
a73d572
[refactor] #203 PokitCauction 선언형으로 리팩토링
ShapeKim98 Sep 6, 2025
5f1b88b
[fix] #203 empty 화면에 링크 추가 버튼 제거, empty 노출 시 즐겨찾기/안읽음 버튼 노출 필요
ShapeKim98 Sep 6, 2025
d1ce305
[fix] #203 검색 empty 추가, 정렬 버튼 누락 수정
ShapeKim98 Sep 6, 2025
56850ea
[fix] #203 키워드 선택 바텀시트와 선택한 키워드의 가나다 순 정렬 추가, 키워드 선택 바텀시트에서 선택된 키워드 …
ShapeKim98 Sep 6, 2025
e338c4d
[fix] #203 링크 읽음 처리 수정
ShapeKim98 Sep 6, 2025
0b2523a
[refactor] #203 PokitLinkPopup 선언형으로 리팩토링
ShapeKim98 Sep 6, 2025
caed060
[fix] #203 저장완로 토스트 노출시간 4초 변경 및 보기 텍스트 추가
ShapeKim98 Sep 6, 2025
a775de1
[fix] #203 선택 링크 포킷 이동 후 선택된 링크가 없을 시에 "링크 삭제", "포킷 이동" 이 활성화 되어있는 문제 수정
ShapeKim98 Sep 9, 2025
f2a8403
[chore] #203 2.0.1 버전 수정
ShapeKim98 Sep 9, 2025
9b9e9bb
fix: build test 시 사용 가능한 iOS 시뮬레이터를 사용할 수 있게 수정
stealmh Sep 14, 2025
3208797
fix: destination 명시적으로 지정하게 수정
stealmh Sep 14, 2025
2ec5403
Merge pull request #204 from YAPP-Github/fix/#203-250906
ShapeKim98 Sep 21, 2025
d49f81c
[fix] #205 워크플로우 환경 버전 수정
ShapeKim98 Sep 21, 2025
765e31f
[fix] #205 fastlane 설치 커맨드 추가
ShapeKim98 Sep 21, 2025
84b6d59
Revert "[fix] #205 fastlane 설치 커맨드 추가"
ShapeKim98 Sep 22, 2025
c683dfc
Revert "[fix] #205 워크플로우 환경 버전 수정"
ShapeKim98 Sep 22, 2025
d66ec2a
[fix] #206 빌드 테스트 xcode 버전 변경
ShapeKim98 Sep 22, 2025
a0deb07
[fix] #206 맥os 버전 명시
ShapeKim98 Sep 22, 2025
81b991d
[fix] #206 Fastfile 수정
ShapeKim98 Sep 22, 2025
754ad1c
[fix] #206 워크플로우 환경 macos 26, xcode latest로 변경
ShapeKim98 Sep 22, 2025
6e0ff82
Merge pull request #206 from YAPP-Github/fix/#205-workflow-environment
ShapeKim98 Sep 23, 2025
9e3da8b
[fix] #208 설정 -> 닉네임 다크모드 문제 수정
ShapeKim98 Oct 28, 2025
06dce6d
[fix] #208 포킷 상세 내 이동 바텀시트 높이 수정
ShapeKim98 Oct 28, 2025
cccfd97
[fix] #208 pluscategory 바텀시트 ios 26 대응
ShapeKim98 Oct 28, 2025
dfc1f39
[fix] #208 프로필 기본 이미지 가장자리 추가
ShapeKim98 Oct 28, 2025
d543a11
[feat] #208 Amplitude 의존성 추가
ShapeKim98 Oct 28, 2025
54bb9b5
[feat] #208 apmplitude 객체 구성
ShapeKim98 Nov 25, 2025
80b30fd
[feat] #208 amplitude - 앱 실행 시
ShapeKim98 Nov 25, 2025
f21a080
[feat] #208 amplitude - 스플래시 화면 노출
ShapeKim98 Nov 25, 2025
2cfce98
[feat] #208 amplitude - 로그인 시도, 로그인 완료
ShapeKim98 Nov 25, 2025
bffdacc
[feat] #208 amplitude - 온보딩 완료
ShapeKim98 Nov 25, 2025
8832cb4
[feat] #208 amplitude - 관심사 선택 완료
ShapeKim98 Nov 25, 2025
de4cec7
[feat] #208 amplitude - 포킷, 추천 페이지 진입
ShapeKim98 Nov 25, 2025
9f475f4
[feat] #208 amplitude - 폴더 생성, 링크 저장 완료
ShapeKim98 Nov 25, 2025
0f05a0f
[feat] #208 amplitude - 링크, 폴더 상세보기
ShapeKim98 Nov 25, 2025
0c63176
[feat] #208 amplitude - 공유하기
ShapeKim98 Nov 25, 2025
1d8e15e
[feat] #208 amplitude - 링크 상세, 저장
ShapeKim98 Nov 25, 2025
a2d3436
[chore] #208 amplitude 링크 저장 트리거 변경
ShapeKim98 Nov 25, 2025
6293faa
[feat] #208 amplitude 초기화
ShapeKim98 Nov 25, 2025
71eada9
[refactor] #208 amplitude track 호출 수정
ShapeKim98 Nov 25, 2025
e67dd02
[feat] #208 amplitude - 사용자 정보
ShapeKim98 Nov 25, 2025
b189c9d
Merge pull request #209 from YAPP-Github/feat/#208-2.0.8
ShapeKim98 Nov 25, 2025
66d494b
[fix] 2.0.2 QA 사항 반영
ShapeKim98 Nov 25, 2025
a7839d8
[chore] 2.0.2
ShapeKim98 Nov 25, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/appstore_release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ on:

jobs:
build:
runs-on: macos-latest
runs-on: macos-26

steps:
- uses: actions/checkout@v4

- name: Set up Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '16.1'
xcode-version: latest-stable

- uses: shimataro/ssh-key-action@v2
with:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/build_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,15 @@ on:

jobs:
build:
runs-on: macos-latest
runs-on: macos-26

steps:
- uses: actions/checkout@v4

- name: Set up Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '16.1'
xcode-version: latest-stable

- uses: shimataro/ssh-key-action@v2
with:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/develop_hotfix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ on:
jobs:
build:
if: startsWith(github.event.head_commit.message, '[hotfix]')
runs-on: macos-latest
runs-on: macos-26

steps:
- uses: actions/checkout@v4
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/testflight_release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@ on:
jobs:
build:
if: ${{ github.event_name == 'workflow_dispatch' || github.event.pull_request.merged == true }}
runs-on: macos-latest
runs-on: macos-26

steps:
- uses: actions/checkout@v4

- name: Set up Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '16.1'
xcode-version: latest-stable

- uses: shimataro/ssh-key-action@v2
with:
Expand Down
4 changes: 3 additions & 1 deletion Projects/App/Resources/Pokit-info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>2.0.0</string>
<string>2.0.2</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
Expand Down Expand Up @@ -94,5 +94,7 @@
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>AMPLITUDE_API_KEY</key>
<string>$(AMPLITUDE_API_KEY)</string>
</dict>
</plist>
2 changes: 1 addition & 1 deletion Projects/App/ShareExtension/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<key>CFBundleName</key>
<string>Pokit</string>
<key>CFBundleShortVersionString</key>
<string>1.0.9</string>
<string>2.0.1</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
Expand Down
15 changes: 15 additions & 0 deletions Projects/App/Sources/AppDelegate/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,25 @@
//

import SwiftUI
import UIKit

import ComposableArchitecture
import Firebase
import FirebaseMessaging
import GoogleSignIn
import Dependencies

final class AppDelegate: NSObject {
@Dependency(\.amplitude)
private var amplitude

let store = Store(initialState: AppDelegateFeature.State()) {
AppDelegateFeature()
}
}
//MARK: - UIApplicationDelegate
extension AppDelegate: UIApplicationDelegate {

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
if GIDSignIn.sharedInstance.handle(url) { return true }
return false
Expand All @@ -30,6 +36,15 @@ extension AppDelegate: UIApplicationDelegate {
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
) -> Bool {
self.store.send(.didFinishLaunching)

// 운영체제 버전 (ex: "iOS 18.0.0")
let osVersion = "iOS \(UIDevice.current.systemVersion)"

// 앱 번들 버전 (ex: "2.0.1")
let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? ""
let amplitudeKey = Bundle.main.infoDictionary?["AMPLITUDE_API_KEY"] as? String ?? ""
amplitude.initialize(amplitudeKey, nil)
amplitude.track(.app_open(deviceOS: osVersion, appVersion: appVersion))
return true
}

Expand Down
18 changes: 18 additions & 0 deletions Projects/App/Sources/MainTab/MainTabFeature.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ public struct MainTabFeature {
private var categoryClient
@Dependency(UserDefaultsClient.self)
private var userDefaults
@Dependency(\.amplitude.track)
private var amplitudeTrack

/// - State
@ObservableState
public struct State: Equatable {
Expand Down Expand Up @@ -103,6 +106,14 @@ public struct MainTabFeature {
guard state.linkPopup == nil else { return .none }
state.categoryOfSavedContent = nil
return .none
case .binding(\.selectedTab):
switch state.selectedTab {
case .pokit:
amplitudeTrack(.view_home_pokit(entryPoint: "pokit"))
case .recommend:
amplitudeTrack(.view_home_recommend(entryPoint: "recommend"))
}
return .none
case .binding:
return .none
case let .pushAlertTapped(isTapped):
Expand Down Expand Up @@ -197,6 +208,13 @@ private extension MainTabFeature {
let categoryIdString = queryItems.first(where: { $0.name == "categoryId" })?.value,
let categoryId = Int(categoryIdString)
else { return .none }

switch state.selectedTab {
case .pokit:
amplitudeTrack(.view_home_pokit(entryPoint: "deeplink"))
case .recommend:
amplitudeTrack(.view_home_recommend(entryPoint: "deeplink"))
}

return .send(.async(.공유받은_카테고리_조회(categoryId: categoryId)))
case .경고_확인버튼_클릭:
Expand Down
26 changes: 15 additions & 11 deletions Projects/App/Sources/MainTab/MainTabFeatureView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,8 @@ public extension MainTabView {
}

if self.store.linkPopup != nil {
PokitLinkPopup(
type: $store.linkPopup,
action: { send(.링크팝업_버튼_눌렀을때, animation: .pokitSpring) }
)
PokitLinkPopup(type: $store.linkPopup)
.onAction { send(.링크팝업_버튼_눌렀을때, animation: .pokitSpring) }
}
}
}
Expand All @@ -93,11 +91,9 @@ private extension MainTabView {
.overlay(alignment: .bottom) {
VStack(spacing: 0) {
if store.linkPopup != nil {
PokitLinkPopup(
type: $store.linkPopup,
action: { send(.링크팝업_버튼_눌렀을때, animation: .pokitSpring) }
)
.padding(.bottom, 20)
PokitLinkPopup(type: $store.linkPopup)
.onAction { send(.링크팝업_버튼_눌렀을때, animation: .pokitSpring) }
.padding(.bottom, 20)
}

bottomTabBar
Expand Down Expand Up @@ -273,7 +269,14 @@ private extension MainTabView {

var body: some View {
GeometryReader { proxy in
let bottomSafeArea = proxy.safeAreaInsets.bottom
let bottomPadding: CGFloat = {
if #available(iOS 26.0, *) {
return 32
} else {
return 48
}
}()

HStack(spacing: 20) {
Spacer()

Expand Down Expand Up @@ -306,7 +309,7 @@ private extension MainTabView {

Spacer()
}
.padding(.bottom, 48 - bottomSafeArea)
.padding(.bottom, bottomPadding)
.padding(.top, 36)
.pokitPresentationCornerRadius()
.pokitPresentationBackground()
Expand All @@ -319,6 +322,7 @@ private extension MainTabView {
}
.presentationDetents([.height(self.height)])
}
.ignoresSafeArea(edges: .bottom)
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions Projects/App/Sources/MainTab/MainTabPath.swift
Original file line number Diff line number Diff line change
Expand Up @@ -194,13 +194,13 @@ public extension MainTabFeature {
case .검색:
return .merge(
.send(.path(.element(id: stackElementId, action: .검색(.delegate(.컨텐츠_검색))))),
.send(.inner(.링크팝업_활성화(.success(title: Constants.링크_저장_완료_문구))), animation: .pokitSpring)
.send(.inner(.링크팝업_활성화(.success(title: Constants.링크_저장_완료_문구, until: 4))), animation: .pokitSpring)
)
default:
return .send(.inner(.링크팝업_활성화(.success(title: Constants.링크_저장_완료_문구))), animation: .pokitSpring)
return .send(.inner(.링크팝업_활성화(.success(title: Constants.링크_저장_완료_문구, until: 4))), animation: .pokitSpring)
}
case .recommend(.delegate(.저장하기_완료)):
return .send(.inner(.링크팝업_활성화(.success(title: Constants.링크_저장_완료_문구))), animation: .pokitSpring)
return .send(.inner(.링크팝업_활성화(.success(title: Constants.링크_저장_완료_문구, until: 4))), animation: .pokitSpring)
/// - 각 화면에서 링크 복사 감지했을 때 (링크 추가 및 수정 화면 제외)
case let .path(.element(_, action: .알림함(.delegate(.linkCopyDetected(url))))),
let .path(.element(_, action: .검색(.delegate(.linkCopyDetected(url))))),
Expand Down
1 change: 1 addition & 0 deletions Projects/CoreKit/Project.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ let coreKit: Target = .target(
.external(name: "KakaoSDKCommon"),
.external(name: "KakaoSDKShare"),
.external(name: "KakaoSDKTemplate"),
.external(name: "AmplitudeSwift"),
],
settings: .settings()
)
Expand Down
73 changes: 73 additions & 0 deletions Projects/CoreKit/Sources/Core/Analytics/AmplitudeManager.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import Foundation
import AmplitudeSwift

/// Amplitude Analytics 관리자
public final class AmplitudeManager {
public static let shared = AmplitudeManager()

private var amplitude: Amplitude?

private init() {}

/// Amplitude 초기화
/// - Parameters:
/// - apiKey: Amplitude API Key
/// - userId: 사용자 ID (옵셔널)
public func initialize(apiKey: String, userId: String? = nil) {
amplitude = Amplitude(configuration: Configuration(
apiKey: apiKey
))

if let userId = userId {
setUserId(userId)
}
}

/// 사용자 ID 설정
/// - Parameter userId: 사용자 ID
public func setUserId(_ userId: String) {
amplitude?.setUserId(userId: userId)
}

/// 사용자 속성 설정
/// - Parameter properties: 사용자 속성
public func setUserProperties(_ properties: [String: Any]) {
let identify = Identify()
properties.forEach { key, value in
identify.set(property: key, value: value)
}
amplitude?.identify(identify: identify)
}

/// 이벤트 전송
/// - Parameter event: AnalyticsEvent
public func track(_ event: AnalyticsEvent) {
guard let amplitude = amplitude else {
print("⚠️ Amplitude가 초기화되지 않았습니다.")
return
}

let eventProperties = event.properties.isEmpty ? nil : event.properties
amplitude.track(
eventType: event.eventName,
eventProperties: eventProperties
)

#if DEBUG
print("📊 [Analytics] \(event.eventName)")
if let properties = eventProperties {
print(" Properties: \(properties)")
}
#endif
}

/// 이벤트 버퍼 즉시 전송
public func flush() {
amplitude?.flush()
}

/// Amplitude 리셋 (로그아웃 시 사용)
public func reset() {
amplitude?.reset()
}
}
Loading
Loading