Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
86 changes: 81 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,51 @@ jobs:
printf '%s' "$IOS_GOOGLE_SERVICE_INFO_PLIST" | base64 --decode > macos/Runner/GoogleService-Info.plist
fi

- name: Verify Firebase config files
run: |
set -euo pipefail

echo "🔍 Verifying Firebase configuration files..."

# Check if google-services.json exists and is valid
if [ ! -f "android/app/google-services.json" ]; then
echo "❌ android/app/google-services.json does not exist" >&2
exit 1
fi

# Check if file is not empty
if [ ! -s "android/app/google-services.json" ]; then
echo "❌ android/app/google-services.json is empty" >&2
exit 1
fi

# Check if JSON is valid and contains the expected package name
if ! python3 -c "import json, sys; data = json.load(open('android/app/google-services.json')); clients = [c for c in data.get('client', []) if c.get('client_info', {}).get('android_client_info', {}).get('package_name') == 'com.clustudy.clustudy']; sys.exit(0 if clients else 1)" 2>/dev/null; then
echo "⚠️ Warning: google-services.json does not contain package name 'com.clustudy.clustudy'" >&2
echo "📄 File contents (first 500 chars):" >&2
head -c 500 android/app/google-services.json | cat >&2
echo "" >&2
echo "🔍 Searching for package names in file:" >&2
python3 -c "import json; data = json.load(open('android/app/google-services.json')); [print(f\" - {c.get('client_info', {}).get('android_client_info', {}).get('package_name', 'N/A')}\") for c in data.get('client', [])]" 2>/dev/null || echo " Could not parse JSON" >&2
exit 1
fi

echo "✅ android/app/google-services.json is valid and contains expected package name"

- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
channel: "stable"
cache: true

- name: Install FlutterFire CLI
run: |
dart pub global activate flutterfire_cli
echo "$HOME/.pub-cache/bin" >> "$GITHUB_PATH"
export PATH="$PATH:$HOME/.pub-cache/bin"
flutterfire --version

- name: Get dependencies
run: flutter pub get

Expand Down Expand Up @@ -119,6 +157,37 @@ jobs:
printf '%s' "$IOS_GOOGLE_SERVICE_INFO_PLIST" | base64 --decode > macos/Runner/GoogleService-Info.plist
fi

- name: Verify Firebase config files
run: |
set -euo pipefail

echo "🔍 Verifying Firebase configuration files..."

# Check if google-services.json exists and is valid
if [ ! -f "android/app/google-services.json" ]; then
echo "❌ android/app/google-services.json does not exist" >&2
exit 1
fi

# Check if file is not empty
if [ ! -s "android/app/google-services.json" ]; then
echo "❌ android/app/google-services.json is empty" >&2
exit 1
fi

# Check if JSON is valid and contains the expected package name
if ! python3 -c "import json, sys; data = json.load(open('android/app/google-services.json')); clients = [c for c in data.get('client', []) if c.get('client_info', {}).get('android_client_info', {}).get('package_name') == 'com.clustudy.clustudy']; sys.exit(0 if clients else 1)" 2>/dev/null; then
echo "⚠️ Warning: google-services.json does not contain package name 'com.clustudy.clustudy'" >&2
echo "📄 File contents (first 500 chars):" >&2
head -c 500 android/app/google-services.json | cat >&2
echo "" >&2
echo "🔍 Searching for package names in file:" >&2
python3 -c "import json; data = json.load(open('android/app/google-services.json')); [print(f\" - {c.get('client_info', {}).get('android_client_info', {}).get('package_name', 'N/A')}\") for c in data.get('client', [])]" 2>/dev/null || echo " Could not parse JSON" >&2
exit 1
fi

echo "✅ android/app/google-services.json is valid and contains expected package name"

- name: Setup Java
uses: actions/setup-java@v4
with:
Expand Down Expand Up @@ -219,6 +288,13 @@ jobs:
channel: "stable"
cache: true

- name: Install FlutterFire CLI
run: |
dart pub global activate flutterfire_cli
echo "$HOME/.pub-cache/bin" >> "$GITHUB_PATH"
export PATH="$PATH:$HOME/.pub-cache/bin"
flutterfire --version

