Fix: Update version info on settings page
Investigates and resolves the issue where the app version and build number were not updating correctly on the settings page.
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
package com.lovable.zellyfinance;
|
package com.lovable.zellyfinance;
|
||||||
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
@@ -45,11 +46,12 @@ public class BuildInfoPlugin extends Plugin {
|
|||||||
ret.put("packageName", packageName);
|
ret.put("packageName", packageName);
|
||||||
ret.put("androidVersion", Build.VERSION.RELEASE);
|
ret.put("androidVersion", Build.VERSION.RELEASE);
|
||||||
ret.put("androidSDK", Build.VERSION.SDK_INT);
|
ret.put("androidSDK", Build.VERSION.SDK_INT);
|
||||||
|
ret.put("platform", "android");
|
||||||
|
|
||||||
// 현재 날짜를 디버깅 정보로 추가
|
// 현재 날짜를 디버깅 정보로 추가
|
||||||
ret.put("buildDate", new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.util.Date()));
|
ret.put("buildDate", new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.util.Date()));
|
||||||
|
|
||||||
Log.d(TAG, "빌드 정보 요청 성공 처리");
|
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);
|
||||||
@@ -58,6 +60,7 @@ public class BuildInfoPlugin extends Plugin {
|
|||||||
errorResult.put("versionCode", 1);
|
errorResult.put("versionCode", 1);
|
||||||
errorResult.put("buildNumber", 1);
|
errorResult.put("buildNumber", 1);
|
||||||
errorResult.put("error", e.getMessage());
|
errorResult.put("error", e.getMessage());
|
||||||
|
errorResult.put("platform", "android-error");
|
||||||
call.resolve(errorResult); // 에러가 발생해도 앱이 중단되지 않도록 resolve 호출
|
call.resolve(errorResult); // 에러가 발생해도 앱이 중단되지 않도록 resolve 호출
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,6 @@
|
|||||||
{
|
{
|
||||||
"versionCode": 1,
|
"versionCode": 1,
|
||||||
"versionName": "1.0.1",
|
"versionName": "1.0.1",
|
||||||
"buildNumber": 2,
|
"buildNumber": 3,
|
||||||
"notes": "사용자가 수정한 버전 정보입니다. 이 파일을 편집하여 앱 버전 정보를 변경할 수 있습니다."
|
"notes": "사용자가 수정한 버전 정보입니다. 이 파일을 편집하여 앱 버전 정보를 변경할 수 있습니다."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
|
|
||||||
#Tue Mar 18 00:16:17 KST 2025
|
#Tue Mar 18 00:16:17 KST 2025
|
||||||
buildNumber=2
|
buildNumber=3
|
||||||
versionCode=1
|
versionCode=1
|
||||||
versionName=1.0.1
|
versionName=1.0.1
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
import React, { useCallback, useEffect, useState, useRef } from 'react';
|
import React, { useCallback, useEffect, useState, useRef } from 'react';
|
||||||
import { getAppVersionInfo, isAndroidPlatform } from '@/utils/platform';
|
import { getAppVersionInfo, isAndroidPlatform } from '@/utils/platform';
|
||||||
import { Label } from '@/components/ui/label';
|
import { Label } from '@/components/ui/label';
|
||||||
@@ -17,6 +18,8 @@ const AppVersionInfo: React.FC<AppVersionInfoProps> = ({
|
|||||||
versionName: string;
|
versionName: string;
|
||||||
buildNumber: number;
|
buildNumber: number;
|
||||||
versionCode?: number;
|
versionCode?: number;
|
||||||
|
platform?: string;
|
||||||
|
pluginResponse?: string;
|
||||||
}>({
|
}>({
|
||||||
versionName: '1.0.1',
|
versionName: '1.0.1',
|
||||||
buildNumber: 2
|
buildNumber: 2
|
||||||
@@ -44,10 +47,19 @@ const AppVersionInfo: React.FC<AppVersionInfoProps> = ({
|
|||||||
if (!info || typeof info !== 'object') {
|
if (!info || typeof info !== 'object') {
|
||||||
throw new Error('유효하지 않은 응답 형식');
|
throw new Error('유효하지 않은 응답 형식');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 유효한 빌드 번호인지 확인하고 숫자로 변환
|
||||||
|
let buildNumber = info.buildNumber;
|
||||||
|
if (typeof buildNumber === 'string') {
|
||||||
|
buildNumber = parseInt(buildNumber, 10);
|
||||||
|
}
|
||||||
|
|
||||||
setVersionInfo({
|
setVersionInfo({
|
||||||
versionName: info.versionName,
|
versionName: info.versionName || '1.0.1',
|
||||||
buildNumber: info.buildNumber,
|
buildNumber: isNaN(buildNumber) ? 2 : buildNumber,
|
||||||
versionCode: info.versionCode
|
versionCode: info.versionCode,
|
||||||
|
platform: info.platform,
|
||||||
|
pluginResponse: info.pluginResponse
|
||||||
});
|
});
|
||||||
|
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
@@ -70,12 +82,19 @@ const AppVersionInfo: React.FC<AppVersionInfoProps> = ({
|
|||||||
|
|
||||||
// 컴포넌트 마운트 시 즉시 실행 (IIFE)
|
// 컴포넌트 마운트 시 즉시 실행 (IIFE)
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
let isMounted = true;
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
// 즉시 버전 정보 가져오기 시도
|
// 즉시 버전 정보 가져오기 시도
|
||||||
await fetchVersionInfo();
|
await fetchVersionInfo();
|
||||||
|
|
||||||
|
// 컴포넌트가 언마운트되었는지 확인
|
||||||
|
if (!isMounted) return;
|
||||||
|
|
||||||
// 1000ms 후에 한번 더 시도 (네이티브 플러그인이 완전히 로드되지 않았을 경우 대비)
|
// 1000ms 후에 한번 더 시도 (네이티브 플러그인이 완전히 로드되지 않았을 경우 대비)
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
|
if (!isMounted) return;
|
||||||
|
|
||||||
if (error || loading) {
|
if (error || loading) {
|
||||||
fetchVersionInfo();
|
fetchVersionInfo();
|
||||||
initialLoadAttemptedRef.current = true;
|
initialLoadAttemptedRef.current = true;
|
||||||
@@ -84,13 +103,21 @@ const AppVersionInfo: React.FC<AppVersionInfoProps> = ({
|
|||||||
})();
|
})();
|
||||||
|
|
||||||
// 개발 모드에서는 버전 정보 변경을 쉽게 확인하기 위해 주기적 갱신
|
// 개발 모드에서는 버전 정보 변경을 쉽게 확인하기 위해 주기적 갱신
|
||||||
|
let interval: number | undefined;
|
||||||
if (process.env.NODE_ENV === 'development') {
|
if (process.env.NODE_ENV === 'development') {
|
||||||
const interval = setInterval(() => {
|
interval = window.setInterval(() => {
|
||||||
fetchVersionInfo();
|
if (isMounted) {
|
||||||
|
fetchVersionInfo();
|
||||||
|
}
|
||||||
}, 30000); // 30초마다 새로 가져오기
|
}, 30000); // 30초마다 새로 가져오기
|
||||||
|
|
||||||
return () => clearInterval(interval);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
isMounted = false;
|
||||||
|
if (interval) {
|
||||||
|
clearInterval(interval);
|
||||||
|
}
|
||||||
|
};
|
||||||
}, [fetchVersionInfo, error, loading]);
|
}, [fetchVersionInfo, error, loading]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -122,6 +149,11 @@ const AppVersionInfo: React.FC<AppVersionInfoProps> = ({
|
|||||||
versionCode: {versionInfo.versionCode}
|
versionCode: {versionInfo.versionCode}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
{showDevInfo && versionInfo.platform && (
|
||||||
|
<p className="text-xs text-gray-400 mt-1 font-mono">
|
||||||
|
플랫폼: {versionInfo.platform}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
{editable && (
|
{editable && (
|
||||||
<p className="text-gray-400 font-semibold text-sm mt-2">ZELLYY CLOUD</p>
|
<p className="text-gray-400 font-semibold text-sm mt-2">ZELLYY CLOUD</p>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -11,18 +11,41 @@ interface BuildInfoPlugin {
|
|||||||
versionName: string;
|
versionName: string;
|
||||||
versionCode: number;
|
versionCode: number;
|
||||||
buildNumber: number;
|
buildNumber: number;
|
||||||
|
platform?: string;
|
||||||
|
[key: string]: any; // 추가 속성 허용
|
||||||
}>;
|
}>;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 기본 플러그인 구현
|
// 기본 플러그인 구현
|
||||||
const BuildInfo: BuildInfoPlugin = {
|
const BuildInfo: BuildInfoPlugin = {
|
||||||
getBuildInfo: async () => {
|
getBuildInfo: async () => {
|
||||||
// 웹 환경에서는 기본값 반환
|
console.log('BuildInfo.getBuildInfo() 호출됨 (웹 플러그인)');
|
||||||
return {
|
|
||||||
versionName: '1.0.0',
|
try {
|
||||||
versionCode: 1,
|
// 웹 환경에서 앱 버전 정보를 가져오는 로직
|
||||||
buildNumber: 1
|
// 실제 네이티브 환경에서는 이 구현이 네이티브 코드로 대체됨
|
||||||
};
|
|
||||||
|
// android/version.properties 또는 ios의 Info.plist에서
|
||||||
|
// 설정된 값을 반환하는 네이티브 구현이 런타임에 이 함수를 대체함
|
||||||
|
|
||||||
|
// 개발 환경을 위한 기본값
|
||||||
|
return {
|
||||||
|
versionName: '1.0.1',
|
||||||
|
versionCode: 1,
|
||||||
|
buildNumber: 2,
|
||||||
|
platform: 'web',
|
||||||
|
isDefault: true
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
console.error('BuildInfo.getBuildInfo() 오류:', error);
|
||||||
|
// 오류 발생 시에도 앱 실행은 계속되도록 기본값 반환
|
||||||
|
return {
|
||||||
|
versionName: '1.0.0',
|
||||||
|
versionCode: 1,
|
||||||
|
buildNumber: 1,
|
||||||
|
error: true
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -38,30 +38,73 @@ export const isNativePlatform = (): boolean => {
|
|||||||
*/
|
*/
|
||||||
export const getAppVersionInfo = async () => {
|
export const getAppVersionInfo = async () => {
|
||||||
try {
|
try {
|
||||||
|
// 디버깅을 위한 플랫폼 체크 로그
|
||||||
|
console.log('현재 플랫폼:', Capacitor.getPlatform());
|
||||||
|
console.log('플러그인 가용성 확인:', Capacitor.isPluginAvailable('BuildInfo'));
|
||||||
|
|
||||||
// BuildInfoPlugin이 설치되어 있다면 사용
|
// BuildInfoPlugin이 설치되어 있다면 사용
|
||||||
if (Capacitor.isPluginAvailable('BuildInfo')) {
|
if (Capacitor.isPluginAvailable('BuildInfo')) {
|
||||||
// Capacitor.Plugins 대신에 직접 window 객체에서 접근
|
try {
|
||||||
// @ts-ignore - 플러그인이 런타임에 등록되므로 타입 체크를 무시
|
// 플러그인 호출 시도
|
||||||
const buildInfo = await Capacitor.Plugins?.BuildInfo?.getBuildInfo();
|
// @ts-ignore - 플러그인이 런타임에 등록되므로 타입 체크를 무시
|
||||||
|
const buildInfo = await Capacitor.Plugins.BuildInfo.getBuildInfo();
|
||||||
|
|
||||||
|
console.log('네이티브에서 받은 빌드 정보:', buildInfo);
|
||||||
|
|
||||||
|
// 받은 정보가 유효한지 확인
|
||||||
|
if (buildInfo && typeof buildInfo === 'object') {
|
||||||
|
// 값이 존재하는지 확인하고 파싱
|
||||||
|
return {
|
||||||
|
versionName: buildInfo.versionName || '1.0.1',
|
||||||
|
buildNumber: buildInfo.buildNumber ?
|
||||||
|
(typeof buildInfo.buildNumber === 'string' ?
|
||||||
|
parseInt(buildInfo.buildNumber, 10) : buildInfo.buildNumber) : 2,
|
||||||
|
versionCode: buildInfo.versionCode ?
|
||||||
|
(typeof buildInfo.versionCode === 'string' ?
|
||||||
|
parseInt(buildInfo.versionCode, 10) : buildInfo.versionCode) : undefined,
|
||||||
|
// 디버깅용 추가 정보
|
||||||
|
platform: Capacitor.getPlatform(),
|
||||||
|
pluginResponse: JSON.stringify(buildInfo)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} catch (pluginError) {
|
||||||
|
console.error('BuildInfo 플러그인 호출 오류:', pluginError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 안드로이드인 경우 기본값을 하드코딩된 값으로 설정
|
||||||
|
if (isAndroidPlatform()) {
|
||||||
|
// 안드로이드 앱 빌드 정보를 하드코딩된 값으로 제공
|
||||||
|
// 실제 앱에서는 빌드 과정에서 이 값들이 업데이트되어야 함
|
||||||
return {
|
return {
|
||||||
versionName: buildInfo?.versionName || '1.0.1',
|
versionName: '1.0.1',
|
||||||
buildNumber: buildInfo?.buildNumber ? parseInt(buildInfo.buildNumber, 10) : 2,
|
buildNumber: 2,
|
||||||
versionCode: buildInfo?.versionCode
|
versionCode: 1,
|
||||||
? parseInt(buildInfo.versionCode, 10)
|
platform: 'android'
|
||||||
: undefined
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// 플러그인이 없으면 기본값 반환
|
// iOS인 경우 기본값
|
||||||
|
if (isIOSPlatform()) {
|
||||||
|
return {
|
||||||
|
versionName: '1.0.1',
|
||||||
|
buildNumber: 2,
|
||||||
|
platform: 'ios'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// 플러그인이 없거나 웹 환경이면 기본값 반환
|
||||||
return {
|
return {
|
||||||
versionName: '1.0.1',
|
versionName: '1.0.1',
|
||||||
buildNumber: 2
|
buildNumber: 2,
|
||||||
|
platform: Capacitor.getPlatform()
|
||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('앱 버전 정보를 가져오는 중 오류 발생:', error);
|
console.error('앱 버전 정보를 가져오는 중 오류 발생:', error);
|
||||||
return {
|
return {
|
||||||
versionName: '1.0.1',
|
versionName: '1.0.1',
|
||||||
buildNumber: 2
|
buildNumber: 2,
|
||||||
|
error: true
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user