From d9435bbee559819c7babaf4b936d1481770ac7f8 Mon Sep 17 00:00:00 2001 From: JiWoong Sul Date: Mon, 17 Nov 2025 19:28:33 +0900 Subject: [PATCH] =?UTF-8?q?=EC=95=B1=20=ED=82=A4=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EB=B0=8F=20=EB=B2=84=EC=A0=84=EC=97=85=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle.kts | 27 +++++- .../Personal information.txt | 83 ++++++++++++++++++ doc/key/readme.md | 13 +++ doc/key/submanager-release.keystore | Bin 0 -> 2752 bytes pubspec.yaml | 2 +- 5 files changed, 121 insertions(+), 4 deletions(-) create mode 100644 doc/PersonalInformation/Personal information.txt create mode 100644 doc/key/readme.md create mode 100644 doc/key/submanager-release.keystore diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index c7a1458..f1c0b60 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -1,3 +1,6 @@ +import java.util.Properties +import java.io.FileInputStream + plugins { id("com.android.application") id("kotlin-android") @@ -5,6 +8,13 @@ plugins { id("dev.flutter.flutter-gradle-plugin") } +val keystorePropertiesFile = rootProject.file("key.properties") +val keystoreProperties = Properties().apply { + if (keystorePropertiesFile.exists()) { + load(FileInputStream(keystorePropertiesFile)) + } +} + android { namespace = "com.naturebridgeai.digitalrentmanager" compileSdk = flutter.compileSdkVersion @@ -31,11 +41,22 @@ android { versionName = flutter.versionName } + signingConfigs { + if (keystoreProperties.isNotEmpty()) { + create("release") { + storeFile = file(keystoreProperties["storeFile"] as String) + storePassword = keystoreProperties["storePassword"] as String + keyAlias = keystoreProperties["keyAlias"] as String + keyPassword = keystoreProperties["keyPassword"] as String + } + } + } + buildTypes { release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.getByName("debug") + if (signingConfigs.findByName("release") != null) { + signingConfig = signingConfigs.getByName("release") + } } } } diff --git a/doc/PersonalInformation/Personal information.txt b/doc/PersonalInformation/Personal information.txt new file mode 100644 index 0000000..adb57d6 --- /dev/null +++ b/doc/PersonalInformation/Personal information.txt @@ -0,0 +1,83 @@ +아하, 그런 구조라면 “로컬 저장 + 광고 SDK만 있음” 패턴으로 쓰면 되겠네요. +--- + 디지털 월세 관리자 개인정보 처리방 + +디지털 월세 관리자(이하 “앱”)는 사용자의 개인정보 보호를 최우선으로 합니다. +이 앱은 사용자의 데이터를 외부 서버로 전송하지 않으며, 모든 사용 데이터는 사용자의 기기 내에만 저장됩니다. +본 개인정보 처리방침은 앱이 어떤 정보를 어떻게 처리하는지 설명합니다. + +--- + + 1. 수집하는 개인정보 + +이 앱은 다음과 같은 의미에서 사용자를 식별할 수 있는 개인정보(이름, 이메일, 전화번호 등)를 직접 수집하지 않습니다 + +* 회원가입, 로그인 기능이 없습니다. +* 이메일, 전화번호, 주소 등의 정보를 요구하지 않습니다. +* 개발자가 운영하는 서버로 어떠한 사용자 정보도 전송하지 않습니다. + +다만, 사용자가 앱 내에서 입력한 구독·월세·지출 관련 정보는 오직 사용자의 기기 내에만 저 되며, 개발자는 해당 내용에 접근할 수 없습니다. + +--- + + 2. 데이터 저장 및 처리 방식 + +* 사용자가 입력한 모든 데이터는 로컬 저장소(기기 내 저장소, 데이터베이스 등 에만 보관됩니다. +* 앱은 사용자의 데이터를 클라우드 서버나 외부 서비스로 자동 전송하지 않습니다. +* 앱을 삭제하면, 기기에 저장된 데이터도 함께 삭제됩니다. + +--- + + 3. 광고 및 제3자 서비스 + +이 앱은 무료 제공을 위해 광고를 표 할 수 있으며, 이 과정에서 제3자 광고 네트워크(예: Google AdMob 등 가 참여할 수 있습니다. + +개발자는 직접 사용자의 개인정보를 수집하지 않지만, 광고 네트워크는 다음과 같은 정 를 수집·처리할 수 있습니다. + +* 광고 식별자(예: Android 광고 ID) +* 기기 정보(단말기 모델, OS 버전 등) +* 대략적인 위치 정보(국가/지역 수준) +* 앱 사용 정보(광고 조회/클릭 여부 등) + +제3자 광고 파트너의 데이터 처리 방식과 수집 항목은 각 서비스의 개인정보 처리방침을 따릅니다. +자세한 내용은 사용 중인 광고 네트워크(예: Google AdMob)의 정책을 참고하시기 바랍니다. + +--- + + 4. 권한 사용 + +앱은 기능 제공을 위해 다음과 같은 권한을 사용할 수 있습니다. + + +* 알림 권한: 결제 예정 알림 등 앱 내 알림 기능 제공을 위해 사용 +* SMS 읽기 권한: SMS를 읽어서 구독정보를 찾기 위해 사용 +* 네트워크 권한: 광고 로딩 및 앱 업데이트를 위해 사용 + +이 권한들은 앱 기능 및 광고 표시를 위한 용도 외에는 사용되지 않습니다 + +--- + + 5. 아동의 개인정보 + +이 앱은 성인을 주요 대상으로 설계되었으며, 만 14세 미만(또는 각 국가의 관련 기준 미만)의 아동을 대상으로 개인정보를 수집하려는 의도가 없습니다 +만약 아동의 개인정보가 부주의로 수집된 사실을 인지하게 될 경우, 가능한 한 신속히 해당 정보를 삭제하기 위한 조치를 취하겠습니다. + +--- + + 6. 개인정보 처리방침의 변경 + +본 개인정보 처리방침은 서비스 개선이나 관련 법령 변경 등에 따라 수정될 수 있습니다. +중요한 내용이 변경되는 경우, 앱 내 공지 또는 스토어 설명 등을 통해 변경 내용을 안내하겠습니다. + +* 시행일자: 2025.11.17 + +--- + + 7. 문의처 + +앱의 개인정보 처리방침에 대한 문의, 의견 또는 오류 신고가 필요하신 경우 아래 연락처로 문의해 주세요. + +* 담당자: 네이처브릿지AI 앱개발팀 +* 이메일: naturebridgeai@gmail.com + +--- \ No newline at end of file diff --git a/doc/key/readme.md b/doc/key/readme.md new file mode 100644 index 0000000..6d3f224 --- /dev/null +++ b/doc/key/readme.md @@ -0,0 +1,13 @@ +doc/key/submanager-release.keystore를 생성했습니다. 명령에 사용된 정보: alias submanager, 키 알고리즘 RSA 2048bit, 유효기간 10,000일, 인증서 DN CN=SubManager, OU=Engineering, O=SubManager, L=Seoul, ST=Seoul, C=KR입니다. 저장/키 비밀번호는 모두 submanager로 설정했습니다. + +이 키스토어를 android/key.properties 등에서 참조하도록 설정하면 release 빌드를 실제 서명 키로 빌드할 수 있습니다. (예: storeFile=../doc/key/submanager-release.keystore, storePassword=submanager, keyAlias=submanager, keyPassword=submanager). + +이후 buildTypes.release에서 signingConfig = signingConfigs.getByName("release")로 연결하면 됩니다. + +android/key.properties을 새로 만들어 storeFile=../../doc/key/submanager-release.keystore 등 키 정보를 등록했습니다. (storePassword, keyPassword, keyAlias 모두 submanager로 설정) + +android/app/build.gradle.kts (lines 1-52)에 Properties/FileInputStream을 import하고 keystoreProperties 로드 후 signingConfigs.release를 추가했습니다. 이제 buildTypes.release가 디버그 키 대신 새 릴리스 키로 서명합니다. + +doc/key/submanager-release.keystore가 키스토어 위치이며, flutter build apk --release로 서명된 릴리스 APK(build/app/outputs/flutter-apk/app-release.apk)가 정상 생성되는 것을 확인했습니다. + +다음 단계로는 이 keystore와 key.properties를 안전한 곳에 보관하고, 필요 시 .gitignore 등으로 민감 파일이 VCS에 노출되지 않도록 관리하는 것을 권장합니다. \ No newline at end of file diff --git a/doc/key/submanager-release.keystore b/doc/key/submanager-release.keystore new file mode 100644 index 0000000000000000000000000000000000000000..11d74030d7f1f26f071cf1fe7c9e2a23d1908127 GIT binary patch literal 2752 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 literal 0 HcmV?d00001 diff --git a/pubspec.yaml b/pubspec.yaml index aa00680..0b2711c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: submanager description: A new Flutter project. publish_to: 'none' -version: 1.0.0+1 +version: 1.0.1+2 environment: sdk: '>=3.0.0 <4.0.0'