안드로이드 버전 정보 표시 문제 해결 (Lovable 변경사항 병합)

This commit is contained in:
hansoo
2025-03-23 21:39:27 +09:00
parent 0aca18c276
commit 8279d4bb17
3 changed files with 102 additions and 110 deletions

View File

@@ -1,5 +1,19 @@
apply plugin: 'com.android.application' 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 { android {
namespace "com.lovable.zellyfinance" namespace "com.lovable.zellyfinance"
@@ -8,10 +22,10 @@ android {
applicationId "com.lovable.zellyfinance" applicationId "com.lovable.zellyfinance"
minSdkVersion rootProject.ext.minSdkVersion minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 6 versionCode versionCode
versionName "1.1.1.2" versionName "${versionName}"
// 빌드 번호 추가 - BuildConfig 필드로 정의 // 빌드 번호 추가 - BuildConfig 필드로 정의
buildConfigField "int", "BUILD_NUMBER", "6" buildConfigField "int", "BUILD_NUMBER", "${buildNumber}"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions { aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.

View File

@@ -1,4 +1,3 @@
package com.lovable.zellyfinance; package com.lovable.zellyfinance;
import android.os.Build; import android.os.Build;
@@ -27,17 +26,28 @@ public class BuildInfoPlugin extends Plugin {
JSObject ret = new JSObject(); JSObject ret = new JSObject();
// 빌드 정보 수집 // BuildConfig에서 동적으로 버전 정보 가져오기
String versionName = BuildConfig.VERSION_NAME; String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE; int versionCode = BuildConfig.VERSION_CODE;
int buildNumber = BuildConfig.BUILD_NUMBER; int buildNumber;
String packageName = getContext().getPackageName();
// 디버깅을 위한 로그 출력 개선 // 빌드 넘버는 커스텀 필드이므로 try-catch로 확인
Log.d(TAG, "앱 버전 정보 준비 - 버전명: " + versionName); try {
Log.d(TAG, "앱 버전 정보 준비 - 버전 코드: " + versionCode); buildNumber = BuildConfig.BUILD_NUMBER;
Log.d(TAG, "앱 버전 정보 준비 - 빌드 번호: " + buildNumber); Log.d(TAG, "BuildConfig.BUILD_NUMBER: " + buildNumber);
Log.d(TAG, "앱 버전 정보 준비 - 패키지명: " + packageName); } 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); ret.put("versionName", versionName);
@@ -49,25 +59,17 @@ public class BuildInfoPlugin extends Plugin {
ret.put("platform", "android"); 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()); ret.put("timestamp", System.currentTimeMillis());
Log.d(TAG, "빌드 정보 응답 성공: " + ret.toString()); // 성공 응답
call.resolve(ret); call.resolve(ret);
} catch (Exception e) { } catch (Exception e) {
Log.e(TAG, "빌드 정보 가져오기 실패", e); // 오류 로깅 강화
Log.e(TAG, "빌드 정보 가져오기 오류", e);
// 오류 발생 시에도 기본 정보 반환하여 앱 중단 방지 JSObject errorObj = new JSObject();
JSObject errorResult = new JSObject(); errorObj.put("message", e.getMessage());
errorResult.put("versionName", "1.1.1.2"); // 최신 버전으로 업데이트 errorObj.put("stack", Log.getStackTraceString(e));
errorResult.put("versionCode", 6); // 최신 버전 코드로 업데이트 call.reject("빌드 정보 가져오기 실패", errorObj);
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);
} }
} }
} }

View File