- name: Cache Flutter dependencies
uses: actions/cache@v4
with:
Expand All @@ -242,14 +318,14 @@ jobs:
pod install
cd ..

- name: Build iOS (no codesign)
run: flutter build ios --release --no-codesign
- name: Build iOS (simulator only)
run: flutter build ios --debug --simulator

- name: Verify iOS build
run: |
if [ -d "build/ios/iphoneos/Runner.app" ]; then
echo "✅ iOS build successful"
ls -la build/ios/iphoneos/
if [ -d "build/ios/iphonesimulator/Runner.app" ]; then
echo "✅ iOS simulator build successful"
ls -la build/ios/iphonesimulator/
else
echo "❌ iOS build failed"
exit 1
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ app.*.map.json
**/*.key
**/*.pem
**/key.properties
.github-secrets/

# iOS related
**/ios/Flutter/App.framework
Expand Down
11 changes: 2 additions & 9 deletions LEGAL_TEMPLATES.md → LEGAL.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,6 @@
# 법적 문서 템플릿
# 법적 문서

이 문서는 Clustudy 앱스토어 출시를 위한 개인정보 보호 정책 및 이용약관 템플릿입니다.

## 사용 방법

1. 아래 템플릿을 복사하여 사용하세요
2. `[PLACEHOLDER]`로 표시된 부분을 실제 정보로 교체하세요
3. 법적 검토가 필요한 경우 전문가와 상담하세요
4. 최종 버전을 `lib/design_system/screens/settings/widgets/legal_text_dialog.dart`의 `dummyPrivacyPolicyText`, `dummyTermsOfServiceText` 상수에 복사하세요
이 문서는 Clustudy 앱스토어 출시를 위한 개인정보 보호 정책 및 이용약관 입니다.

---

