Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
e3e701d
fix: 온보딩 단계 저장되지 않던 이슈 수정, 아이패드 지원 제거
happy-hodu May 15, 2026
9a19a95
fix: 이미지 빈 경우 소,중,대 위젯 추가. 하단 GNB safearea 추가. 지도 하단 시트 손잡이 drag 추가
happy-hodu May 15, 2026
5d72392
fix: 하단 GNB 로 인한 각 메인 ui 깨짐 수정
happy-hodu May 15, 2026
602692b
feat: 알림 설정 API 연동
happy-hodu May 15, 2026
97cd888
feat: 알림 설정 조회 API 연동
happy-hodu May 18, 2026
8c1b9cf
chore: 릴리즈 버전 업
happy-hodu May 18, 2026
72f8c0d
fix: 키워드 설정 정렬 및 폰트 수정, 사용자 맞춤 추천 캐싱처리. 즐겨찾기 갱신 로직 추가
happy-hodu Jun 5, 2026
c3d9b48
fix: 홈 > 이번주 전시에 국가가 전체 인 경우, 국가 추가. 국내인 경우엔, 지역.
happy-hodu Jun 5, 2026
5ab71fc
fix: 즐겨찾기 필터 해외/국내 별도 선택되도록 수정
happy-hodu Jun 9, 2026
ef98d1a
fix: 지도탭의 국가목록 중, 한국 추가 및 전체 항목 제거
happy-hodu Jun 9, 2026
5d8a2ce
fix: 즐겨찾기 화면 좋아요 상태 업데이트 정상 갱신되지 않는 오류 수정
happy-hodu Jun 9, 2026
b8c1cb8
fix: null check 수정
happy-hodu Jun 10, 2026
5b964ac
fix: 리뷰작성 시, 일자에 년월 위치변경 및 null exception 수정
happy-hodu Jun 12, 2026
5bba275
fix: 즐겨찾기 필터 로직 수정
happy-hodu Jun 15, 2026
51ead67
fix: 운영 도메인 추가, 릴리즈 버전업, 전시상세 폰트 수정
happy-hodu Jun 15, 2026
ead0865
fix: 릴리즈모드에서 운영서버를 바라보도록 수정
happy-hodu Jun 16, 2026
3433dde
fix: 홈 큐레이션 null값인 경우 로딩 -> 오류 화면으로 수정
happy-hodu Jun 17, 2026
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
15 changes: 15 additions & 0 deletions ios/Runner.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -520,8 +520,13 @@
);
PRODUCT_BUNDLE_IDENTIFIER = com.arttrip.ios;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
Expand Down Expand Up @@ -706,9 +711,14 @@
);
PRODUCT_BUNDLE_IDENTIFIER = com.arttrip.ios;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
Expand All @@ -730,8 +740,13 @@
);
PRODUCT_BUNDLE_IDENTIFIER = com.arttrip.ios;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
Expand Down
243 changes: 120 additions & 123 deletions ios/Runner/Info.plist
Original file line number Diff line number Diff line change
@@ -1,130 +1,127 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>ArtTrip</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>arttrip</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>kakao295035084c1e08b86ef4d6a4e107c4fa</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>$(GOOGLE_REVERSED_CLIENT_ID)</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>FirebaseAppDelegateProxyEnabled</key>
<true/>
<key>GIDClientID</key>
<string>$(GOOGLE_CLIENT_ID)</string>
<key>GoogleMapsApiKey</key>
<string>$(GOOGLE_MAPS_API_KEY)</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>kakaokompassauth</string>
<string>kakaolink</string>
<string>kakaoplus</string>
<string>comgooglemaps</string>
</array>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSCameraUsageDescription</key>
<string>사진을 촬영하기 위해 카메라 접근 권한이 필요합니다.</string>
<key>NSLocalNetworkUsageDescription</key>
<string>앱의 디버깅 및 알림 처리를 위해 로컬 네트워크 접근 권한이 필요합니다.</string>
<key>NSLocalNotificationUsageDescription</key>
<string>중요 공지사항 정보를 놓치지 않기 위해 알림 권한이 필요합니다.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>현재 위치를 기반으로 주변 전시를 찾기 위해 위치 정보가 필요합니다.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>현재 위치를 기반으로 주변 전시를 찾기 위해 위치 정보가 필요합니다.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>사진을 첨부하기 위해 사진 라이브러리 접근 권한이 필요합니다.</string>
<key>NSPushNotificationUsageDescription</key>
<string>앱에서 알림을 보내기 위해 사용됩니다.</string>
<key>UIApplicationSceneManifest</key>
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>ArtTrip</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>arttrip</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true />
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true />
<key>UIApplicationSupportsIndirectInputEvents</key>
<true />
<key>UIStatusBarHidden</key>
<true />
<key>UIViewControllerBasedStatusBarAppearance</key>
<false />
<key>LSApplicationQueriesSchemes</key>
<array>
<string>kakaokompassauth</string>
<string>kakaolink</string>
<string>kakaoplus</string>
<string>comgooglemaps</string>
</array>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>kakao295035084c1e08b86ef4d6a4e107c4fa</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>$(GOOGLE_REVERSED_CLIENT_ID)</string>
</array>
</dict>
</array>
<key>NSLocationWhenInUseUsageDescription</key>
<string>현재 위치를 기반으로 주변 전시를 찾기 위해 위치 정보가 필요합니다.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>사진을 첨부하기 위해 사진 라이브러리 접근 권한이 필요합니다.</string>
<key>NSCameraUsageDescription</key>
<string>사진을 촬영하기 위해 카메라 접근 권한이 필요합니다.</string>
<key>GoogleMapsApiKey</key>
<string>$(GOOGLE_MAPS_API_KEY)</string>
<key>GIDClientID</key>
<string>$(GOOGLE_CLIENT_ID)</string>
<!--스플래시
화면에서 상단 시스템바 아이콘 색상을 검정으로 고정 -->
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleDarkContent</string>
<!-- fcm -->
<key>UIBackgroundModes</key>
<array>
<string>remote-notification</string>
<string>processing</string>
<string>fetch</string>
</array>
<key>NSLocalNotificationUsageDescription</key>
<string>중요 공지사항 정보를 놓치지 않기 위해 알림 권한이 필요합니다.</string>
<key>FirebaseAppDelegateProxyEnabled</key>
<true />
<key>NSPushNotificationUsageDescription</key>
<string>앱에서 알림을 보내기 위해 사용됩니다.</string>
<key>NSLocalNetworkUsageDescription</key>
<string>앱의 디버깅 및 알림 처리를 위해 로컬 네트워크 접근 권한이 필요합니다.</string>
<!-- iOS UIScene migration -->
<key>UIApplicationSceneManifest</key>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false />
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneClassName</key>
<string>UIWindowScene</string>
<key>UISceneDelegateClassName</key>
<string>FlutterSceneDelegate</string>
<key>UISceneConfigurationName</key>
<string>flutter</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneClassName</key>
<string>UIWindowScene</string>
<key>UISceneConfigurationName</key>
<string>flutter</string>
<key>UISceneDelegateClassName</key>
<string>FlutterSceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
</dict>
</plist>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UIBackgroundModes</key>
<array>
<string>remote-notification</string>
<string>fetch</string>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIStatusBarHidden</key>
<true/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleDarkContent</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
</plist>
1 change: 1 addition & 0 deletions lib/core/api_endpoints.dart
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class ApiEndpoints {
static const me = '/me';
static const meImage = '/me/image';
static const meRecentExhibits = '/me/recent-exhibits';
static const mePushEnabled = '/me/push-enabled';

// ─── Keywords ───
static const keywordAll = '/keyword/all';
Expand Down
4 changes: 4 additions & 0 deletions lib/core/app_consts.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import 'package:flutter/foundation.dart';

class AppConsts {
const AppConsts._();

static const bool _useDevServer = true; // true: 개발 서버, false: 운영 서버
static const bool isDevServer = _useDevServer && !kReleaseMode;
static const bool useMock = false; // Force using dummy data
static const int mockLoadingDelayMs =
500; // Dummy data loading delay in milliseconds
Expand Down
18 changes: 18 additions & 0 deletions lib/core/config/prefs.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:arttrip/core/app_utils.dart';
import 'package:arttrip/core/enum.dart';
import 'package:shared_preferences/shared_preferences.dart';

/// SharedPreferences 공용 클래스
Expand Down Expand Up @@ -66,4 +67,21 @@ class Prefs {
await prefs.setString(_fcmTokenKey, value);
}
}

// ============================================
// Onboarding Step
// ============================================

static const String _onboardingStepKey = 'onboarding_step';

OnboardingStep? get onboardingStep =>
OnboardingStep.fromString(prefs.getString(_onboardingStepKey));

Future<void> setOnboardingStep(OnboardingStep? value) async {
if (value == null) {
await prefs.remove(_onboardingStepKey);
} else {
await prefs.setString(_onboardingStepKey, value.type);
}
}
}
5 changes: 4 additions & 1 deletion lib/core/env.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:arttrip/core/app_consts.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';

/// 환경 변수 접근 클래스
Expand All @@ -9,7 +10,9 @@ class Env {
dotenv.env['KAKAO_NATIVE_APP_KEY'] ?? '';

/// API Base URL
static String get apiBaseUrl => dotenv.env['API_BASE_URL'] ?? '';
static String get apiBaseUrl => AppConsts.isDevServer
? dotenv.env['API_BASE_URL'] ?? ''
: dotenv.env['REAL_API_BASE_URL'] ?? '';

/// Google iOS Client ID (웹 앱 Client ID와 같은 GCP 프로젝트의 iOS 타입)
static String get googleClientId => dotenv.env['GOOGLE_CLIENT_ID'] ?? '';
Expand Down
Loading
Loading