From 8279d4bb17e9d8c198420649f9443ab17f0618b1 Mon Sep 17 00:00:00 2001 From: hansoo Date: Sun, 23 Mar 2025 21:39:27 +0900 Subject: [PATCH] =?UTF-8?q?=EC=95=88=EB=93=9C=EB=A1=9C=EC=9D=B4=EB=93=9C?= =?UTF-8?q?=20=EB=B2=84=EC=A0=84=20=EC=A0=95=EB=B3=B4=20=ED=91=9C=EC=8B=9C?= =?UTF-8?q?=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0=20(Lovable=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=EC=82=AC=ED=95=AD=20=EB=B3=91=ED=95=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle | 20 ++- .../lovable/zellyfinance/BuildInfoPlugin.java | 50 +++--- src/utils/platform.ts | 142 ++++++++---------- 3 files changed, 102 insertions(+), 110 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 20cd809..fe19eb4 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,5 +1,19 @@ apply plugin: 'com.android.application' +// 버전 정보를 properties 파일에서 동적으로 로드 +def versionPropsFile = rootProject.file('version.properties') +def versionProps = new Properties() +if (versionPropsFile.exists()) { + versionPropsFile.withInputStream { stream -> versionProps.load(stream) } +} + +def versionName = versionProps['versionName'] ?: "1.1.1.2" +def versionCode = (versionProps['versionCode'] ?: "6").toInteger() +def buildNumber = (versionProps['buildNumber'] ?: "6").toInteger() + +// 버전 정보 로깅 +println "버전 정보 로드: versionName=${versionName}, versionCode=${versionCode}, buildNumber=${buildNumber}" + // 버전 정보를 직접 설정 android { namespace "com.lovable.zellyfinance" @@ -8,10 +22,10 @@ android { applicationId "com.lovable.zellyfinance" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 6 - versionName "1.1.1.2" + versionCode versionCode + versionName "${versionName}" // 빌드 번호 추가 - BuildConfig 필드로 정의 - buildConfigField "int", "BUILD_NUMBER", "6" + buildConfigField "int", "BUILD_NUMBER", "${buildNumber}" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. diff --git a/android/app/src/main/java/com/lovable/zellyfinance/BuildInfoPlugin.java b/android/app/src/main/java/com/lovable/zellyfinance/BuildInfoPlugin.java index 939d2c4..0957128 100644 --- a/android/app/src/main/java/com/lovable/zellyfinance/BuildInfoPlugin.java +++ b/android/app/src/main/java/com/lovable/zellyfinance/BuildInfoPlugin.java @@ -1,4 +1,3 @@ - package com.lovable.zellyfinance; import android.os.Build; @@ -27,17 +26,28 @@ public class BuildInfoPlugin extends Plugin { JSObject ret = new JSObject(); - // 빌드 정보 수집 + // BuildConfig에서 동적으로 버전 정보 가져오기 String versionName = BuildConfig.VERSION_NAME; int versionCode = BuildConfig.VERSION_CODE; - int buildNumber = BuildConfig.BUILD_NUMBER; - String packageName = getContext().getPackageName(); + int buildNumber; - // 디버깅을 위한 로그 출력 개선 - Log.d(TAG, "앱 버전 정보 준비 - 버전명: " + versionName); - Log.d(TAG, "앱 버전 정보 준비 - 버전 코드: " + versionCode); - Log.d(TAG, "앱 버전 정보 준비 - 빌드 번호: " + buildNumber); - Log.d(TAG, "앱 버전 정보 준비 - 패키지명: " + packageName); + // 빌드 넘버는 커스텀 필드이므로 try-catch로 확인 + try { + buildNumber = BuildConfig.BUILD_NUMBER; + Log.d(TAG, "BuildConfig.BUILD_NUMBER: " + buildNumber); + } catch (Exception e) { + Log.e(TAG, "BUILD_NUMBER 필드 접근 오류, 기본값 사용", e); + buildNumber = versionCode; // 빌드 넘버가 없으면 버전 코드와 동일하게 설정 + } + + // 디버깅을 위한 로그 출력 + Log.d(TAG, "BuildConfig 클래스: " + BuildConfig.class.getName()); + Log.d(TAG, "버전명: " + versionName); + Log.d(TAG, "버전 코드: " + versionCode); + Log.d(TAG, "빌드 번호: " + buildNumber); + + String packageName = getContext().getPackageName(); + Log.d(TAG, "패키지명: " + packageName); // 결과 객체에 값 설정 ret.put("versionName", versionName); @@ -49,25 +59,17 @@ public class BuildInfoPlugin extends Plugin { ret.put("platform", "android"); // 현재 날짜를 디버깅 정보로 추가 - ret.put("buildDate", new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.util.Date())); ret.put("timestamp", System.currentTimeMillis()); - Log.d(TAG, "빌드 정보 응답 성공: " + ret.toString()); + // 성공 응답 call.resolve(ret); } catch (Exception e) { - Log.e(TAG, "빌드 정보 가져오기 실패", e); - - // 오류 발생 시에도 기본 정보 반환하여 앱 중단 방지 - JSObject errorResult = new JSObject(); - errorResult.put("versionName", "1.1.1.2"); // 최신 버전으로 업데이트 - errorResult.put("versionCode", 6); // 최신 버전 코드로 업데이트 - errorResult.put("buildNumber", 6); // 최신 빌드 번호로 업데이트 - errorResult.put("error", e.getMessage()); - errorResult.put("errorType", e.getClass().getName()); - errorResult.put("platform", "android-error"); - - Log.d(TAG, "오류 발생으로 기본값 반환: " + errorResult.toString()); - call.resolve(errorResult); + // 오류 로깅 강화 + Log.e(TAG, "빌드 정보 가져오기 오류", e); + JSObject errorObj = new JSObject(); + errorObj.put("message", e.getMessage()); + errorObj.put("stack", Log.getStackTraceString(e)); + call.reject("빌드 정보 가져오기 실패", errorObj); } } } diff --git a/src/utils/platform.ts b/src/utils/platform.ts index eae23a8..1a5af86 100644 --- a/src/utils/platform.ts +++ b/src/utils/platform.ts @@ -1,4 +1,3 @@ - /** * 플랫폼 관련 유틸리티 함수들 */ @@ -30,104 +29,81 @@ export const isNativePlatform = (): boolean => { * 앱 버전 정보 가져오기 */ export const getAppVersionInfo = async () => { + // 기본값 설정 - 플러그인 실패 시 사용 + const defaultVersionInfo = { + versionName: '1.0.0', + versionCode: 1, + buildNumber: 1, + platform: Capacitor.getPlatform(), + defaultValues: true + }; + try { - // 플랫폼 정보를 먼저 로깅 - const currentPlatform = Capacitor.getPlatform(); - console.log('현재 플랫폼:', currentPlatform); - - // 플러그인 가용성을 확인하고 로깅 - const isPluginAvailable = Capacitor.isPluginAvailable('BuildInfo'); - console.log('플러그인 가용성 확인:', isPluginAvailable); + // 디버깅을 위한 플랫폼 체크 로그 + console.log('현재 플랫폼:', Capacitor.getPlatform()); + console.log('플러그인 가용성 확인:', Capacitor.isPluginAvailable('BuildInfo')); // BuildInfoPlugin이 설치되어 있다면 사용 - if (isPluginAvailable) { + if (Capacitor.isPluginAvailable('BuildInfo')) { try { // 플러그인 호출 시도 - // @ts-ignore - 플러그인이 런타임에 등록되므로 타입 체크를 무시 + // @ts-expect-error - 플러그인이 런타임에 등록되므로 타입 체크를 무시 const buildInfo = await Capacitor.Plugins.BuildInfo.getBuildInfo(); - console.log('네이티브에서 받은 빌드 정보:', buildInfo); + console.log('네이티브에서 받은 빌드 정보(raw):', JSON.stringify(buildInfo)); - // 받은 정보가 유효한지 확인 - if (buildInfo && typeof buildInfo === 'object') { - // 값 존재 여부 확인 및 기본값 설정 - const versionName = buildInfo.versionName || '1.1.1.2'; - - // iOS에서는 buildNumber가 문자열로 올 수 있으므로 숫자로 변환 - let buildNumberValue = buildInfo.buildNumber; - if (typeof buildNumberValue === 'string') { - buildNumberValue = parseInt(buildNumberValue, 10); - } - - // 빌드 번호가 NaN이거나 undefined인 경우 기본값 사용 - const finalBuildNumber = !isNaN(buildNumberValue) && buildNumberValue !== undefined - ? buildNumberValue - : 6; // 업데이트된 기본값 - - // 버전 코드도 동일하게 처리 - let versionCodeValue = buildInfo.versionCode; - if (typeof versionCodeValue === 'string') { - versionCodeValue = parseInt(versionCodeValue, 10); - } - - const finalVersionCode = !isNaN(versionCodeValue) && versionCodeValue !== undefined - ? versionCodeValue - : 6; // 업데이트된 기본값 - - return { - versionName: versionName, - buildNumber: finalBuildNumber, - versionCode: finalVersionCode, - platform: currentPlatform, - pluginResponse: JSON.stringify(buildInfo), - timestamp: new Date().toISOString() - }; - } else { - console.warn('빌드 정보가 유효한 객체가 아닙니다:', buildInfo); + // 수신한 데이터가 null 또는 undefined인 경우 체크 + if (!buildInfo) { + console.warn('네이티브 빌드 정보가 없음'); + throw new Error('빌드 정보를 받지 못했습니다'); } + + // 받은 정보가 유효한지 확인 및 타입 변환 + if (typeof buildInfo === 'object') { + // 타입 변환 및 기본값 설정 - 명시적으로 문자열/숫자 타입 변환 + const result = { + versionName: typeof buildInfo.versionName === 'string' ? buildInfo.versionName : + (buildInfo.versionName ? String(buildInfo.versionName) : defaultVersionInfo.versionName), + versionCode: typeof buildInfo.versionCode === 'number' ? buildInfo.versionCode : + (buildInfo.versionCode ? Number(buildInfo.versionCode) : defaultVersionInfo.versionCode), + buildNumber: typeof buildInfo.buildNumber === 'number' ? buildInfo.buildNumber : + (buildInfo.buildNumber ? Number(buildInfo.buildNumber) : defaultVersionInfo.buildNumber), + platform: typeof buildInfo.platform === 'string' ? buildInfo.platform : + (buildInfo.platform ? String(buildInfo.platform) : defaultVersionInfo.platform), + timestamp: buildInfo.timestamp || Date.now(), + pluginResponse: JSON.stringify(buildInfo) + }; + + // 값이 기본값인지 확인 (BuildConfig에서 기본값을 반환하는 경우) + if (result.versionName === '1.0' && result.versionCode === 1 && isAndroidPlatform()) { + console.warn('플러그인이 기본값을 반환함, 빌드 설정을 확인해야 함'); + } + + console.log('변환된 빌드 정보:', result); + return result; + } + throw new Error('유효하지 않은 빌드 정보 응답'); } catch (pluginError) { console.error('BuildInfo 플러그인 호출 오류:', pluginError); + // 오류 발생시 기본값 사용 + return { + ...defaultVersionInfo, + error: true, + errorMessage: String(pluginError) + }; } + } else { + console.warn('BuildInfo 플러그인을 사용할 수 없음'); + // 플러그인이 없는 경우 기본값 반환 + return defaultVersionInfo; } - - // 안드로이드인 경우 기본값을 최신 버전 값으로 설정 - if (isAndroidPlatform()) { - console.log('안드로이드 기본 빌드 정보 반환'); - return { - versionName: '1.1.1.2', // 업데이트된 버전명 - buildNumber: 6, // 업데이트된 빌드 번호 - versionCode: 6, // 업데이트된 버전 코드 - platform: 'android', - isDefault: true - }; - } - - // iOS인 경우 기본값 - if (isIOSPlatform()) { - console.log('iOS 기본 빌드 정보 반환'); - return { - versionName: '1.1.1.2', // 업데이트된 버전명 - buildNumber: 6, // 업데이트된 빌드 번호 - platform: 'ios', - isDefault: true - }; - } - - // 플러그인이 없는 경우 기본값 반환 - console.log('웹 기본 빌드 정보 반환'); - return { - versionName: '1.1.1.2', // 업데이트된 버전명 - buildNumber: 6, // 업데이트된 빌드 번호 - platform: currentPlatform, - isDefault: true - }; } catch (error) { - console.error('앱 버전 정보를 가져오는 중 오류 발생:', error); + console.error('앱 버전 정보 가져오기 오류:', error); + // 오류 발생 시에도 앱 실행은 계속되도록 기본값 반환 return { - versionName: '1.1.1.2', // 업데이트된 버전명 - buildNumber: 6, // 업데이트된 빌드 번호 + ...defaultVersionInfo, error: true, - errorMessage: error instanceof Error ? error.message : String(error) + errorMessage: String(error) }; } };