Expand Down
5 changes: 3 additions & 2 deletions android/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ plugins {
id("com.android.application")
// START: FlutterFire Configuration
id("com.google.gms.google-services")
id("com.google.firebase.crashlytics")
// END: FlutterFire Configuration
id("kotlin-android")
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
Expand All @@ -21,7 +22,7 @@ val hasReleaseKeystore = if (keystorePropertiesFile.exists()) {
}

android {
namespace = "com.trycatchping.clustudy"
namespace = "com.clustudy.clustudy"
compileSdk = flutter.compileSdkVersion
ndkVersion = "29.0.13599879"

Expand All @@ -35,7 +36,7 @@ android {
}

defaultConfig {
applicationId = "com.trycatchping.clustudy"
applicationId = "com.clustudy.clustudy"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.trycatchping.clustudy
package com.clustudy.clustudy

import android.os.Handler
import android.os.Looper
Expand All @@ -10,7 +10,7 @@ import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel

private const val INSTALL_REFERRER_CHANNEL =
"com.trycatchping.clustudy/install_referrer"
"com.clustudy.clustudy/install_referrer"

class MainActivity : FlutterActivity() {
private val mainHandler = Handler(Looper.getMainLooper())
Expand Down
1 change: 1 addition & 0 deletions android/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ plugins {
id("com.android.application") version "8.7.3" apply false
// START: FlutterFire Configuration
id("com.google.gms.google-services") version("4.3.15") apply false
id("com.google.firebase.crashlytics") version("2.8.1") apply false
// END: FlutterFire Configuration
id("org.jetbrains.kotlin.android") version "2.1.0" apply false
}
Expand Down
File renamed without changes.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/그래픽이미지.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion firebase.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"flutter":{"platforms":{"android":{"default":{"projectId":"clustudy-taeung","appId":"1:1818279587:android:c0167b49740c31c5c7c916","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"clustudy-taeung","appId":"1:1818279587:ios:221dd0c885ebd6bac7c916","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"macos":{"default":{"projectId":"clustudy-taeung","appId":"1:1818279587:ios:221dd0c885ebd6bac7c916","uploadDebugSymbols":false,"fileOutput":"macos/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"clustudy-taeung","configurations":{"android":"1:1818279587:android:c0167b49740c31c5c7c916","ios":"1:1818279587:ios:221dd0c885ebd6bac7c916","macos":"1:1818279587:ios:221dd0c885ebd6bac7c916","web":"1:1818279587:web:ad8e4508c47c22e0c7c916","windows":"1:1818279587:web:41abeccf7931ea47c7c916"}}}}}}
{"flutter":{"platforms":{"android":{"default":{"projectId":"clustudy-2baa4","appId":"1:467430016303:android:e7972d16cf6c22bfe98dda","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"clustudy-2baa4","appId":"1:467430016303:ios:a916328bd25c3dcce98dda","uploadDebugSymbols":true,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"macos":{"default":{"projectId":"clustudy-2baa4","appId":"1:467430016303:ios:a916328bd25c3dcce98dda","uploadDebugSymbols":true,"fileOutput":"macos/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"clustudy-2baa4","configurations":{"android":"1:467430016303:android:e7972d16cf6c22bfe98dda","ios":"1:467430016303:ios:a916328bd25c3dcce98dda","macos":"1:467430016303:ios:a916328bd25c3dcce98dda","web":"1:467430016303:web:b8f05911336ae18de98dda","windows":"1:467430016303:web:ed8ec57c962c693ee98dda"}}}}}}
Binary file added fonts/Pretendard-Bold.otf
Binary file not shown.
Binary file added fonts/Pretendard-Regular.otf
Binary file not shown.
Binary file added fonts/Pretendard-SemiBold.otf
Binary file not shown.
19 changes: 19 additions & 0 deletions ios/Runner.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
595C6E4E49691832B8FBF459 /* [CP] Copy Pods Resources */,
29EC9DA13CF69125BB54B02B /* FlutterFire: "flutterfire upload-crashlytics-symbols" */,
);
buildRules = (
);
Expand Down Expand Up @@ -274,6 +275,24 @@
/* End PBXResourcesBuildPhase section */

/* Begin PBXShellScriptBuildPhase section */
29EC9DA13CF69125BB54B02B /* FlutterFire: "flutterfire upload-crashlytics-symbols" */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "FlutterFire: \"flutterfire upload-crashlytics-symbols\"";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\n#!/bin/bash\nPATH=\"${PATH}:$FLUTTER_ROOT/bin:${PUB_CACHE}/bin:$HOME/.pub-cache/bin\"\n\nif [ -z \"$PODS_ROOT\" ] || [ ! -d \"$PODS_ROOT/FirebaseCrashlytics\" ]; then\n # Cannot use \"BUILD_DIR%/Build/*\" as per Firebase documentation, it points to \"flutter-project/build/ios/*\" path which doesn't have run script\n DERIVED_DATA_PATH=$(echo \"$BUILD_ROOT\" | sed -E 's|(.*DerivedData/[^/]+).*|\\1|')\n PATH_TO_CRASHLYTICS_UPLOAD_SCRIPT=\"${DERIVED_DATA_PATH}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run\"\nelse\n PATH_TO_CRASHLYTICS_UPLOAD_SCRIPT=\"$PODS_ROOT/FirebaseCrashlytics/run\"\nfi\n\n# Command to upload symbols script used to upload symbols to Firebase server\nflutterfire upload-crashlytics-symbols --upload-symbols-script-path=\"$PATH_TO_CRASHLYTICS_UPLOAD_SCRIPT\" --platform=ios --apple-project-path=\"${SRCROOT}\" --env-platform-name=\"${PLATFORM_NAME}\" --env-configuration=\"${CONFIGURATION}\" --env-project-dir=\"${PROJECT_DIR}\" --env-built-products-dir=\"${BUILT_PRODUCTS_DIR}\" --env-dwarf-dsym-folder-path=\"${DWARF_DSYM_FOLDER_PATH}\" --env-dwarf-dsym-file-name=\"${DWARF_DSYM_FILE_NAME}\" --env-infoplist-path=\"${INFOPLIST_PATH}\" --default-config=default\n";
};
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
Expand Down
Loading