@@ -1,4 +1,3 @@
/** /**
* 플랫폼 관련 유틸리티 함수들 * 플랫폼 관련 유틸리티 함수들
*/ */
@@ -30,104 +29,81 @@ export const isNativePlatform = (): boolean => {
* 앱 버전 정보 가져오기 * 앱 버전 정보 가져오기
*/ */
export const getAppVersionInfo = async () => { export const getAppVersionInfo = async () => {
try { // 기본값 설정 - 플러그인 실패 시 사용
// 플랫폼 정보를 먼저 로깅 const defaultVersionInfo = {
const currentPlatform = Capacitor.getPlatform(); versionName: '1.0.0',
console.log('현재 플랫폼:', currentPlatform); versionCode: 1,
buildNumber: 1,
platform: Capacitor.getPlatform(),
defaultValues: true
};
// 플러그인 가용성을 확인하고 로깅 try {
const isPluginAvailable = Capacitor.isPluginAvailable('BuildInfo'); // 디버깅을 위한 플랫폼 체크 로그
console.log('플러그인 가용성 확인:', isPluginAvailable); console.log('현재 플랫폼:', Capacitor.getPlatform());
console.log('플러그인 가용성 확인:', Capacitor.isPluginAvailable('BuildInfo'));
// BuildInfoPlugin이 설치되어 있다면 사용 // BuildInfoPlugin이 설치되어 있다면 사용
if (isPluginAvailable) { if (Capacitor.isPluginAvailable('BuildInfo')) {
try { try {
// 플러그인 호출 시도 // 플러그인 호출 시도
// @ts-ignore - 플러그인이 런타임에 등록되므로 타입 체크를 무시 // @ts-expect-error - 플러그인이 런타임에 등록되므로 타입 체크를 무시
const buildInfo = await Capacitor.Plugins.BuildInfo.getBuildInfo(); const buildInfo = await Capacitor.Plugins.BuildInfo.getBuildInfo();
console.log('네이티브에서 받은 빌드 정보:', buildInfo); console.log('네이티브에서 받은 빌드 정보(raw):', JSON.stringify(buildInfo));
// 받은 정보가 유효한지 확인 // 수신한 데이터가 null 또는 undefined인 경우 체크
if (buildInfo && typeof buildInfo === 'object') { if (!buildInfo) {
// 값 존재 여부 확인 및 기본값 설정 console.warn('네이티브 빌드 정보가 없음');
const versionName = buildInfo.versionName || '1.1.1.2'; throw new Error('빌드 정보를 받지 못했습니다');
// iOS에서는 buildNumber가 문자열로 올 수 있으므로 숫자로 변환
let buildNumberValue = buildInfo.buildNumber;
if (typeof buildNumberValue === 'string') {
buildNumberValue = parseInt(buildNumberValue, 10);
} }
// 빌드 번호가 NaN이거나 undefined인 경우 기본값 사용 // 받은 정보가 유효한지 확인 및 타입 변환
const finalBuildNumber = !isNaN(buildNumberValue) && buildNumberValue !== undefined if (typeof buildInfo === 'object') {
? buildNumberValue // 타입 변환 및 기본값 설정 - 명시적으로 문자열/숫자 타입 변환
: 6; // 업데이트된 기본값 const result = {
versionName: typeof buildInfo.versionName === 'string' ? buildInfo.versionName :
// 버전 코드도 동일하게 처리 (buildInfo.versionName ? String(buildInfo.versionName) : defaultVersionInfo.versionName),
let versionCodeValue = buildInfo.versionCode; versionCode: typeof buildInfo.versionCode === 'number' ? buildInfo.versionCode :
if (typeof versionCodeValue === 'string') { (buildInfo.versionCode ? Number(buildInfo.versionCode) : defaultVersionInfo.versionCode),
versionCodeValue = parseInt(versionCodeValue, 10); buildNumber: typeof buildInfo.buildNumber === 'number' ? buildInfo.buildNumber :
} (buildInfo.buildNumber ? Number(buildInfo.buildNumber) : defaultVersionInfo.buildNumber),
platform: typeof buildInfo.platform === 'string' ? buildInfo.platform :
const finalVersionCode = !isNaN(versionCodeValue) && versionCodeValue !== undefined (buildInfo.platform ? String(buildInfo.platform) : defaultVersionInfo.platform),
? versionCodeValue timestamp: buildInfo.timestamp || Date.now(),
: 6; // 업데이트된 기본값 pluginResponse: JSON.stringify(buildInfo)
return {
versionName: versionName,
buildNumber: finalBuildNumber,
versionCode: finalVersionCode,
platform: currentPlatform,
pluginResponse: JSON.stringify(buildInfo),
timestamp: new Date().toISOString()
}; };
} else {
console.warn('빌드 정보가 유효한 객체가 아닙니다:', buildInfo); // 값이 기본값인지 확인 (BuildConfig에서 기본값을 반환하는 경우)
if (result.versionName === '1.0' && result.versionCode === 1 && isAndroidPlatform()) {
console.warn('플러그인이 기본값을 반환함, 빌드 설정을 확인해야 함');
} }
console.log('변환된 빌드 정보:', result);
return result;
}
throw new Error('유효하지 않은 빌드 정보 응답');
} catch (pluginError) { } catch (pluginError) {
console.error('BuildInfo 플러그인 호출 오류:', pluginError); console.error('BuildInfo 플러그인 호출 오류:', pluginError);
} // 오류 발생시 기본값 사용
}
// 안드로이드인 경우 기본값을 최신 버전 값으로 설정
if (isAndroidPlatform()) {
console.log('안드로이드 기본 빌드 정보 반환');
return { return {
versionName: '1.1.1.2', // 업데이트된 버전명 ...defaultVersionInfo,
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);
return {
versionName: '1.1.1.2', // 업데이트된 버전명
buildNumber: 6, // 업데이트된 빌드 번호
error: true, error: true,
errorMessage: error instanceof Error ? error.message : String(error) errorMessage: String(pluginError)
};
}
} else {
console.warn('BuildInfo 플러그인을 사용할 수 없음');
// 플러그인이 없는 경우 기본값 반환
return defaultVersionInfo;
}
} catch (error) {
console.error('앱 버전 정보 가져오기 오류:', error);
// 오류 발생 시에도 앱 실행은 계속되도록 기본값 반환
return {
...defaultVersionInfo,
error: true,
errorMessage: String(error)
}; };
} }
}; };