From e552e22de90ddf7402d3d1373c1686b947169d75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E6=B1=80=E5=B2=9A?= Date: Tue, 10 Feb 2026 16:16:02 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20App=20=E5=90=8D=E7=A8=B1=20Hey=20Mama?= =?UTF-8?q?=20=E2=86=92=20Dear=20Mama=20+=20=E7=9B=B8=E9=97=9C=E4=BF=AE?= =?UTF-8?q?=E5=BE=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 品牌與顯示:app.json、Info.plist、package scheme、iOS 產物 DearMama.app - 協議與條款:隱私協議/使用條款全文、設計文檔、server legal_docs + legal API、push 預設 title - 多語言:all.json / zh-TW / zh-CN / en / es / pt 的 consent、widget 標題與引導文案 - 小工具:EmotionWidget.swift 品牌文案、Dear Mama.xcscheme - CocoaPods:project.pbxproj objectVersion 70→56 以通過 pod install - Metro:react-native-text-size 用 require + extraNodeModules 解析 - textWrap:measureWidthImpl 改為 require 載入 react-native-text-size Co-authored-by: Cursor --- client/app.json | 2 +- client/ios/Podfile.lock | 166 +++++++++--------- client/ios/client.xcodeproj/project.pbxproj | 35 ++-- .../{Hey Mama.xcscheme => Dear Mama.xcscheme} | 10 +- client/ios/client/Info.plist | 2 +- client/ios/scripts/fix-xcarchive-header.sh | 2 +- client/ios/情绪小组件/EmotionWidget.swift | 4 +- client/metro.config.js | 5 + client/package-lock.json | 1 + client/package.json | 4 +- .../textWrap/measure/measureWidthImpl.ts | 11 +- client/src/i18n/locales/all.json | 14 +- client/src/i18n/locales/en.json | 4 +- client/src/i18n/locales/es.json | 4 +- client/src/i18n/locales/pt.json | 4 +- client/src/i18n/locales/zh-CN.json | 4 +- client/src/i18n/locales/zh-TW.json | 6 +- server/app/api/v1/legal.py | 4 +- server/app/api/v1/push.py | 2 +- server/app/legal_docs.py | 42 ++--- spec_kit/overview.md | 4 +- 设计说明文档/用户使用协议.md | 16 +- 设计说明文档/隐私协议.md | 26 +-- 23 files changed, 195 insertions(+), 177 deletions(-) rename client/ios/client.xcodeproj/xcshareddata/xcschemes/{Hey Mama.xcscheme => Dear Mama.xcscheme} (94%) diff --git a/client/app.json b/client/app.json index f386662..c39bae6 100644 --- a/client/app.json +++ b/client/app.json @@ -1,6 +1,6 @@ { "expo": { - "name": "Hey Mama", + "name": "Dear Mama", "slug": "client", "version": "1.0.0", "orientation": "portrait", diff --git a/client/ios/Podfile.lock b/client/ios/Podfile.lock index cc8c4c5..92b7591 100644 --- a/client/ios/Podfile.lock +++ b/client/ios/Podfile.lock @@ -2540,30 +2540,30 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: - EXApplication: 13420f8139864183f8a04fd6099077bdf8cfb186 - EXConstants: 3feb66fd1d94202fc1f0946d74e029d8b224b60e + EXApplication: 1e98d4b1dccdf30627f92917f4b2c5a53c330e5f + EXConstants: fce59a631a06c4151602843667f7cfe35f81e271 EXJSONUtils: 1d3e4590438c3ee593684186007028a14b3686cd - EXManifests: 83ef0844fcf06d6099b12a7bdbd7d36fc0e1dd16 - EXNotifications: 2a3feb7af6194828d9aafda72f63a9a03866230a - Expo: b8d64eb9a496ebe8c71e3dae7eeb7f394b146b80 - expo-dev-client: 12ef7d5b14d93e309922acea78dcd851db583a87 - expo-dev-launcher: 47994056008ffdc30a6a5e328a375b3e30a8db05 - expo-dev-menu: ea4fb803ace52e60d7cd8060c7cd379612a140b2 + EXManifests: a8d97683e5c7a3b026ffbd58559c64dc655b747b + EXNotifications: 9eec98712cc814ceff916d876cb53859003b0597 + Expo: 4e503a041c59c4e34c8be262a135848ad5cd3710 + expo-dev-client: 425ee077d6754a98cfe3a2e2410d29b440b24c9d + expo-dev-launcher: a4f4cdef064ab1fb8621e5b8c7c457cd6e9568c3 + expo-dev-menu: 05b18812110c175814c6af0d09dd658abcc5e00d expo-dev-menu-interface: 600df12ea01efecdd822daaf13cc0ac091775533 - ExpoAsset: d999f3bbd998a750f3b74cb913229848901b926b - ExpoCrypto: 4d23a9ff67c25e2ed23ca792d81e58817a7ea1b9 - ExpoDevice: 0773c782b055558ca9b40b74aa4a8133a66cd0d2 - ExpoFileSystem: aefcd337b94b874f88752ebefc52813b84992fad - ExpoFont: c625dbd97ed57e9089b172b2a7bb99003d074664 - ExpoHead: b691a2ed7ab02ed820b6c6468941832d34969c29 - ExpoKeepAwake: 44bf6715bc1d2ddb17afe19d927cd039cda123f0 - ExpoLinearGradient: 814a21fc4056c3cf606e4f19e31e47074c5b5a86 - ExpoLinking: ebf543fd411d56375cb4eee07f6ab4e31c7ad959 - ExpoLocalization: 6ac6f326210f0a3141ef6f58ab8f8f4ed003b485 - ExpoModulesCore: 77496909fd3c800f97f7f2007dd26aeac4bb3798 - ExpoSplashScreen: 72fbc6dd9d6404dd9d0725a56c9ac1383bc0b14f - ExpoWebBrowser: 88b116cd378d9609c776c0903fe4070fca461588 - EXUpdatesInterface: 1436757deb0d574b84bba063bd024c315e0ec08b + ExpoAsset: f867e55ceb428aab99e1e8c082b5aee7c159ea18 + ExpoCrypto: b6105ebaa15d6b38a811e71e43b52cd934945322 + ExpoDevice: 6327c3c200816795708885adf540d26ecab83d1a + ExpoFileSystem: 858a44267a3e6e9057e0888ad7c7cfbf55d52063 + ExpoFont: f543ce20a228dd702813668b1a07b46f51878d47 + ExpoHead: 4425246bc93411f0fe7f6945f95f698e91db8780 + ExpoKeepAwake: 55f75eca6499bb9e4231ebad6f3e9cb8f99c0296 + ExpoLinearGradient: 809102bdb979f590083af49f7fa4805cd931bd58 + ExpoLinking: 8f0aaf69aa56f832913030503b6263dc6f647f37 + ExpoLocalization: d9168d5300a5b03e5e78b986124d11fb6ec3ebbd + ExpoModulesCore: f3da4f1ab5a8375d0beafab763739dbee8446583 + ExpoSplashScreen: bc3cffefca2716e5f22350ca109badd7e50ec14d + ExpoWebBrowser: 17b064c621789e41d4816c95c93f429b84971f52 + EXUpdatesInterface: 5adf50cb41e079c861da6d9b4b954c3db9a50734 FBLazyVector: e95a291ad2dadb88e42b06e0c5fb8262de53ec12 hermes-engine: 9f4dfe93326146a1c99eb535b1cb0b857a3cd172 RCTDeprecation: 943572d4be82d480a48f4884f670135ae30bf990 @@ -2571,72 +2571,72 @@ SPEC CHECKSUMS: RCTTypeSafety: 16a4144ca3f959583ab019b57d5633df10b5e97c React: 914f8695f9bf38e6418228c2ffb70021e559f92f React-callinvoker: 1c0808402aee0c6d4a0d8e7220ce6547af9fba71 - React-Core: 4ae98f9e8135b8ddbd7c98730afb6fdae883db90 - React-Core-prebuilt: 8f4cca589c14e8cf8fc6db4587ef1c2056b5c151 - React-CoreModules: e878a90bb19b8f3851818af997dbae3b3b0a27ac - React-cxxreact: 28af9844f6dc87be1385ab521fbfb3746f19563c + React-Core: c61410ef0ca6055e204a963992e363227e0fd1c5 + React-Core-prebuilt: 02f0ad625ddd47463c009c2d0c5dd35c0d982599 + React-CoreModules: 1f6d1744b5f9f2ec684a4bb5ced25370f87e5382 + React-cxxreact: 3af79478e8187b63ffc22b794cd42d3fc1f1f2da React-debug: 6328c2228e268846161f10082e80dc69eac2e90a - React-defaultsnativemodule: afc9d809ec75780f39464a6949c07987fbea488c - React-domnativemodule: 91a233260411d41f27f67aa1358b7f9f0bfd101d - React-Fabric: 21f349b5e93f305a3c38c885902683a9c79cf983 - React-FabricComponents: 47ac634cc9ecc64b30a9997192f510eebe4177e4 - React-FabricImage: 21873acd6d4a51a0b97c133141051c7acb11cc86 - React-featureflags: 653f469f0c3c9dc271d610373e3b6e66a9fd847d - React-featureflagsnativemodule: c91a8a3880e0f4838286402241ead47db43aed28 - React-graphics: b4bdb0f635b8048c652a5d2b73eb8b1ddd950f24 - React-hermes: fcfad3b917400f49026f3232561e039c9d1c34bf - React-idlecallbacksnativemodule: 8cb83207e39f8179ac1d344b6177c6ab3ccebcdc - React-ImageManager: 396128004783fc510e629124dce682d38d1088e7 - React-jserrorhandler: b58b788d788cdbf8bda7db74a88ebfcffc8a0795 - React-jsi: d2c3f8555175371c02da6dfe7ed1b64b55a9d6c0 - React-jsiexecutor: ba537434eb45ee018b590ed7d29ee233fddb8669 - React-jsinspector: f21b6654baf96cb9f71748844a32468a5f73ad51 - React-jsinspectorcdp: 3f8be4830694c3c1c39442e50f8db877966d43f0 - React-jsinspectornetwork: 70e41469565712ad60e11d9c8b8f999b9f7f61eb - React-jsinspectortracing: eccf9bfa4ec7f130d514f215cfb2222dc3c0e270 - React-jsitooling: b376a695f5a507627f7934748533b24eed1751ca - React-jsitracing: 5c8c3273dda2d95191cc0612fb5e71c4d9018d2a - React-logger: c3e2f8a2e284341205f61eef3d4677ab5a309dfd - React-Mapbuffer: 603c18db65844bb81dbe62fee8fcc976eaeb7108 - React-microtasksnativemodule: d77e0c426fce34c23227394c96ca1033b30c813c - react-native-safe-area-context: 53f796cb6c814661bbe99fbdfd0585d07b996cdd - React-NativeModulesApple: 1664340b8750d64e0ef3907c5e53d9481f74bcbd + React-defaultsnativemodule: d635ef36d755321e5d6fc065bd166b2c5a0e9833 + React-domnativemodule: dd28f6d96cd21236e020be2eff6fe0b7d4ec3b66 + React-Fabric: 2e32c3fdbb1fbcf5fde54607e3abe453c6652ce2 + React-FabricComponents: 5ed0cdb81f6b91656cb4d3be432feaa28a58071a + React-FabricImage: 2bc714f818cb24e454f5d3961864373271b2faf8 + React-featureflags: 847642f41fa71ad4eec5e0351badebcad4fe6171 + React-featureflagsnativemodule: c868a544b2c626fa337bcbd364b1befe749f0d3f + React-graphics: 192ec701def5b3f2a07db2814dfba5a44986cff6 + React-hermes: e875778b496c86d07ab2ccaa36a9505d248a254b + React-idlecallbacksnativemodule: 4d57965cdf82c14ee3b337189836cd8491632b76 + React-ImageManager: bd0b99e370b13de82c9cd15f0f08144ff3de079e + React-jserrorhandler: a2fdef4cbcfdcdf3fa9f5d1f7190f7fd4535248d + React-jsi: 89d43d1e7d4d0663f8ba67e0b39eb4e4672c27de + React-jsiexecutor: abe4874aaab90dfee5dec480680220b2f8af07e3 + React-jsinspector: a0b3e051aef842b0b2be2353790ae2b2a5a65a8f + React-jsinspectorcdp: 6346013b2247c6263fbf5199adf4a8751e53bd89 + React-jsinspectornetwork: 26281aa50d49fc1ec93abf981d934698fa95714f + React-jsinspectortracing: 55eedf6d57540507570259a778663b90060bbd6e + React-jsitooling: 0e001113fa56d8498aa8ac28437ac0d36348e51a + React-jsitracing: b713793eb8a5bbc4d86a84e9d9e5023c0f58cbaf + React-logger: 50fdb9a8236da90c0b1072da5c32ee03aeb5bf28 + React-Mapbuffer: 9050ee10c19f4f7fca8963d0211b2854d624973e + React-microtasksnativemodule: f775db9e991c6f3b8ccbc02bfcde22770f96e23b + react-native-safe-area-context: 37e680fc4cace3c0030ee46e8987d24f5d3bdab2 + React-NativeModulesApple: 8969913947d5b576de4ed371a939455a8daf28aa React-oscompat: ce47230ed20185e91de62d8c6d139ae61763d09c - React-perflogger: b1af3cfb3f095f819b2814910000392a8e17ba9f - React-performancetimeline: f9ec65b77bcadbc7bd8b47a6f4b4b697da7b1490 + React-perflogger: 02b010e665772c7dcb859d85d44c1bfc5ac7c0e4 + React-performancetimeline: 130db956b5a83aa4fb41ddf5ae68da89f3fb1526 React-RCTActionSheet: 0b14875b3963e9124a5a29a45bd1b22df8803916 - React-RCTAnimation: 60f6eca214a62b9673f64db6df3830cee902b5af - React-RCTAppDelegate: 37734b39bac108af30a0fd9d3e1149ec68b82c28 - React-RCTBlob: 83fbcbd57755caf021787324aac2fe9b028cc264 - React-RCTFabric: a05cb1df484008db3753c8b4a71e4c6d9f1e43a6 - React-RCTFBReactNativeSpec: d58d7ae9447020bbbac651e3b0674422aba18266 - React-RCTImage: 47aba3be7c6c64f956b7918ab933769602406aac - React-RCTLinking: 2dbaa4df2e4523f68baa07936bd8efdfa34d5f31 - React-RCTNetwork: 1fca7455f9dedf7de2b95bec438da06680f3b000 - React-RCTRuntime: 17819dd1dfc8613efaf4cbb9d8686baae4a83e5b - React-RCTSettings: 01bf91c856862354d3d2f642ccb82f3697a4284a - React-RCTText: cb576a3797dcb64933613c522296a07eaafc0461 - React-RCTVibration: 560af8c086741f3525b8456a482cdbe27f9d098e + React-RCTAnimation: a7b90fd2af7bb9c084428867445a1481a8cb112e + React-RCTAppDelegate: 3262bedd01263f140ec62b7989f4355f57cec016 + React-RCTBlob: c17531368702f1ebed5d0ada75a7cf5915072a53 + React-RCTFabric: 6409edd8cfdc3133b6cc75636d3b858fdb1d11ea + React-RCTFBReactNativeSpec: c004b27b4fa3bd85878ad2cf53de3bbec85da797 + React-RCTImage: c68078a120d0123f4f07a5ac77bea3bb10242f32 + React-RCTLinking: cf8f9391fe7fe471f96da3a5f0435235eca18c5b + React-RCTNetwork: ca31f7c879355760c2d9832a06ee35f517938a20 + React-RCTRuntime: a6cf4a1e42754fc87f493e538f2ac6b820e45418 + React-RCTSettings: e0e140b2ff4bf86d34e9637f6316848fc00be035 + React-RCTText: 75915bace6f7877c03a840cc7b6c622fb62bfa6b + React-RCTVibration: 25f26b85e5e432bb3c256f8b384f9269e9529f25 React-rendererconsistency: 2dac03f448ff337235fd5820b10f81633328870d - React-renderercss: c5c6b7a15948dd28facca39a18ac269073718490 - React-rendererdebug: 3c9d5e1634273f5a24d84cc5669f290ce0bdc812 - React-RuntimeApple: 887637d1e12ea8262df7d32bc100467df2302613 - React-RuntimeCore: 91f779835dc4f8f84777fe5dd24f1a22f96454e4 - React-runtimeexecutor: 8bb6b738f37b0ada4a6269e6f8ab1133dea0285c - React-RuntimeHermes: 4cb93de9fa8b1cc753d200dbe61a01b9ec5f5562 - React-runtimescheduler: 83dc28f530bfbd2fce84ed13aa7feebdc24e5af7 - React-timing: 03c7217455d2bff459b27a3811be25796b600f47 - React-utils: 6d46795ae0444ec8a5d9a5f201157b286bf5250a - ReactAppDependencyProvider: c277c5b231881ad4f00cd59e3aa0671b99d7ebee - ReactCodegen: 4c44b74b77fc41ae25b9e2c7e9bd6e2bc772c23f - ReactCommon: e6e232202a447d353e5531f2be82f50f47cbaa9a + React-renderercss: 477da167bb96b5ac86d30c5d295412fb853f5453 + React-rendererdebug: 2a1798c6f3ef5f22d466df24c33653edbabb5b89 + React-RuntimeApple: 28cf4d8eb18432f6a21abbed7d801ab7f6b6f0b4 + React-RuntimeCore: 41bf0fd56a00de5660f222415af49879fa49c4f0 + React-runtimeexecutor: 1afb774dde3011348e8334be69d2f57a359ea43e + React-RuntimeHermes: f3b158ea40e8212b1a723a68b4315e7a495c5fc6 + React-runtimescheduler: 3e1e2bec7300bae512533107d8e54c6e5c63fe0f + React-timing: 6fa9883de2e41791e5dc4ec404e5e37f3f50e801 + React-utils: 6e2035b53d087927768649a11a26c4e092448e34 + ReactAppDependencyProvider: 1bcd3527ac0390a1c898c114f81ff954be35ed79 + ReactCodegen: 7d4593f7591f002d137fe40cef3f6c11f13c88cc + ReactCommon: 08810150b1206cc44aecf5f6ae19af32f29151a8 ReactNativeDependencies: 71ce9c28beb282aa720ea7b46980fff9669f428a - RNCAsyncStorage: e85a99325df9eb0191a6ee2b2a842644c7eb29f4 - RNGestureHandler: 40c2d1c168e54715fe52e0fb16cb38c54611e4f3 - RNReanimated: 43f611f1c85c90e0273df7399bf1536f8e2bd125 - RNScreens: dd61bc3a3e6f6901ad833efa411917d44827cf51 - RNSVG: 2825ee146e0f6a16221e852299943e4cceef4528 - RNWorklets: 28ee7370ca8da356fcc914e3e68b97e9752196d2 + RNCAsyncStorage: 3a4f5e2777dae1688b781a487923a08569e27fe4 + RNGestureHandler: e0d0bce5599f6120b7adf90c38d2805e2935795f + RNReanimated: e5c702a3e24cc1c68b2de67671713f35461678f4 + RNScreens: d8d6f1792f6e7ac12b0190d33d8d390efc0c1845 + RNSVG: 31d6639663c249b7d5abc9728dde2041eb2a3c34 + RNWorklets: 76fce72926e28e304afb44f0da23b2d24f2c1fa0 Yoga: 5934998fbeaef7845dbf698f698518695ab4cd1a PODFILE CHECKSUM: c2c3838f0b2a579fef2350bff2ecaa005e27145d diff --git a/client/ios/client.xcodeproj/project.pbxproj b/client/ios/client.xcodeproj/project.pbxproj index 561a3bb..11260de 100644 --- a/client/ios/client.xcodeproj/project.pbxproj +++ b/client/ios/client.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 70; + objectVersion = 56; objects = { /* Begin PBXBuildFile section */ @@ -11,7 +11,7 @@ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 1A1DE01D4133812B2E2BA692 /* libPods-client.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E3328F0E595C1F4A244DF238 /* libPods-client.a */; }; 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; }; - A1B2C3D4E5F60718293A4B5C /* 情绪小组件/EmotionWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C3D4E5F60718293A4B5B /* 情绪小组件/EmotionWidget.swift */; }; + A1B2C3D4E5F60718293A4B5C /* EmotionWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C3D4E5F60718293A4B5B /* EmotionWidget.swift */; }; A8C1D2E3F4A5B6C7D8E9F0A2 /* AppGroupStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8C1D2E3F4A5B6C7D8E9F0A1 /* AppGroupStorage.swift */; }; A8C1D2E3F4A5B6C7D8E9F0A3 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EB3DAF802F2A4B8D00450593 /* WidgetKit.framework */; }; A8C1D2E3F4A5B6C7D8E9F0B2 /* AppGroupStorageBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = A8C1D2E3F4A5B6C7D8E9F0B1 /* AppGroupStorageBridge.m */; }; @@ -49,12 +49,12 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 13B07F961A680F5B00A75B9A /* HeyMama.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HeyMama.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07F961A680F5B00A75B9A /* DearMama.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DearMama.app; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = client/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = client/Info.plist; sourceTree = ""; }; 3C76CA16D0801CBF0D731C7C /* Pods-client.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-client.release.xcconfig"; path = "Target Support Files/Pods-client/Pods-client.release.xcconfig"; sourceTree = ""; }; 75F52ADE07CAE9D9736D7671 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = client/PrivacyInfo.xcprivacy; sourceTree = ""; }; - A1B2C3D4E5F60718293A4B5B /* 情绪小组件/EmotionWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "情绪小组件/EmotionWidget.swift"; sourceTree = ""; }; + A1B2C3D4E5F60718293A4B5B /* EmotionWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "情绪小组件/EmotionWidget.swift"; sourceTree = ""; }; A8C1D2E3F4A5B6C7D8E9F0A1 /* AppGroupStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppGroupStorage.swift; path = client/AppGroupStorage.swift; sourceTree = ""; }; A8C1D2E3F4A5B6C7D8E9F0B1 /* AppGroupStorageBridge.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppGroupStorageBridge.m; path = client/AppGroupStorageBridge.m; sourceTree = ""; }; AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = client/SplashScreen.storyboard; sourceTree = ""; }; @@ -74,7 +74,7 @@ /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ - EB3DAF952F2A4B8F00450593 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { + EB3DAF952F2A4B8F00450593 /* Exceptions for "情绪小组件" folder in "情绪小组件Extension" target */ = { isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( EmotionWidget.swift, @@ -85,7 +85,18 @@ /* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ /* Begin PBXFileSystemSynchronizedRootGroup section */ - EB3DAF842F2A4B8E00450593 /* 情绪小组件 */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (EB3DAF952F2A4B8F00450593 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = "情绪小组件"; sourceTree = ""; }; + EB3DAF842F2A4B8E00450593 /* 情绪小组件 */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + EB3DAF952F2A4B8F00450593 /* Exceptions for "情绪小组件" folder in "情绪小组件Extension" target */, + ); + explicitFileTypes = { + }; + explicitFolders = ( + ); + path = "情绪小组件"; + sourceTree = ""; + }; /* End PBXFileSystemSynchronizedRootGroup section */ /* Begin PBXFrameworksBuildPhase section */ @@ -175,7 +186,7 @@ 83CBBA001A601CBA00E9B192 /* Products */ = { isa = PBXGroup; children = ( - 13B07F961A680F5B00A75B9A /* HeyMama.app */, + 13B07F961A680F5B00A75B9A /* DearMama.app */, EB3DAF7F2F2A4B8D00450593 /* 情绪小组件Extension.appex */, ); name = Products; @@ -202,7 +213,7 @@ EB3DAFD42F2A5FC100450593 /* Recovered References */ = { isa = PBXGroup; children = ( - A1B2C3D4E5F60718293A4B5B /* 情绪小组件/EmotionWidget.swift */, + A1B2C3D4E5F60718293A4B5B /* EmotionWidget.swift */, ); name = "Recovered References"; sourceTree = ""; @@ -239,7 +250,7 @@ ); name = client; productName = client; - productReference = 13B07F961A680F5B00A75B9A /* HeyMama.app */; + productReference = 13B07F961A680F5B00A75B9A /* DearMama.app */; productType = "com.apple.product-type.application"; }; EB3DAF7E2F2A4B8D00450593 /* 情绪小组件Extension */ = { @@ -471,7 +482,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - A1B2C3D4E5F60718293A4B5C /* 情绪小组件/EmotionWidget.swift in Sources */, + A1B2C3D4E5F60718293A4B5C /* EmotionWidget.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -516,7 +527,7 @@ ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; PRODUCT_BUNDLE_IDENTIFIER = com.damer.mindfulness; - PRODUCT_NAME = HeyMama; + PRODUCT_NAME = DearMama; SKIP_INSTALL = NO; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; @@ -557,7 +568,7 @@ ); OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.damer.mindfulness; - PRODUCT_NAME = HeyMama; + PRODUCT_NAME = DearMama; SKIP_INSTALL = NO; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; diff --git a/client/ios/client.xcodeproj/xcshareddata/xcschemes/Hey Mama.xcscheme b/client/ios/client.xcodeproj/xcshareddata/xcschemes/Dear Mama.xcscheme similarity index 94% rename from client/ios/client.xcodeproj/xcshareddata/xcschemes/Hey Mama.xcscheme rename to client/ios/client.xcodeproj/xcshareddata/xcschemes/Dear Mama.xcscheme index 758ac77..f45b064 100644 --- a/client/ios/client.xcodeproj/xcshareddata/xcschemes/Hey Mama.xcscheme +++ b/client/ios/client.xcodeproj/xcshareddata/xcschemes/Dear Mama.xcscheme @@ -15,7 +15,7 @@ @@ -44,7 +44,7 @@ @@ -61,7 +61,7 @@ @@ -72,7 +72,7 @@ diff --git a/client/ios/client/Info.plist b/client/ios/client/Info.plist index 3716cc4..da47e68 100644 --- a/client/ios/client/Info.plist +++ b/client/ios/client/Info.plist @@ -7,7 +7,7 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Hey Mama + Dear Mama CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/client/ios/scripts/fix-xcarchive-header.sh b/client/ios/scripts/fix-xcarchive-header.sh index bcf53dd..65e096f 100755 --- a/client/ios/scripts/fix-xcarchive-header.sh +++ b/client/ios/scripts/fix-xcarchive-header.sh @@ -42,7 +42,7 @@ if [[ -z "$APP_PLIST" ]]; then fi APP_DIR="$(/usr/bin/dirname "$APP_PLIST")" -APP_NAME="$(/usr/bin/basename "$APP_DIR")" # 例如 HeyMama.app +APP_NAME="$(/usr/bin/basename "$APP_DIR")" # 例如 DearMama.app APP_REL_PATH="Applications/$APP_NAME" bundle_id="$(/usr/bin/plutil -extract CFBundleIdentifier raw -o - "$APP_PLIST" 2>/dev/null || true)" diff --git a/client/ios/情绪小组件/EmotionWidget.swift b/client/ios/情绪小组件/EmotionWidget.swift index 2d7cae7..a03fde9 100644 --- a/client/ios/情绪小组件/EmotionWidget.swift +++ b/client/ios/情绪小组件/EmotionWidget.swift @@ -41,8 +41,8 @@ private func resolveLang() -> String { } private func resolveTitle(lang: String) -> String { - // 需求:品牌文案「正念」统一改为 Hey Mama - return "Hey Mama" + // 需求:品牌文案统一为 Dear Mama + return "Dear Mama" } private func resolveFooterHint(lang: String) -> String { diff --git a/client/metro.config.js b/client/metro.config.js index 0e691ea..11e1e89 100644 --- a/client/metro.config.js +++ b/client/metro.config.js @@ -1,5 +1,6 @@ // Metro 配置:支持 import 本地 .svg 为 React 组件 // 说明:Expo SDK 54 + react-native-svg-transformer 的常见配置方式 +const path = require('path'); const { getDefaultConfig } = require('expo/metro-config'); /** @type {import('expo/metro-config').MetroConfig} */ @@ -14,6 +15,10 @@ config.resolver = { ...config.resolver, assetExts: config.resolver.assetExts.filter((ext) => ext !== 'svg'), sourceExts: [...config.resolver.sourceExts, 'svg'], + // 确保 react-native-text-size 从项目 node_modules 解析(避免 Metro 解析不到) + extraNodeModules: { + 'react-native-text-size': path.resolve(__dirname, 'node_modules/react-native-text-size'), + }, }; module.exports = config; diff --git a/client/package-lock.json b/client/package-lock.json index f305eff..a4b67ea 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -9719,6 +9719,7 @@ "version": "4.0.0-rc.1", "resolved": "https://registry.npmmirror.com/react-native-text-size/-/react-native-text-size-4.0.0-rc.1.tgz", "integrity": "sha512-CysqjU2jK6Yc+a+kEI222pUyTY2ywcU2HqbFqf1KHymW6OPTdvBBHqbEJKL0QiLhQaFYDbqicM+h990s9TP00g==", + "license": "BSD-2-Clause", "peerDependencies": { "react-native": ">=0.59.0" } diff --git a/client/package.json b/client/package.json index 76fd503..52b9376 100644 --- a/client/package.json +++ b/client/package.json @@ -6,8 +6,8 @@ "start": "expo start", "start:clean": "expo start -c", "android": "expo run:android", - "ios": "expo run:ios --scheme \"Hey Mama\"", - "ios:clean": "npm run clean:cache && npm run clean:ios-build && expo run:ios --scheme \"Hey Mama\"", + "ios": "expo run:ios --scheme \"Dear Mama\"", + "ios:clean": "npm run clean:cache && npm run clean:ios-build && expo run:ios --scheme \"Dear Mama\"", "web": "expo start --web", "test": "vitest run", "clean:cache": "rm -rf node_modules/.cache .expo 2>/dev/null; echo 'Cleared .expo and node_modules/.cache'", diff --git a/client/src/features/textWrap/measure/measureWidthImpl.ts b/client/src/features/textWrap/measure/measureWidthImpl.ts index 5d70270..b6779a9 100644 --- a/client/src/features/textWrap/measure/measureWidthImpl.ts +++ b/client/src/features/textWrap/measure/measureWidthImpl.ts @@ -20,11 +20,12 @@ type TextSizeMeasureParams = { type TextSizeMeasureResult = { width: number }; -async function loadReactNativeTextSize(): Promise<{ +function loadReactNativeTextSize(): { measure: (params: TextSizeMeasureParams) => Promise; -}> { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const mod: any = await import('react-native-text-size'); +} { + // 使用 require 确保 Metro 能解析并打包该原生模块(动态 import 在某些环境下无法被正确解析) + // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-explicit-any + const mod: any = require('react-native-text-size'); return mod?.default ?? mod; } @@ -42,7 +43,7 @@ function toTextSizeFontSpecs(fontSpec: FontSpec): Pick { - const TextSize = await loadReactNativeTextSize(); + const TextSize = loadReactNativeTextSize(); if (!TextSize || typeof TextSize.measure !== 'function') { // 典型原因:在 Expo Go 中运行,或没有使用包含该原生模块的 Development Build。 // 这里抛出更明确的错误,方便上层捕获并在 meta.reason=MEASURE_FAILED 时看到根因。 diff --git a/client/src/i18n/locales/all.json b/client/src/i18n/locales/all.json index 8751f4c..feeaec1 100644 --- a/client/src/i18n/locales/all.json +++ b/client/src/i18n/locales/all.json @@ -88,7 +88,7 @@ "errorDesc": "It’s okay if enabling fails. You can keep using the app." }, "home": { - "title": "Hey Mama", + "title": "Dear Mama", "like": "Like", "dislike": "Dislike", "favorites": "Favorites", @@ -127,7 +127,7 @@ "homeScreen": "Home Screen Widget", "howToTitle": "How to add the widget", "howToDesc1": "Long-press on the Home Screen until the apps jiggle, then tap “+” in the top-left corner.", - "howToDesc2": "Search “Hey Mama”, choose a widget size you like, then tap “Add Widget”.", + "howToDesc2": "Search “Dear Mama”, choose a widget size you like, then tap “Add Widget”.", "previewDate": "Thu, Jan 29", "previewQuote": "I’m proud of who I am, even while becoming who I want to be." }, @@ -141,10 +141,10 @@ "language": "Language", "version": "Version", "widgetTitle": "iOS Widget", - "widgetDesc": "Put gentle reminders on your home screen: long-press → tap “+” → search “Hey Mama” → add a size you like." + "widgetDesc": "Put gentle reminders on your home screen: long-press → tap “+” → search “Dear Mama” → add a size you like." }, "consent": { - "title": "Hey mama.", + "title": "Dear mama.", "subtitle": "You’re doing okay\nright now.", "subtitleSecondary": "", "agree": "Agree & Continue", @@ -260,7 +260,7 @@ "errorDesc": "開啟失敗也沒關係,你仍然可以繼續使用應用。" }, "home": { - "title": "Hey Mama", + "title": "Dear Mama", "like": "喜歡", "dislike": "不喜歡", "favorites": "收藏", @@ -299,7 +299,7 @@ "homeScreen": "桌面小工具", "howToTitle": "如何加入小工具", "howToDesc1": "長按主畫面空白處進入編輯,點左上角「+」新增小工具。", - "howToDesc2": "搜尋「Hey Mama」,選擇喜歡的尺寸,點「加入小工具」。", + "howToDesc2": "搜尋「Dear Mama」,選擇喜歡的尺寸,點「加入小工具」。", "previewDate": "1月29日週四 · 已至臘月十一", "previewQuote": "我也對現在的自己感到滿意,即使我仍在努力成為想成為的人。" }, @@ -313,7 +313,7 @@ "language": "語言", "version": "版本", "widgetTitle": "iOS 小工具", - "widgetDesc": "把溫柔提醒放到桌面上:長按主畫面 → 點「+」 → 搜尋「Hey Mama」 → 添加你喜歡的尺寸。" + "widgetDesc": "把溫柔提醒放到桌面上:長按主畫面 → 點「+」 → 搜尋「Dear Mama」 → 添加你喜歡的尺寸。" }, "consent": { "title": "我們知道,", diff --git a/client/src/i18n/locales/en.json b/client/src/i18n/locales/en.json index 8d23fd6..c25f1cd 100644 --- a/client/src/i18n/locales/en.json +++ b/client/src/i18n/locales/en.json @@ -32,7 +32,7 @@ "errorDesc": "It’s okay if enabling fails. You can keep using the app." }, "home": { - "title": "Hey Mama", + "title": "Dear Mama", "like": "Like", "dislike": "Dislike", "favorites": "Favorites", @@ -80,7 +80,7 @@ "language": "Language", "version": "Version", "widgetTitle": "iOS Widget", - "widgetDesc": "Put gentle reminders on your home screen: long-press → tap “+” → search “Hey Mama” → add a size you like." + "widgetDesc": "Put gentle reminders on your home screen: long-press → tap “+” → search “Dear Mama” → add a size you like." }, "consent": { "title": "You Are Perfect.", diff --git a/client/src/i18n/locales/es.json b/client/src/i18n/locales/es.json index 79d7817..f5c0939 100644 --- a/client/src/i18n/locales/es.json +++ b/client/src/i18n/locales/es.json @@ -30,7 +30,7 @@ "errorDesc": "No pasa nada si falla. Puedes seguir usando la app." }, "home": { - "title": "Hey Mama", + "title": "Dear Mama", "like": "Me gusta", "dislike": "No me gusta", "favorites": "Favoritos", @@ -78,7 +78,7 @@ "language": "Idioma", "version": "Versión", "widgetTitle": "Widget de iOS", - "widgetDesc": "Pon recordatorios en tu pantalla: mantén pulsado → “+” → busca “Hey Mama” → añade el tamaño." + "widgetDesc": "Pon recordatorios en tu pantalla: mantén pulsado → “+” → busca “Dear Mama” → añade el tamaño." }, "consent": { "agree": "Aceptar y Continuar", diff --git a/client/src/i18n/locales/pt.json b/client/src/i18n/locales/pt.json index e594545..0085fbf 100644 --- a/client/src/i18n/locales/pt.json +++ b/client/src/i18n/locales/pt.json @@ -30,7 +30,7 @@ "errorDesc": "Tudo bem se falhar. Você pode continuar usando o app." }, "home": { - "title": "Hey Mama", + "title": "Dear Mama", "like": "Curtir", "dislike": "Não curtir", "favorites": "Favoritos", @@ -78,7 +78,7 @@ "language": "Idioma", "version": "Versão", "widgetTitle": "Widget do iOS", - "widgetDesc": "Coloque lembretes na tela inicial: pressione e segure → “+” → procure “Hey Mama” → adicione o tamanho." + "widgetDesc": "Coloque lembretes na tela inicial: pressione e segure → “+” → procure “Dear Mama” → adicione o tamanho." }, "consent": { "agree": "Concordar e Continuar", diff --git a/client/src/i18n/locales/zh-CN.json b/client/src/i18n/locales/zh-CN.json index bf90671..4ee4334 100644 --- a/client/src/i18n/locales/zh-CN.json +++ b/client/src/i18n/locales/zh-CN.json @@ -33,7 +33,7 @@ "errorDesc": "开启失败,请稍后重试(模拟器可能无法获取推送 Token,建议用真机测试)。" }, "home": { - "title": "Hey Mama", + "title": "Dear Mama", "like": "点赞", "dislike": "讨厌", "favorites": "收藏", @@ -81,7 +81,7 @@ "language": "语言", "version": "版本", "widgetTitle": "iOS 小组件", - "widgetDesc": "把温柔提醒放到桌面上:长按主屏幕 → 点“+” → 搜索“Hey Mama” → 添加你喜欢的尺寸。" + "widgetDesc": "把温柔提醒放到桌面上:长按主屏幕 → 点“+” → 搜索“Dear Mama” → 添加你喜欢的尺寸。" }, "consent": { "title": "你本就完美。", diff --git a/client/src/i18n/locales/zh-TW.json b/client/src/i18n/locales/zh-TW.json index a7c3833..4a77bfe 100644 --- a/client/src/i18n/locales/zh-TW.json +++ b/client/src/i18n/locales/zh-TW.json @@ -92,7 +92,7 @@ "errorDesc": "開啟失敗也沒關係,你仍然可以繼續使用應用。" }, "home": { - "title": "Hey Mama", + "title": "Dear Mama", "like": "喜歡", "dislike": "不喜歡", "favorites": "收藏", @@ -131,7 +131,7 @@ "homeScreen": "桌面小工具", "howToTitle": "如何加入小工具", "howToDesc1": "長按主畫面空白處進入編輯,點左上角「+」新增小工具。", - "howToDesc2": "搜尋「Hey Mama」,選擇喜歡的尺寸,點「加入小工具」。", + "howToDesc2": "搜尋「Dear Mama」,選擇喜歡的尺寸,點「加入小工具」。", "previewDate": "1月29日週四 · 已至臘月十一", "previewQuote": "我也對現在的自己感到滿意,即使我仍在努力成為想成為的人。" }, @@ -145,7 +145,7 @@ "language": "語言", "version": "版本", "widgetTitle": "iOS 小工具", - "widgetDesc": "把溫柔提醒放到桌面上:長按主畫面 → 點「+」 → 搜尋「Hey Mama」 → 添加你喜歡的尺寸。" + "widgetDesc": "把溫柔提醒放到桌面上:長按主畫面 → 點「+」 → 搜尋「Dear Mama」 → 添加你喜歡的尺寸。" }, "consent": { "title": "我們知道,", diff --git a/server/app/api/v1/legal.py b/server/app/api/v1/legal.py index 74bb1cb..08ef3ed 100644 --- a/server/app/api/v1/legal.py +++ b/server/app/api/v1/legal.py @@ -111,7 +111,7 @@ async def get_privacy_policy(request: Request) -> HTMLResponse: accept_language = request.headers.get("accept-language") lang = _resolve_lang(accept_language) content, resolved = choose_content_by_lang(PRIVACY_POLICY_MD, lang) - title = "Hey Mama | Privacy Policy" if resolved == "en" else "Hey Mama|隱私權政策" + title = "Dear Mama | Privacy Policy" if resolved == "en" else "Dear Mama|隱私權政策" page = render_as_simple_html(title=title, content=content) return HTMLResponse(content=page, headers={"Content-Language": "en" if resolved == "en" else "zh-Hant"}) @@ -125,7 +125,7 @@ async def get_terms_of_use(request: Request) -> HTMLResponse: accept_language = request.headers.get("accept-language") lang = _resolve_lang(accept_language) content, resolved = choose_content_by_lang(TERMS_OF_USE_MD, lang) - title = "Hey Mama – Terms of Use" if resolved == "en" else "Hey Mama 使用條款" + title = "Dear Mama – Terms of Use" if resolved == "en" else "Dear Mama 使用條款" page = render_as_simple_html(title=title, content=content) return HTMLResponse(content=page, headers={"Content-Language": "en" if resolved == "en" else "zh-Hant"}) diff --git a/server/app/api/v1/push.py b/server/app/api/v1/push.py index ec43968..cee276e 100644 --- a/server/app/api/v1/push.py +++ b/server/app/api/v1/push.py @@ -256,7 +256,7 @@ async def test_push( _ = UserProfileV1_2.model_validate(pref.user_profile_json) # V1:先发固定测试文案;后续在定时任务中替换为推荐模块的 push 场景模板 - title = req.title or "Hey Mama" + title = req.title or "Dear Mama" body = req.body or "这是一条测试推送(dev)。" expo_res = await _send_expo_push(to=token.push_token, title=title, body=body, data={"client_user_id": req.client_user_id}) diff --git a/server/app/legal_docs.py b/server/app/legal_docs.py index 8697aee..ebf9b1b 100644 --- a/server/app/legal_docs.py +++ b/server/app/legal_docs.py @@ -11,21 +11,21 @@ ResolvedLang = Literal["en", "tc"] # 协议原文(直接来自仓库中的 Markdown 文档)。 # 说明:为了保证“点击一定有内容”,这里在后端内置了一份可展示的协议文本。 # 线上若你们有官网/静态站点托管页面,可通过环境变量 LEGAL_* 覆盖为外部链接。 -PRIVACY_POLICY_MD = """Hey Mama | Privacy Policy +PRIVACY_POLICY_MD = """Dear Mama | Privacy Policy Last updated: February 2026 1. Introduction -Welcome to Hey Mama (“the App,” “we,” “us”). +Welcome to Dear Mama (“the App,” “we,” “us”). We respect your privacy and are committed to protecting your personal information. This Privacy Policy explains how we collect, use, store, and protect information when you use the App. By downloading, accessing, or using the App, you acknowledge that you have read, understood, and agreed to this Privacy Policy. 2. Data Controller and Scope -The App is operated and maintained by the Hey Mama team. +The App is operated and maintained by the Dear Mama team. This Privacy Policy applies to information processing activities related to your use of the App. 3. Information We Collect 3.1 Information You Provide -Hey Mama does not require account registration and does not require you to provide personally identifiable information. +Dear Mama does not require account registration and does not require you to provide personally identifiable information. During your use of the App, you may optionally provide or generate the following information: - Reminder settings (e.g., reminder frequency) - Text content you view, save as favorites, or create within the App (if available) @@ -59,7 +59,7 @@ We do not: - Use your data for third-party advertising purposes 7. Third-Party Services -Hey Mama currently does not integrate third-party advertising or marketing services. +Dear Mama currently does not integrate third-party advertising or marketing services. The App may rely on necessary operating system and app store services to provide functionality (for example, push notification delivery mechanisms). If we later integrate third-party analytics or technical services, we will update this Privacy Policy accordingly. @@ -67,7 +67,7 @@ If we later integrate third-party analytics or technical services, we will updat We retain information only for as long as necessary to achieve the purposes described above. We implement reasonable technical and organizational measures to protect information against unauthorized access, disclosure, alteration, or loss. 9. Minors -Hey Mama is not designed for children, and we do not knowingly collect personal information from users under the age of 13. +Dear Mama is not designed for children, and we do not knowingly collect personal information from users under the age of 13. If you are a minor, please use the App with the consent and supervision of a parent or guardian. 10. Changes to This Privacy Policy @@ -75,17 +75,17 @@ We may update this Privacy Policy from time to time. The updated version will be --- -Hey Mama|隱私權政策 +Dear Mama|隱私權政策 最後更新日期:2026 年 2 月 一、前言 -歡迎使用 Hey Mama(以下簡稱「本 App」、「我們」)。 -我們重視您的隱私,並致力於保護您的個人資料安全。本隱私權政策說明您在使用 Hey Mama 時,我們如何收集、使用、保存與保護相關資訊。 +歡迎使用 Dear Mama(以下簡稱「本 App」、「我們」)。 +我們重視您的隱私,並致力於保護您的個人資料安全。本隱私權政策說明您在使用 Dear Mama 時,我們如何收集、使用、保存與保護相關資訊。 當您下載、存取或使用本 App,即表示您已閱讀、理解並同意本隱私權政策之內容。 二、我們收集的資訊 1. 使用者主動提供的資訊 -Hey Mama 不要求建立帳號,亦不強制使用者提供可識別個人身分的資料。 +Dear Mama 不要求建立帳號,亦不強制使用者提供可識別個人身分的資料。 在使用過程中,您可能會選擇性提供或產生以下資訊: - 提醒設定(例如提醒頻率) - 使用者在 App 內閱讀、收藏或建立的文字內容(如有) @@ -99,7 +99,7 @@ Hey Mama 不要求建立帳號,亦不強制使用者提供可識別個人身 這些資訊無法直接識別您的身分,僅用於維持 App 穩定性與改善使用體驗。 三、推送通知 -在取得您同意後,Hey Mama 可能會向您發送提醒推送,例如每日肯定語提示。 +在取得您同意後,Dear Mama 可能會向您發送提醒推送,例如每日肯定語提示。 - 推送內容僅包含一般文字資訊 - 不包含任何敏感個人資料 - 您可隨時於裝置系統設定中關閉通知功能 @@ -117,14 +117,14 @@ Hey Mama 不要求建立帳號,亦不強制使用者提供可識別個人身 - 將資料用於第三方廣告投放 六、第三方服務 -目前 Hey Mama 未整合第三方廣告或行銷服務。 +目前 Dear Mama 未整合第三方廣告或行銷服務。 如未來整合第三方分析或技術服務,我們將於本政策中另行說明並更新。 七、資料保存與安全 我們僅在達成上述目的所需期間內保存相關資訊,並採取合理的技術與管理措施,以防止資料遭未經授權存取、洩漏、竄改或遺失。 八、未成年人說明 -Hey Mama 並非專為兒童設計,亦不刻意收集未滿 13 歲使用者的個人資料。 +Dear Mama 並非專為兒童設計,亦不刻意收集未滿 13 歲使用者的個人資料。 若您為未成年人,請在監護人同意與陪同下使用本 App。 九、隱私權政策的變更 @@ -132,17 +132,17 @@ Hey Mama 並非專為兒童設計,亦不刻意收集未滿 13 歲使用者的 更新後的版本將公布於 App 內或相關頁面,您於政策更新後繼續使用本 App,即視為同意更新內容。 """ -TERMS_OF_USE_MD = """Hey Mama – Terms of Use +TERMS_OF_USE_MD = """Dear Mama – Terms of Use Last updated: February 2026 -Welcome to Hey Mama (“the App,” “we,” or “us”). +Welcome to Dear Mama (“the App,” “we,” or “us”). Please read these Terms of Use carefully before downloading, accessing, or using the App. By using the App, you agree to be bound by these Terms. 1. Intended Audience -Hey Mama is intended for adults only. +Dear Mama is intended for adults only. The App is not designed for children, and users must ensure they have the legal capacity to use the App under applicable laws. 2. Services Provided -Hey Mama provides text-based content and features, including but not limited to: +Dear Mama provides text-based content and features, including but not limited to: - Daily affirmations and mindfulness text - User-configured reminders and push notifications - Home screen widgets displaying affirmation text @@ -184,17 +184,17 @@ Updated versions will be made available within the App or related pages. Continu These Terms shall be governed by and construed in accordance with the applicable laws of our operating jurisdiction. --- -Hey Mama 使用條款 +Dear Mama 使用條款 最後更新日期:2026 年 2 月 -歡迎使用 Hey Mama(以下簡稱「本 App」、「我們」)。 +歡迎使用 Dear Mama(以下簡稱「本 App」、「我們」)。 在下載、存取或使用本 App 前,請您仔細閱讀本使用條款。當您開始使用本 App,即表示您已閱讀、理解並同意遵守本條款。 1. 服務對象與使用資格 -Hey Mama 僅供成年人使用(intended for adults)。 +Dear Mama 僅供成年人使用(intended for adults)。 本 App 並非為兒童設計,使用者應確認自己具備依所在地法律使用本服務的完全行為能力。 2. 服務內容 -Hey Mama 提供以文字形式為主的內容與功能,包括但不限於: +Dear Mama 提供以文字形式為主的內容與功能,包括但不限於: - 每日肯定語與正念文字內容 - 使用者設定的提醒與推送通知 - 桌面小組件顯示肯定語文字 diff --git a/spec_kit/overview.md b/spec_kit/overview.md index 34f8e1c..47ab100 100644 --- a/spec_kit/overview.md +++ b/spec_kit/overview.md @@ -89,9 +89,9 @@ - iOS 构建号已提升到 `2`,并将 `client/ios/client/Info.plist` 改为自动跟随 `MARKETING_VERSION` / `CURRENT_PROJECT_VERSION` - 推送 entitlements 的 `aps-environment` 已切到 `production`(用于 TestFlight/线上包) - 清理未接入编译的 WidgetKit 骨架残留:移除磁盘上的 `client/ios/MindfulnessWidget/` 文件,并从 `client/ios/client.xcodeproj/project.pbxproj` 删除对应工程引用(避免 Xcode 显示幽灵文件) - - 修复 Xcode Archive 偶发显示 “Generic Xcode Archive”:在共享 scheme `Hey Mama` 的 Archive Post-actions 自动补齐 `.xcarchive/Info.plist` 的 `ApplicationProperties`,并在缺失时补齐 `Name`/`SchemeName` + 自检提示(根治 Organizer 无法识别主 App、无法分发/上传 TestFlight 的问题) + - 修复 Xcode Archive 偶发显示 “Generic Xcode Archive”:在共享 scheme `Dear Mama` 的 Archive Post-actions 自动补齐 `.xcarchive/Info.plist` 的 `ApplicationProperties`,并在缺失时补齐 `Name`/`SchemeName` + 自检提示(根治 Organizer 无法识别主 App、无法分发/上传 TestFlight 的问题) - Widget 名称与描述支持多语言(TC/EN,默认 EN):Widget Extension 增加 `Localizable.strings`(`en.lproj` / `zh-Hant.lproj`),`EmotionWidget.swift` 使用本地化 key 作为 `.configurationDisplayName/.description` - - 个人主页弹窗:小工具入口**暂时隐藏**锁屏小工具说明;桌面小工具引导弹窗标题(繁中/TC)更新为“**如何加入小工具**”(并统一弹窗标题使用该文案);品牌文案“正念”改为 **Hey Mama**(含引导搜索词与 Widget 标题) + - 个人主页弹窗:小工具入口**暂时隐藏**锁屏小工具说明;桌面小工具引导弹窗标题(繁中/TC)更新为“**如何加入小工具**”(并统一弹窗标题使用该文案);品牌文案改为 **Dear Mama**(含引导搜索词与 Widget 标题) ## Text Wrap diff --git a/设计说明文档/用户使用协议.md b/设计说明文档/用户使用协议.md index 12f586d..200296e 100644 --- a/设计说明文档/用户使用协议.md +++ b/设计说明文档/用户使用协议.md @@ -1,14 +1,14 @@ -Hey Mama – Terms of Use +Dear Mama – Terms of Use Last updated: February 2026 -Welcome to Hey Mama (“the App,” “we,” or “us”). +Welcome to Dear Mama (“the App,” “we,” or “us”). Please read these Terms of Use carefully before downloading, accessing, or using the App. By using the App, you agree to be bound by these Terms. 1. Intended Audience -Hey Mama is intended for adults only. +Dear Mama is intended for adults only. The App is not designed for children, and users must ensure they have the legal capacity to use the App under applicable laws. 2. Services Provided -Hey Mama provides text-based content and features, including but not limited to: +Dear Mama provides text-based content and features, including but not limited to: - Daily affirmations and mindfulness text - User-configured reminders and push notifications - Home screen widgets displaying affirmation text @@ -50,17 +50,17 @@ Updated versions will be made available within the App or related pages. Continu These Terms shall be governed by and construed in accordance with the applicable laws of our operating jurisdiction. --- -Hey Mama 使用條款 +Dear Mama 使用條款 最後更新日期:2026 年 2 月 -歡迎使用 Hey Mama(以下簡稱「本 App」、「我們」)。 +歡迎使用 Dear Mama(以下簡稱「本 App」、「我們」)。 在下載、存取或使用本 App 前,請您仔細閱讀本使用條款。當您開始使用本 App,即表示您已閱讀、理解並同意遵守本條款。 1. 服務對象與使用資格 -Hey Mama 僅供成年人使用(intended for adults)。 +Dear Mama 僅供成年人使用(intended for adults)。 本 App 並非為兒童設計,使用者應確認自己具備依所在地法律使用本服務的完全行為能力。 2. 服務內容 -Hey Mama 提供以文字形式為主的內容與功能,包括但不限於: +Dear Mama 提供以文字形式為主的內容與功能,包括但不限於: - 每日肯定語與正念文字內容 - 使用者設定的提醒與推送通知 - 桌面小組件顯示肯定語文字 diff --git a/设计说明文档/隐私协议.md b/设计说明文档/隐私协议.md index 0f91358..e6d4b8b 100644 --- a/设计说明文档/隐私协议.md +++ b/设计说明文档/隐私协议.md @@ -1,18 +1,18 @@ -Hey Mama | Privacy Policy +Dear Mama | Privacy Policy Last updated: February 2026 1. Introduction -Welcome to Hey Mama (“the App,” “we,” “us”). +Welcome to Dear Mama (“the App,” “we,” “us”). We respect your privacy and are committed to protecting your personal information. This Privacy Policy explains how we collect, use, store, and protect information when you use the App. By downloading, accessing, or using the App, you acknowledge that you have read, understood, and agreed to this Privacy Policy. 2. Data Controller and Scope -The App is operated and maintained by the Hey Mama team. +The App is operated and maintained by the Dear Mama team. This Privacy Policy applies to information processing activities related to your use of the App. 3. Information We Collect 3.1 Information You Provide -Hey Mama does not require account registration and does not require you to provide personally identifiable information. +Dear Mama does not require account registration and does not require you to provide personally identifiable information. During your use of the App, you may optionally provide or generate the following information: - Reminder settings (e.g., reminder frequency) - Text content you view, save as favorites, or create within the App (if available) @@ -46,7 +46,7 @@ We do not: - Use your data for third-party advertising purposes 7. Third-Party Services -Hey Mama currently does not integrate third-party advertising or marketing services. +Dear Mama currently does not integrate third-party advertising or marketing services. The App may rely on necessary operating system and app store services to provide functionality (for example, push notification delivery mechanisms). If we later integrate third-party analytics or technical services, we will update this Privacy Policy accordingly. @@ -54,7 +54,7 @@ If we later integrate third-party analytics or technical services, we will updat We retain information only for as long as necessary to achieve the purposes described above. We implement reasonable technical and organizational measures to protect information against unauthorized access, disclosure, alteration, or loss. 9. Minors -Hey Mama is not designed for children, and we do not knowingly collect personal information from users under the age of 13. +Dear Mama is not designed for children, and we do not knowingly collect personal information from users under the age of 13. If you are a minor, please use the App with the consent and supervision of a parent or guardian. 10. Changes to This Privacy Policy @@ -62,17 +62,17 @@ We may update this Privacy Policy from time to time. The updated version will be --- -Hey Mama|隱私權政策 +Dear Mama|隱私權政策 最後更新日期:2026 年 2 月 一、前言 -歡迎使用 Hey Mama(以下簡稱「本 App」、「我們」)。 -我們重視您的隱私,並致力於保護您的個人資料安全。本隱私權政策說明您在使用 Hey Mama 時,我們如何收集、使用、保存與保護相關資訊。 +歡迎使用 Dear Mama(以下簡稱「本 App」、「我們」)。 +我們重視您的隱私,並致力於保護您的個人資料安全。本隱私權政策說明您在使用 Dear Mama 時,我們如何收集、使用、保存與保護相關資訊。 當您下載、存取或使用本 App,即表示您已閱讀、理解並同意本隱私權政策之內容。 二、我們收集的資訊 1. 使用者主動提供的資訊 -Hey Mama 不要求建立帳號,亦不強制使用者提供可識別個人身分的資料。 +Dear Mama 不要求建立帳號,亦不強制使用者提供可識別個人身分的資料。 在使用過程中,您可能會選擇性提供或產生以下資訊: - 提醒設定(例如提醒頻率) - 使用者在 App 內閱讀、收藏或建立的文字內容(如有) @@ -86,7 +86,7 @@ Hey Mama 不要求建立帳號,亦不強制使用者提供可識別個人身 這些資訊無法直接識別您的身分,僅用於維持 App 穩定性與改善使用體驗。 三、推送通知 -在取得您同意後,Hey Mama 可能會向您發送提醒推送,例如每日肯定語提示。 +在取得您同意後,Dear Mama 可能會向您發送提醒推送,例如每日肯定語提示。 - 推送內容僅包含一般文字資訊 - 不包含任何敏感個人資料 - 您可隨時於裝置系統設定中關閉通知功能 @@ -104,14 +104,14 @@ Hey Mama 不要求建立帳號,亦不強制使用者提供可識別個人身 - 將資料用於第三方廣告投放 六、第三方服務 -目前 Hey Mama 未整合第三方廣告或行銷服務。 +目前 Dear Mama 未整合第三方廣告或行銷服務。 如未來整合第三方分析或技術服務,我們將於本政策中另行說明並更新。 七、資料保存與安全 我們僅在達成上述目的所需期間內保存相關資訊,並採取合理的技術與管理措施,以防止資料遭未經授權存取、洩漏、竄改或遺失。 八、未成年人說明 -Hey Mama 並非專為兒童設計,亦不刻意收集未滿 13 歲使用者的個人資料。 +Dear Mama 並非專為兒童設計,亦不刻意收集未滿 13 歲使用者的個人資料。 若您為未成年人,請在監護人同意與陪同下使用本 App。 九、隱私權政策的變更