From 13bf53e9643229a9eceb68002bebdf2bfb467c91 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 17 Sep 2025 09:34:33 +0800 Subject: [PATCH 01/37] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E8=B4=A6=E6=88=B7=E6=97=B6=E4=BD=BF=E7=94=A8=E5=9B=BD?= =?UTF-8?q?=E5=A4=96=E6=89=8B=E6=9C=BA=E5=8F=B7=E8=8E=B7=E5=8F=96=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=A0=81=E6=97=B6=E8=BF=9B=E8=A1=8C=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../register/starLock_register_logic.dart | 35 +++++++++---------- .../register/starLock_register_page.dart | 31 ++++++++++++---- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/lib/login/register/starLock_register_logic.dart b/lib/login/register/starLock_register_logic.dart index 5796d422..b0731e23 100755 --- a/lib/login/register/starLock_register_logic.dart +++ b/lib/login/register/starLock_register_logic.dart @@ -84,14 +84,13 @@ class StarLockRegisterLogic extends BaseGetXController { } Future sendValidationCode() async { - final SendValidationCodeEntity entity = - await ApiRepository.to.sendValidationCodeUnLogin( - // state.countryCode.value, - countryCode: state.countryCode.value.toString(), - account: state.phoneOrEmailStr.value, - channel: state.isIphoneType.value ? '1' : '2', - codeType: '1', - xWidth: state.xWidth.value.toString()); + final SendValidationCodeEntity entity = await ApiRepository.to.sendValidationCodeUnLogin( + // state.countryCode.value, + countryCode: state.countryCode.value.toString(), + account: state.phoneOrEmailStr.value, + channel: state.isIphoneType.value ? '1' : '2', + codeType: '1', + xWidth: state.xWidth.value.toString()); if (entity.errorCode!.codeIsSuccessful) { _startTimer(); } else {} @@ -100,13 +99,16 @@ class StarLockRegisterLogic extends BaseGetXController { Future checkIpAction() async { final CheckIPEntity entity = await ApiRepository.to.checkIpAction(ip: ''); if (entity.errorCode!.codeIsSuccessful) { + if (entity.data!.abbreviation != 'CN') { + showToast('当前国家不支持手机验证码注册,请使用邮箱进行注册'.tr); + return; + } if (state.countryName.value != entity.data!.name) { ShowTipView().showSureAlertDialog( - '国家地区的选择将影响数据安全,你当前选择的是'.tr + - '${state.countryName.value},' + - '请确认后再继续'.tr, - tipTitle: '确认国家或地区'.tr, - sureStr: '我知道了'.tr); + '国家地区的选择将影响数据安全,你当前选择的是'.tr + '${state.countryName.value},' + '请确认后再继续'.tr, + tipTitle: '确认国家或地区'.tr, + sureStr: '我知道了'.tr, + ); } } } @@ -138,15 +140,12 @@ class StarLockRegisterLogic extends BaseGetXController { // 重置是否能提交 void _resetCanSub() { - state.canSub.value = state.pwdIsOK && - state.codeIsOK && - state.phoneOrEmailStr.value.isNotEmpty; + state.canSub.value = state.pwdIsOK && state.codeIsOK && state.phoneOrEmailStr.value.isNotEmpty; } // 重置是否能发送验证码 void _resetCanSendCode() { - state.canSendCode.value = - state.pwdIsOK && state.phoneOrEmailStr.value.isNotEmpty; + state.canSendCode.value = state.pwdIsOK && state.phoneOrEmailStr.value.isNotEmpty; } @override diff --git a/lib/login/register/starLock_register_page.dart b/lib/login/register/starLock_register_page.dart index cec34d5a..279010d0 100755 --- a/lib/login/register/starLock_register_page.dart +++ b/lib/login/register/starLock_register_page.dart @@ -4,7 +4,10 @@ import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_settings.dart'; +import 'package:star_lock/login/register/entity/checkIP_entity.dart'; import 'package:star_lock/login/register/starLock_register_state.dart'; +import 'package:star_lock/network/api_repository.dart'; +import 'package:star_lock/tools/baseGetXController.dart'; import '../../appRouters.dart'; import '../../app_settings/app_colors.dart'; @@ -79,7 +82,8 @@ class _StarLockRegisterPageState extends State { width: 340.w, height: 60.h, decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(30.h)), border: Border.all(width: 1.0, color: AppColors.greyLineColor)), + borderRadius: BorderRadius.all(Radius.circular(30.h)), + border: Border.all(width: 1.0, color: AppColors.greyLineColor)), child: Row( children: [ GestureDetector( @@ -153,13 +157,16 @@ class _StarLockRegisterPageState extends State { child: Row( children: [ SizedBox(width: 5.w), - Expanded(child: Text('你所在的国家/地区'.tr, style: TextStyle(fontSize: 26.sp, color: AppColors.blackColor))), + Expanded( + child: Text('你所在的国家/地区'.tr, style: TextStyle(fontSize: 26.sp, color: AppColors.blackColor))), SizedBox(width: 20.w), Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Text( - state.isIphoneType.value ? '${state.countryName.value} +${state.countryCode.value}' : state.countryName.value, + state.isIphoneType.value + ? '${state.countryName.value} +${state.countryCode.value}' + : state.countryName.value, textAlign: TextAlign.end, style: TextStyle(fontSize: 26.sp, color: AppColors.blackColor), ) @@ -279,9 +286,19 @@ class _StarLockRegisterPageState extends State { Obx(() => GestureDetector( onTap: (state.canSendCode.value && state.canResend.value) ? () async { + final CheckIPEntity entity = await ApiRepository.to.checkIpAction(ip: ''); + if (entity.errorCode!.codeIsSuccessful) { + if (entity.data!.abbreviation != 'CN') { + logic.showToast('当前国家不支持手机验证码注册,请使用邮箱进行注册'.tr); + return; + } + } // Navigator.pushNamed(context, Routers.safetyVerificationPage, arguments: {"countryCode":"+86", "account":state.phoneOrEmailStr.value}); final Object? result = await Navigator.pushNamed(context, Routers.safetyVerificationPage, - arguments: {'countryCode': state.countryCode, 'account': state.phoneOrEmailStr.value}); + arguments: { + 'countryCode': state.countryCode, + 'account': state.phoneOrEmailStr.value + }); state.xWidth.value = (result! as Map)['xWidth']; logic.sendValidationCode(); } @@ -338,7 +355,8 @@ class _StarLockRegisterPageState extends State { child: GestureDetector( child: Text('《${'用户协议'.tr}》', style: TextStyle(color: AppColors.mainColor, fontSize: 20.sp)), onTap: () { - Get.toNamed(Routers.webviewShowPage, arguments: {'url': XSConstantMacro.userAgreementURL, 'title': '用户协议'.tr}); + Get.toNamed(Routers.webviewShowPage, + arguments: {'url': XSConstantMacro.userAgreementURL, 'title': '用户协议'.tr}); }, )), WidgetSpan( @@ -346,7 +364,8 @@ class _StarLockRegisterPageState extends State { child: GestureDetector( child: Text('《${'隐私政策'.tr}》', style: TextStyle(color: AppColors.mainColor, fontSize: 20.sp)), onTap: () { - Get.toNamed(Routers.webviewShowPage, arguments: {'url': XSConstantMacro.privacyPolicyURL, 'title': '隐私政策'.tr}); + Get.toNamed(Routers.webviewShowPage, + arguments: {'url': XSConstantMacro.privacyPolicyURL, 'title': '隐私政策'.tr}); }, )), ], From 8fd1dac25407b343bfb38a22f59bea158a2b09c7 Mon Sep 17 00:00:00 2001 From: liyi Date: Wed, 17 Sep 2025 09:43:26 +0800 Subject: [PATCH 02/37] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lan/lan_ar.json | 3 ++- lan/lan_bg.json | 3 ++- lan/lan_bn.json | 3 ++- lan/lan_cs.json | 3 ++- lan/lan_da.json | 3 ++- lan/lan_de.json | 3 ++- lan/lan_el.json | 3 ++- lan/lan_en.json | 3 ++- lan/lan_es.json | 3 ++- lan/lan_et.json | 3 ++- lan/lan_fi.json | 3 ++- lan/lan_fr.json | 3 ++- lan/lan_he.json | 3 ++- lan/lan_hi.json | 3 ++- lan/lan_hk.json | 3 ++- lan/lan_hr.json | 3 ++- lan/lan_hu.json | 3 ++- lan/lan_hy.json | 3 ++- lan/lan_id.json | 3 ++- lan/lan_it.json | 3 ++- lan/lan_ja.json | 3 ++- lan/lan_ka.json | 3 ++- lan/lan_keys.json | 3 ++- lan/lan_kk.json | 3 ++- lan/lan_ko.json | 3 ++- lan/lan_lt.json | 3 ++- lan/lan_ms.json | 3 ++- lan/lan_nl.json | 3 ++- lan/lan_pl.json | 3 ++- lan/lan_pt.json | 3 ++- lan/lan_pt_br.json | 3 ++- lan/lan_ro.json | 3 ++- lan/lan_ru.json | 3 ++- lan/lan_sk.json | 3 ++- lan/lan_sr_cyrl.json | 3 ++- lan/lan_sv.json | 3 ++- lan/lan_th.json | 3 ++- lan/lan_tr.json | 3 ++- lan/lan_tw.json | 3 ++- lan/lan_uk.json | 3 ++- lan/lan_ur.json | 3 ++- lan/lan_vi.json | 3 ++- lan/lan_zh.json | 3 ++- 43 files changed, 86 insertions(+), 43 deletions(-) diff --git a/lan/lan_ar.json b/lan/lan_ar.json index ecf98f2b..ff544bbe 100644 --- a/lan/lan_ar.json +++ b/lan/lan_ar.json @@ -1166,5 +1166,6 @@ "云存会员": "عضوية التخزين السحابي", "服务,图像视频信息随心存!": "معلومات الخدمة والصور والفيديو في قلبك!", "图像": "صورة", - "视频": "فيديو" + "视频": "فيديو", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "حاليا ، لا تدعم الدولة تسجيل رمز التحقق من الهاتف المحمول ، يرجى استخدام عنوان بريدك الإلكتروني للتسجيل" } \ No newline at end of file diff --git a/lan/lan_bg.json b/lan/lan_bg.json index eea05db9..db6513ae 100644 --- a/lan/lan_bg.json +++ b/lan/lan_bg.json @@ -1167,5 +1167,6 @@ "云存会员": "Членство в Cloud Storage", "服务,图像视频信息随心存!": "Информацията за обслужване, изображения и видео са във вашето сърце!", "图像": "изображение", - "视频": "Видео" + "视频": "Видео", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "В момента страната не поддържа регистрация на код за потвърждение на мобилен телефон, моля, използвайте имейл адреса си, за да се регистрирате" } \ No newline at end of file diff --git a/lan/lan_bn.json b/lan/lan_bn.json index 89041a00..6ec6c1d1 100644 --- a/lan/lan_bn.json +++ b/lan/lan_bn.json @@ -1167,5 +1167,6 @@ "云存会员": "ক্লাউড স্টোরেজ সদস্যতা", "服务,图像视频信息随心存!": "পরিষেবা, চিত্র এবং ভিডিও তথ্য আপনার হৃদয়ে!", "图像": "প্রতিচ্ছবি", - "视频": "ভিডিও" + "视频": "ভিডিও", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "বর্তমানে, দেশটি মোবাইল ফোন যাচাইকরণ কোড নিবন্ধন সমর্থন করে না, নিবন্ধন করতে দয়া করে আপনার ইমেল ঠিকানা ব্যবহার করুন" } \ No newline at end of file diff --git a/lan/lan_cs.json b/lan/lan_cs.json index c579af09..a5ddb31f 100644 --- a/lan/lan_cs.json +++ b/lan/lan_cs.json @@ -1167,5 +1167,6 @@ "云存会员": "Členství v cloudovém úložišti", "服务,图像视频信息随心存!": "Servis, obrazové a video informace jsou na prvním místě!", "图像": "obraz", - "视频": "Video" + "视频": "Video", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "V současné době země nepodporuje registraci ověřovacího kódu mobilního telefonu, k registraci použijte prosím svou e-mailovou adresu" } \ No newline at end of file diff --git a/lan/lan_da.json b/lan/lan_da.json index f5a38024..f9ba754b 100644 --- a/lan/lan_da.json +++ b/lan/lan_da.json @@ -1167,5 +1167,6 @@ "云存会员": "Medlemskab af Cloud Storage", "服务,图像视频信息随心存!": "Service-, billed- og videoinformation er i dit hjerte!", "图像": "billede", - "视频": "Video" + "视频": "Video", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "I øjeblikket understøtter landet ikke registrering af mobiltelefonbekræftelseskode, brug venligst din e-mailadresse til at tilmelde dig" } \ No newline at end of file diff --git a/lan/lan_de.json b/lan/lan_de.json index 1ba029e0..b4068c51 100644 --- a/lan/lan_de.json +++ b/lan/lan_de.json @@ -1167,5 +1167,6 @@ "云存会员": "Cloud-Speicher-Mitgliedschaft", "服务,图像视频信息随心存!": "Service-, Bild- und Videoinformationen liegen Ihnen am Herzen!", "图像": "Bild", - "视频": "Video" + "视频": "Video", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Derzeit unterstützt das Land die Registrierung von Verifizierungscodes für Mobiltelefone nicht, bitte verwenden Sie Ihre E-Mail-Adresse, um sich zu registrieren" } \ No newline at end of file diff --git a/lan/lan_el.json b/lan/lan_el.json index 6e6dafbb..2c4f4739 100644 --- a/lan/lan_el.json +++ b/lan/lan_el.json @@ -1167,5 +1167,6 @@ "云存会员": "Συνδρομή Cloud Storage", "服务,图像视频信息随心存!": "Οι πληροφορίες εξυπηρέτησης, εικόνας και βίντεο είναι στην καρδιά σας!", "图像": "εικόνα", - "视频": "Βίντεο" + "视频": "Βίντεο", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Προς το παρόν, η χώρα δεν υποστηρίζει την εγγραφή κωδικού επαλήθευσης κινητού τηλεφώνου, χρησιμοποιήστε τη διεύθυνση email σας για να εγγραφείτε" } \ No newline at end of file diff --git a/lan/lan_en.json b/lan/lan_en.json index 6d36eb6e..60d149df 100644 --- a/lan/lan_en.json +++ b/lan/lan_en.json @@ -1173,5 +1173,6 @@ "云存会员": "Cloud Storage Membership", "服务,图像视频信息随心存!": "Service, image and video information are at your heart!", "图像": "image", - "视频": "Video" + "视频": "Video", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Currently, the country does not support mobile phone verification code registration, please use your email address to register" } \ No newline at end of file diff --git a/lan/lan_es.json b/lan/lan_es.json index f039a65c..b5a08f60 100644 --- a/lan/lan_es.json +++ b/lan/lan_es.json @@ -1167,5 +1167,6 @@ "云存会员": "Membresía de almacenamiento en la nube", "服务,图像视频信息随心存!": "¡La información de servicio, imagen y video está en su corazón!", "图像": "imagen", - "视频": "Vídeo" + "视频": "Vídeo", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Actualmente, el país no admite el registro de códigos de verificación de teléfonos móviles, utilice su dirección de correo electrónico para registrarse" } \ No newline at end of file diff --git a/lan/lan_et.json b/lan/lan_et.json index 796dc196..138981f2 100644 --- a/lan/lan_et.json +++ b/lan/lan_et.json @@ -1167,5 +1167,6 @@ "云存会员": "Pilvesalvestuse liikmelisus", "服务,图像视频信息随心存!": "Teenindus-, pildi- ja videoteave on teie südames!", "图像": "Piltide", - "视频": "Video" + "视频": "Video", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Praegu ei toeta riik mobiiltelefoni kinnituskoodi registreerimist, palun kasutage registreerumiseks oma e-posti aadressi" } \ No newline at end of file diff --git a/lan/lan_fi.json b/lan/lan_fi.json index ec701465..35d43d15 100644 --- a/lan/lan_fi.json +++ b/lan/lan_fi.json @@ -1167,5 +1167,6 @@ "云存会员": "Pilvitallennustilan jäsenyys", "服务,图像视频信息随心存!": "Palvelu-, kuva- ja videotiedot ovat sydämessäsi!", "图像": "kuva", - "视频": "Video" + "视频": "Video", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Tällä hetkellä maa ei tue matkapuhelimen vahvistuskoodin rekisteröintiä, käytä rekisteröitymiseen sähköpostiosoitettasi" } \ No newline at end of file diff --git a/lan/lan_fr.json b/lan/lan_fr.json index 530463cd..ead562b4 100644 --- a/lan/lan_fr.json +++ b/lan/lan_fr.json @@ -1167,5 +1167,6 @@ "云存会员": "Adhésion au stockage dans le cloud", "服务,图像视频信息随心存!": "Le service, l’image et les informations vidéo sont au cœur de vos préoccupations !", "图像": "image", - "视频": "Vidéo" + "视频": "Vidéo", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Actuellement, le pays ne prend pas en charge l’enregistrement du code de vérification du téléphone portable, veuillez utiliser votre adresse e-mail pour vous inscrire" } \ No newline at end of file diff --git a/lan/lan_he.json b/lan/lan_he.json index 9969af6e..9e55690f 100644 --- a/lan/lan_he.json +++ b/lan/lan_he.json @@ -1167,5 +1167,6 @@ "云存会员": "חברות באחסון בענן", "服务,图像视频信息随心存!": "מידע על שירות, תמונה ווידאו נמצאים בלב שלך!", "图像": "תמונה", - "视频": "וידאו" + "视频": "וידאו", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "נכון לעכשיו, המדינה אינה תומכת ברישום קוד אימות טלפון נייד, אנא השתמש בכתובת הדוא\"ל שלך כדי להירשם" } \ No newline at end of file diff --git a/lan/lan_hi.json b/lan/lan_hi.json index dd509b23..9ea45150 100644 --- a/lan/lan_hi.json +++ b/lan/lan_hi.json @@ -1167,5 +1167,6 @@ "云存会员": "क्लाउड स्टोरेज सदस्यता", "服务,图像视频信息随心存!": "सेवा, छवि और वीडियो जानकारी आपके दिल में हैं!", "图像": "प्रतिबिंब", - "视频": "वीडियो" + "视频": "वीडियो", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "वर्तमान में, देश मोबाइल फोन सत्यापन कोड पंजीकरण का समर्थन नहीं करता है, कृपया पंजीकरण करने के लिए अपने ईमेल पते का उपयोग करें" } \ No newline at end of file diff --git a/lan/lan_hk.json b/lan/lan_hk.json index 2cac7cfc..d10ac718 100644 --- a/lan/lan_hk.json +++ b/lan/lan_hk.json @@ -1168,5 +1168,6 @@ "云存会员": "雲存會員", "服务,图像视频信息随心存!": "服務,圖像視頻資訊隨心存!", "图像": "圖像", - "视频": "視頻" + "视频": "視頻", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "當前國家不支援手機驗證碼註冊,請使用郵箱進行註冊" } \ No newline at end of file diff --git a/lan/lan_hr.json b/lan/lan_hr.json index 562619fe..acb1f8cf 100644 --- a/lan/lan_hr.json +++ b/lan/lan_hr.json @@ -1167,5 +1167,6 @@ "云存会员": "Članstvo u pohrani u oblaku", "服务,图像视频信息随心存!": "Informacije o usluzi, slikama i videozapisima su vam u srcu!", "图像": "slika", - "视频": "Video" + "视频": "Video", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Trenutno zemlja ne podržava registraciju koda za provjeru mobilnog telefona, za registraciju koristite svoju adresu e-pošte" } \ No newline at end of file diff --git a/lan/lan_hu.json b/lan/lan_hu.json index 3ee2cb6c..e8269f88 100644 --- a/lan/lan_hu.json +++ b/lan/lan_hu.json @@ -1167,5 +1167,6 @@ "云存会员": "Felhőalapú tárolási tagság", "服务,图像视频信息随心存!": "A szolgáltatás, a képi és videós információk a szívedben vannak!", "图像": "kép", - "视频": "Video" + "视频": "Video", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Jelenleg az ország nem támogatja a mobiltelefonos ellenőrző kód regisztrációját, kérjük, használja e-mail címét a regisztrációhoz" } \ No newline at end of file diff --git a/lan/lan_hy.json b/lan/lan_hy.json index 0d5973d8..de78b0a0 100644 --- a/lan/lan_hy.json +++ b/lan/lan_hy.json @@ -1173,5 +1173,6 @@ "云存会员": "Cloud Storage Membership", "服务,图像视频信息随心存!": "Ծառայությունը, պատկերը եւ վիդեո տեղեկատվությունը ձեր սրտում են:", "图像": "Պատկերասրահ", - "视频": "Տեսանյութ" + "视频": "Տեսանյութ", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Ներկայումս երկիրը չի աջակցում բջջային հեռախոսի ստուգման կոդի գրանցմանը, խնդրում ենք գրանցվելու համար օգտագործել ձեր էլ. փոստի հասցեն" } \ No newline at end of file diff --git a/lan/lan_id.json b/lan/lan_id.json index 4bda05a3..323f38cc 100644 --- a/lan/lan_id.json +++ b/lan/lan_id.json @@ -1167,5 +1167,6 @@ "云存会员": "Keanggotaan Cloud Storage", "服务,图像视频信息随心存!": "Informasi layanan, gambar, dan video adalah inti Anda!", "图像": "citra", - "视频": "Video" + "视频": "Video", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Saat ini, negara tersebut tidak mendukung pendaftaran kode verifikasi ponsel, silakan gunakan alamat email Anda untuk mendaftar" } \ No newline at end of file diff --git a/lan/lan_it.json b/lan/lan_it.json index 2c5f1032..34142ceb 100644 --- a/lan/lan_it.json +++ b/lan/lan_it.json @@ -1167,5 +1167,6 @@ "云存会员": "Iscrizione al cloud storage", "服务,图像视频信息随心存!": "Le informazioni sul servizio, le immagini e i video sono al tuo centro!", "图像": "immagine", - "视频": "Video" + "视频": "Video", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Attualmente, il paese non supporta la registrazione del codice di verifica del telefono cellulare, si prega di utilizzare il proprio indirizzo e-mail per registrarsi" } \ No newline at end of file diff --git a/lan/lan_ja.json b/lan/lan_ja.json index 837f8bfc..6900b8ae 100644 --- a/lan/lan_ja.json +++ b/lan/lan_ja.json @@ -1167,5 +1167,6 @@ "云存会员": "クラウドストレージメンバーシップ", "服务,图像视频信息随心存!": "サービス、画像、ビデオ情報があなたの中心にあります!", "图像": "画像", - "视频": "ビデオ" + "视频": "ビデオ", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "現在、この国は携帯電話の認証コード登録をサポートしていませんので、メールアドレスを使用して登録してください" } \ No newline at end of file diff --git a/lan/lan_ka.json b/lan/lan_ka.json index c33bb677..305621fe 100644 --- a/lan/lan_ka.json +++ b/lan/lan_ka.json @@ -1173,5 +1173,6 @@ "云存会员": "Cloud Storage წევრობა", "服务,图像视频信息随心存!": "მომსახურება, სურათი და ვიდეო ინფორმაცია თქვენს გულშია!", "图像": "სურათი", - "视频": "ვიდეო" + "视频": "ვიდეო", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "ამჟამად, ქვეყანა არ უჭერს მხარს მობილური ტელეფონის დამადასტურებელი კოდის რეგისტრაციას, გთხოვთ გამოიყენოთ თქვენი ელექტრონული ფოსტის მისამართი რეგისტრაციისთვის" } \ No newline at end of file diff --git a/lan/lan_keys.json b/lan/lan_keys.json index 2354d911..c544b82c 100755 --- a/lan/lan_keys.json +++ b/lan/lan_keys.json @@ -1178,5 +1178,6 @@ "云存会员": "云存会员", "服务,图像视频信息随心存!": "服务,图像视频信息随心存!", "图像": "图像", - "视频": "视频" + "视频": "视频", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "当前国家不支持手机验证码注册,请使用邮箱进行注册" } diff --git a/lan/lan_kk.json b/lan/lan_kk.json index 17559395..a56d8d3f 100644 --- a/lan/lan_kk.json +++ b/lan/lan_kk.json @@ -1167,5 +1167,6 @@ "云存会员": "Бұлтты сақтауға мүшелік", "服务,图像视频信息随心存!": "Қызмет, бейне және бейне ақпарат сіздің жүрегіңізде жатыр!", "图像": "кескіні", - "视频": "Бейне" + "视频": "Бейне", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Қазіргі уақытта елде ұялы телефонды растау кодын тіркеуді қолдамайды, тіркелу үшін электрондық пошта мекенжайыңызды пайдаланыңыз" } \ No newline at end of file diff --git a/lan/lan_ko.json b/lan/lan_ko.json index 795a95e6..4de6443d 100644 --- a/lan/lan_ko.json +++ b/lan/lan_ko.json @@ -1167,5 +1167,6 @@ "云存会员": "클라우드 스토리지 멤버십", "服务,图像视频信息随心存!": "서비스, 이미지 및 비디오 정보가 당신의 중심에 있습니다!", "图像": "이미지", - "视频": "비디오" + "视频": "비디오", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "현재 해당 국가는 휴대폰 인증코드 등록을 지원하지 않으니 이메일 주소를 사용하여 등록하세요." } \ No newline at end of file diff --git a/lan/lan_lt.json b/lan/lan_lt.json index 01f7613e..abf3dbe1 100644 --- a/lan/lan_lt.json +++ b/lan/lan_lt.json @@ -1167,5 +1167,6 @@ "云存会员": "Debesies saugyklos narystė", "服务,图像视频信息随心存!": "Aptarnavimas, vaizdas ir video informacija yra jūsų širdis!", "图像": "vaizdas", - "视频": "Video" + "视频": "Video", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Šiuo metu šalis nepalaiko mobiliojo telefono patvirtinimo kodo registracijos, registruodamiesi naudokite savo el. pašto adresą" } \ No newline at end of file diff --git a/lan/lan_ms.json b/lan/lan_ms.json index ab4ae836..c5528e7e 100644 --- a/lan/lan_ms.json +++ b/lan/lan_ms.json @@ -1167,5 +1167,6 @@ "云存会员": "Keahlian Storan Awan", "服务,图像视频信息随心存!": "Maklumat perkhidmatan, imej dan video adalah di hati anda!", "图像": "Imej", - "视频": "Video" + "视频": "Video", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Pada masa ini, negara ini tidak menyokong pendaftaran kod pengesahan telefon bimbit, sila gunakan alamat e-mel anda untuk mendaftar" } \ No newline at end of file diff --git a/lan/lan_nl.json b/lan/lan_nl.json index fd04c016..616ca998 100644 --- a/lan/lan_nl.json +++ b/lan/lan_nl.json @@ -1167,5 +1167,6 @@ "云存会员": "Lidmaatschap voor cloudopslag", "服务,图像视频信息随心存!": "Service-, beeld- en video-informatie staan bij u centraal!", "图像": "beeld", - "视频": "Video" + "视频": "Video", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Momenteel ondersteunt het land de registratie van de verificatiecode voor mobiele telefoons niet, gebruik uw e-mailadres om u te registreren" } \ No newline at end of file diff --git a/lan/lan_pl.json b/lan/lan_pl.json index ecf6b824..b790e35a 100644 --- a/lan/lan_pl.json +++ b/lan/lan_pl.json @@ -1167,5 +1167,6 @@ "云存会员": "Członkostwo w usłudze Cloud Storage", "服务,图像视频信息随心存!": "Informacje o serwisie, obrazie i wideo są w Twoim sercu!", "图像": "obraz", - "视频": "Wideo" + "视频": "Wideo", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Obecnie kraj nie obsługuje rejestracji kodem weryfikacyjnym telefonu komórkowego, użyj swojego adresu e-mail, aby się zarejestrować" } \ No newline at end of file diff --git a/lan/lan_pt.json b/lan/lan_pt.json index d2b1aedb..b3a5808f 100644 --- a/lan/lan_pt.json +++ b/lan/lan_pt.json @@ -1167,5 +1167,6 @@ "云存会员": "Associação de armazenamento em nuvem", "服务,图像视频信息随心存!": "Informações de serviço, imagem e vídeo estão no seu coração!", "图像": "imagem", - "视频": "Vídeo" + "视频": "Vídeo", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Atualmente, o país não suporta o registro do código de verificação do telefone celular, use seu endereço de e-mail para se registrar" } \ No newline at end of file diff --git a/lan/lan_pt_br.json b/lan/lan_pt_br.json index 32b8e2d2..5c1df9c3 100644 --- a/lan/lan_pt_br.json +++ b/lan/lan_pt_br.json @@ -1172,5 +1172,6 @@ "云存会员": "Associação de armazenamento em nuvem", "服务,图像视频信息随心存!": "Informações de serviço, imagem e vídeo estão no seu coração!", "图像": "imagem", - "视频": "Vídeo" + "视频": "Vídeo", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Atualmente, o país não suporta o registro do código de verificação do telefone celular, use seu endereço de e-mail para se registrar" } \ No newline at end of file diff --git a/lan/lan_ro.json b/lan/lan_ro.json index 402a6ee5..645d6afd 100644 --- a/lan/lan_ro.json +++ b/lan/lan_ro.json @@ -1167,5 +1167,6 @@ "云存会员": "Abonament de stocare în cloud", "服务,图像视频信息随心存!": "Serviciile, imaginile și informațiile video sunt în centrul dumneavoastră!", "图像": "imagine", - "视频": "Video" + "视频": "Video", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "În prezent, țara nu acceptă înregistrarea codului de verificare a telefonului mobil, vă rugăm să utilizați adresa de e-mail pentru a vă înregistra" } \ No newline at end of file diff --git a/lan/lan_ru.json b/lan/lan_ru.json index 9bcc4697..954bd1e8 100644 --- a/lan/lan_ru.json +++ b/lan/lan_ru.json @@ -1171,5 +1171,6 @@ "云存会员": "Членство в облачном хранилище", "服务,图像视频信息随心存!": "Сервисная, имиджевая и видеоинформация в Вашем сердце!", "图像": "образ", - "视频": "Видео" + "视频": "Видео", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "В настоящее время страна не поддерживает регистрацию кода верификации мобильного телефона, пожалуйста, используйте свой адрес электронной почты для регистрации" } \ No newline at end of file diff --git a/lan/lan_sk.json b/lan/lan_sk.json index c22f98f2..5183748e 100644 --- a/lan/lan_sk.json +++ b/lan/lan_sk.json @@ -1167,5 +1167,6 @@ "云存会员": "Členstvo v cloudovom úložisku", "服务,图像视频信息随心存!": "Informácie o službách, obrázkoch a videách sú vo vašom srdci!", "图像": "obraz", - "视频": "Video" + "视频": "Video", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "V súčasnosti krajina nepodporuje registráciu overovacieho kódu mobilného telefónu, na registráciu použite svoju e-mailovú adresu" } \ No newline at end of file diff --git a/lan/lan_sr_cyrl.json b/lan/lan_sr_cyrl.json index 8bcc737c..739c3599 100644 --- a/lan/lan_sr_cyrl.json +++ b/lan/lan_sr_cyrl.json @@ -1167,5 +1167,6 @@ "云存会员": "Чланство у облаку за складиштење", "服务,图像视频信息随心存!": "Сервис , слике и видео информације су у вашем срцу!", "图像": "Слика", - "视频": "Пријава" + "视频": "Пријава", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Тренутно , земља не подржава регистрацију кода за верификацију мобилног телефона, молимо вас да користите своју адресу е-поште за регистрацију" } \ No newline at end of file diff --git a/lan/lan_sv.json b/lan/lan_sv.json index d7615b5d..03d803c2 100644 --- a/lan/lan_sv.json +++ b/lan/lan_sv.json @@ -1167,5 +1167,6 @@ "云存会员": "Medlemskap i molnlagring", "服务,图像视频信息随心存!": "Service, bild- och videoinformation finns i ditt hjärta!", "图像": "bild", - "视频": "Video" + "视频": "Video", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "För närvarande stöder landet inte registrering av verifieringskoder för mobiltelefoner, använd din e-postadress för att registrera dig" } \ No newline at end of file diff --git a/lan/lan_th.json b/lan/lan_th.json index 27742fae..5c56bdc4 100644 --- a/lan/lan_th.json +++ b/lan/lan_th.json @@ -1167,5 +1167,6 @@ "云存会员": "สมาชิกที่เก็บข้อมูลบนคลาวด์", "服务,图像视频信息随心存!": "ข้อมูลบริการ รูปภาพ และวิดีโออยู่ที่หัวใจของคุณ!", "图像": "ภาพ", - "视频": "วีดิทัศน์" + "视频": "วีดิทัศน์", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "ปัจจุบันประเทศไม่รองรับการลงทะเบียนรหัสยืนยันโทรศัพท์มือถือ โปรดใช้ที่อยู่อีเมลของคุณในการลงทะเบียน" } \ No newline at end of file diff --git a/lan/lan_tr.json b/lan/lan_tr.json index 282336cf..17af286b 100644 --- a/lan/lan_tr.json +++ b/lan/lan_tr.json @@ -1167,5 +1167,6 @@ "云存会员": "Bulut Depolama Üyeliği", "服务,图像视频信息随心存!": "Servis, görüntü ve video bilgileri kalbinizde!", "图像": "resim", - "视频": "Video" + "视频": "Video", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Şu anda ülke cep telefonu doğrulama kodu kaydını desteklememektedir, lütfen kaydolmak için e-posta adresinizi kullanın" } \ No newline at end of file diff --git a/lan/lan_tw.json b/lan/lan_tw.json index 080e369f..950c49b2 100644 --- a/lan/lan_tw.json +++ b/lan/lan_tw.json @@ -1167,5 +1167,6 @@ "云存会员": "雲存會員", "服务,图像视频信息随心存!": "服務,圖像視頻資訊隨心存!", "图像": "圖像", - "视频": "視頻" + "视频": "視頻", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "當前國家不支援手機驗證碼註冊,請使用郵箱進行註冊" } \ No newline at end of file diff --git a/lan/lan_uk.json b/lan/lan_uk.json index 1525c36b..b26c8c87 100644 --- a/lan/lan_uk.json +++ b/lan/lan_uk.json @@ -1167,5 +1167,6 @@ "云存会员": "Членство в хмарних сховищах", "服务,图像视频信息随心存!": "Сервіс, зображення та відео інформація у вашому серці!", "图像": "образ", - "视频": "Відео" + "视频": "Відео", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Наразі країна не підтримує реєстрацію коду підтвердження на мобільному телефоні, будь ласка, використовуйте свою адресу електронної пошти для реєстрації" } \ No newline at end of file diff --git a/lan/lan_ur.json b/lan/lan_ur.json index 8869d9ad..c596af6b 100644 --- a/lan/lan_ur.json +++ b/lan/lan_ur.json @@ -1167,5 +1167,6 @@ "云存会员": "Cloud Storage Membership", "服务,图像视频信息随心存!": "خدمت، تصویر اور ویڈیو کی معلومات آپ کے دل میں ہیں!", "图像": "روپ", - "视频": "ویڈیو" + "视频": "ویڈیو", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "فی الحال، ملک موبائل فون کی توثیقی کوڈ رجسٹریشن کی حمایت نہیں کرتا ہے، براہ کرم رجسٹر کرنے کے لئے اپنا ای میل ایڈریس استعمال کریں" } \ No newline at end of file diff --git a/lan/lan_vi.json b/lan/lan_vi.json index 3dbbf9e3..09204c78 100644 --- a/lan/lan_vi.json +++ b/lan/lan_vi.json @@ -1167,5 +1167,6 @@ "云存会员": "Tư cách thành viên lưu trữ đám mây", "服务,图像视频信息随心存!": "Thông tin dịch vụ, hình ảnh và video là trọng tâm của bạn!", "图像": "ảnh", - "视频": "Video" + "视频": "Video", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "Hiện tại, quốc gia này không hỗ trợ đăng ký mã xác minh điện thoại di động, vui lòng sử dụng địa chỉ email của bạn để đăng ký" } \ No newline at end of file diff --git a/lan/lan_zh.json b/lan/lan_zh.json index 500e6450..6c3dc334 100755 --- a/lan/lan_zh.json +++ b/lan/lan_zh.json @@ -1179,5 +1179,6 @@ "云存会员": "云存会员", "服务,图像视频信息随心存!": "服务,图像视频信息随心存!", "图像": "图像", - "视频": "视频" + "视频": "视频", + "当前国家不支持手机验证码注册,请使用邮箱进行注册": "当前国家不支持手机验证码注册,请使用邮箱进行注册" } \ No newline at end of file From cfde51c06370a7744f45ea0e04dcca69e771daa5 Mon Sep 17 00:00:00 2001 From: liyi Date: Fri, 19 Sep 2025 10:20:23 +0800 Subject: [PATCH 03/37] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E8=AF=AD=E9=9F=B3=E5=8C=85=E5=90=8E=E7=AD=89=E5=BE=85?= =?UTF-8?q?=E5=87=A0=E7=A7=92=E5=90=8E=E5=87=BA=E7=8E=B0=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../speech_language_settings_logic.dart | 110 +++++++----------- .../lock_voice_setting_logic.dart | 106 +++++++---------- 2 files changed, 85 insertions(+), 131 deletions(-) diff --git a/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_logic.dart b/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_logic.dart index 8e22bbb8..f76a2fff 100644 --- a/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_logic.dart +++ b/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_logic.dart @@ -45,8 +45,7 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { @override void onInit() async { super.onInit(); - _replySubscription = - EventBusManager().eventBus!.on().listen((Reply reply) async { + _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) async { if (reply is VoicePackageConfigureReply) { // 语言包配置开始 _handlerStartVoicePackageConfigure(reply); @@ -72,8 +71,7 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { final vendor = state.lockSetInfoData.value.lockBasicInfo?.vendor; final model = state.lockSetInfoData.value.lockBasicInfo?.model; - final PassthroughListResponse entity = - await ApiRepository.to.getPassthroughList(data: { + final PassthroughListResponse entity = await ApiRepository.to.getPassthroughList(data: { 'vendor': vendor!, 'model': model!, }); @@ -110,18 +108,15 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { final passthroughItem = PassthroughItem( lang: element.lang, timbres: element.timbres, - langText: - ExtensionLanguageType.fromLocale(locales[indexOf]).lanTitle, + langText: ExtensionLanguageType.fromLocale(locales[indexOf]).lanTitle, name: element.name, ); state.languages.add(passthroughItem); } }); state.languages.refresh(); - final lang = state - .lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre?.lang; - final timbre = state - .lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre?.timbre; + final lang = state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre?.lang; + final timbre = state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre?.timbre; // 传统 for 循环,直接通过索引访问 for (int i = 0; i < state.languages.length; i++) { final language = state.languages[i]; // 当前元素 @@ -156,8 +151,7 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { // APP层的语言 Locale? currentLocale = Get.locale; // 直接获取最新语言 if (currentLocale != null) { - final indexWhere = state.languages - .indexWhere((element) => element.lang == currentLocale.toString()); + final indexWhere = state.languages.indexWhere((element) => element.lang == currentLocale.toString()); state.selectPassthroughListIndex.value = indexWhere; } } @@ -192,15 +186,11 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { showBlueConnetctToastTimer(action: () { dismissEasyLoading(); }); - BlueManage().blueSendData(BlueManage().connectDeviceName, - (BluetoothConnectionState deviceConnectionState) async { + BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { if (deviceConnectionState == BluetoothConnectionState.connected) { - final List? privateKey = - await Storage.getStringList(saveBluePrivateKey); - final List getPrivateKeyList = - changeStringListToIntList(privateKey!); - final List? signKey = - await Storage.getStringList(saveBlueSignKey); + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? signKey = await Storage.getStringList(saveBlueSignKey); final List signKeyDataList = changeStringListToIntList(signKey!); final String uid = await Storage.getUid() ?? ''; final String md5Str = md5.convert(data).toString().toUpperCase(); @@ -219,8 +209,7 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { privateKey: getPrivateKeyList) .packageData(), ); - } else if (deviceConnectionState == - BluetoothConnectionState.disconnected) { + } else if (deviceConnectionState == BluetoothConnectionState.disconnected) { dismissEasyLoading(); cancelBlueConnetctToastTimer(); } @@ -233,16 +222,14 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { showBlueConnetctToastTimer(action: () { dismissEasyLoading(); }); - BlueManage().blueSendData(BlueManage().connectDeviceName, - (BluetoothConnectionState deviceConnectionState) async { + BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { if (deviceConnectionState == BluetoothConnectionState.connected) { BlueManage().writeCharacteristicWithResponse( GetDeviceModelCommand( lockID: BlueManage().connectDeviceName, ).packageData(), ); - } else if (deviceConnectionState == - BluetoothConnectionState.disconnected) { + } else if (deviceConnectionState == BluetoothConnectionState.disconnected) { dismissEasyLoading(); cancelBlueConnetctToastTimer(); showBlueConnetctToast(); @@ -251,8 +238,7 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { } // 开始配置语音包 - void _handlerStartVoicePackageConfigure( - VoicePackageConfigureReply reply) async { + void _handlerStartVoicePackageConfigure(VoicePackageConfigureReply reply) async { final int status = reply.data[6]; switch (status) { case 0x00: @@ -280,8 +266,7 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { if (state.data == null) return; state.voiceSubcontractingIndex = 0; state.voiceSubcontractingCount = - (state.data!.length + state.voiceSubcontractingSize - 1) ~/ - state.voiceSubcontractingSize; + (state.data!.length + state.voiceSubcontractingSize - 1) ~/ state.voiceSubcontractingSize; state.progress.value = 0.0; // 开始前重置进度 _sendNextPackage(); } @@ -332,8 +317,7 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { Uint8List packageData = state.data!.sublist(start, end); // 更新分包进度 - state.progress.value = - (state.voiceSubcontractingIndex + 1) / state.voiceSubcontractingCount; + state.progress.value = (state.voiceSubcontractingIndex + 1) / state.voiceSubcontractingCount; EasyLoading.showProgress(state.progress.value, status: '正在发送数据 ${(state.progress.value * 100).toStringAsFixed(0)}%'); await _sendLanguageFileBleMessage( @@ -342,8 +326,7 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { ); } - _sendLanguageFileBleMessage( - {required int index, required Uint8List data}) async { + _sendLanguageFileBleMessage({required int index, required Uint8List data}) async { await BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { if (deviceConnectionState == BluetoothConnectionState.connected) { @@ -354,17 +337,15 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { data: data, ).packageData(), ); - } else if (deviceConnectionState == - BluetoothConnectionState.disconnected) { + } else if (deviceConnectionState == BluetoothConnectionState.disconnected) { dismissEasyLoading(); cancelBlueConnetctToastTimer(); - showBlueConnetctToast(); + // showBlueConnetctToast(); } }); } - void _handlerVoicePackageConfigureProcess( - VoicePackageConfigureProcessReply reply) { + void _handlerVoicePackageConfigureProcess(VoicePackageConfigureProcessReply reply) { // 取消超时定时器(已收到回复,无需继续等待) _sendTimeoutTimer?.cancel(); _isTimeout = false; // 重置超时标志 @@ -431,8 +412,7 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { }); } - Future _executeLogic( - VoicePackageConfigureConfirmationReply reply) async { + Future _executeLogic(VoicePackageConfigureConfirmationReply reply) async { await _handlerVoicePackageConfigureConfirmation(reply); } @@ -440,9 +420,12 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { VoicePackageConfigureConfirmationReply reply, ) async { showEasyLoading(); - showBlueConnetctToastTimer(action: () { - dismissEasyLoading(); - }); + showBlueConnetctToastTimer( + action: () { + dismissEasyLoading(); + }, + isShowBlueConnetctToast: false, + ); final LoginEntity entity = await ApiRepository.to.settingCurrentVoiceTimbre( data: { 'lang': state.tempLangStr.value, @@ -452,10 +435,8 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { ); if (entity.errorCode!.codeIsSuccessful) { showSuccess('设置成功'.tr, something: () async { - state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre?.lang = - state.tempLangStr.value; - state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre - ?.timbre = state.tempTimbreStr.value; + state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre?.lang = state.tempLangStr.value; + state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre?.timbre = state.tempTimbreStr.value; await BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { @@ -466,11 +447,10 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { languageCode: state.tempLangStr.value, ).packageData(), ); - } else if (deviceConnectionState == - BluetoothConnectionState.disconnected) { + } else if (deviceConnectionState == BluetoothConnectionState.disconnected) { dismissEasyLoading(); cancelBlueConnetctToastTimer(); - showBlueConnetctToast(); + // showBlueConnetctToast(); } }); await Future.delayed(Duration(seconds: 1)); @@ -491,8 +471,7 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { } } - void handleLockCurrentVoicePacketResult( - ReadLockCurrentVoicePacketReply reply) { + void handleLockCurrentVoicePacketResult(ReadLockCurrentVoicePacketReply reply) { final int status = reply.data[2]; switch (status) { case 0x00: @@ -501,25 +480,21 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { const int languageCodeStartIndex = 3; const int languageCodeLength = 20; - const int languageCodeEndIndex = - languageCodeStartIndex + languageCodeLength; // 23 + const int languageCodeEndIndex = languageCodeStartIndex + languageCodeLength; // 23 if (reply.data.length < languageCodeEndIndex) { throw Exception( 'Reply data is too short to contain LanguageCode. Expected at least $languageCodeEndIndex bytes, got ${reply.data.length}'); } - List languageCodeBytes = - reply.data.sublist(languageCodeStartIndex, languageCodeEndIndex); + List languageCodeBytes = reply.data.sublist(languageCodeStartIndex, languageCodeEndIndex); String languageCode = String.fromCharCodes(languageCodeBytes); languageCode = languageCode.trim(); // 移除首尾空格 - languageCode = - languageCode.replaceAll('\u0000', ''); // 移除空字符 (null bytes) + languageCode = languageCode.replaceAll('\u0000', ''); // 移除空字符 (null bytes) if (languageCode != null && languageCode != '') { - final indexWhere = state.languages - .indexWhere((element) => element.lang == languageCode); + final indexWhere = state.languages.indexWhere((element) => element.lang == languageCode); if (indexWhere != -1) { print('锁板上的语言是:$languageCode,下标是:$indexWhere'); state.selectPassthroughListIndex.value = indexWhere; @@ -541,9 +516,11 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { void readLockLanguage() async { showEasyLoading(); - showBlueConnetctToastTimer(action: () { - dismissEasyLoading(); - }); + showBlueConnetctToastTimer( + isShowBlueConnetctToast: false, + action: () { + dismissEasyLoading(); + }); await BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { if (deviceConnectionState == BluetoothConnectionState.connected) { @@ -552,11 +529,10 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { lockID: BlueManage().connectDeviceName, ).packageData(), ); - } else if (deviceConnectionState == - BluetoothConnectionState.disconnected) { + } else if (deviceConnectionState == BluetoothConnectionState.disconnected) { dismissEasyLoading(); cancelBlueConnetctToastTimer(); - showBlueConnetctToast(); + // showBlueConnetctToast(); } }); } diff --git a/lib/mine/addLock/lock_voice_setting/lock_voice_setting_logic.dart b/lib/mine/addLock/lock_voice_setting/lock_voice_setting_logic.dart index 3adcc054..dbe0c0d2 100644 --- a/lib/mine/addLock/lock_voice_setting/lock_voice_setting_logic.dart +++ b/lib/mine/addLock/lock_voice_setting/lock_voice_setting_logic.dart @@ -43,8 +43,7 @@ class LockVoiceSettingLogic extends BaseGetXController { @override void onInit() async { super.onInit(); - _replySubscription = - EventBusManager().eventBus!.on().listen((Reply reply) async { + _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) async { if (reply is VoicePackageConfigureReply) { // 语言包配置开始 _handlerStartVoicePackageConfigure(reply); @@ -78,12 +77,14 @@ class LockVoiceSettingLogic extends BaseGetXController { }); } - Future _executeLogic( - VoicePackageConfigureConfirmationReply reply) async { + Future _executeLogic(VoicePackageConfigureConfirmationReply reply) async { showEasyLoading(); - showBlueConnetctToastTimer(action: () { - dismissEasyLoading(); - }); + showBlueConnetctToastTimer( + action: () { + dismissEasyLoading(); + }, + isShowBlueConnetctToast: false, + ); final LoginEntity entity = await ApiRepository.to.settingCurrentVoiceTimbre( data: { 'lang': state.tempLangStr.value, @@ -93,10 +94,8 @@ class LockVoiceSettingLogic extends BaseGetXController { ); if (entity.errorCode!.codeIsSuccessful) { showSuccess('设置成功'.tr, something: () async { - state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre?.lang = - state.tempLangStr.value; - state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre - ?.timbre = state.tempTimbreStr.value; + state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre?.lang = state.tempLangStr.value; + state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre?.timbre = state.tempTimbreStr.value; await BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { @@ -107,16 +106,14 @@ class LockVoiceSettingLogic extends BaseGetXController { languageCode: state.tempLangStr.value, ).packageData(), ); - } else if (deviceConnectionState == - BluetoothConnectionState.disconnected) { + } else if (deviceConnectionState == BluetoothConnectionState.disconnected) { dismissEasyLoading(); cancelBlueConnetctToastTimer(); - showBlueConnetctToast(); + // showBlueConnetctToast(); } }); await Future.delayed(Duration(seconds: 1)); - eventBus - .fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); Get.offAllNamed(Routers.starLockMain); }); } @@ -145,8 +142,7 @@ class LockVoiceSettingLogic extends BaseGetXController { // APP层的语言 Locale? currentLocale = Get.locale; // 直接获取最新语言 if (currentLocale != null) { - final indexWhere = state.languages - .indexWhere((element) => element.lang == currentLocale.toString()); + final indexWhere = state.languages.indexWhere((element) => element.lang == currentLocale.toString()); state.selectPassthroughListIndex.value = indexWhere; } } @@ -176,15 +172,11 @@ class LockVoiceSettingLogic extends BaseGetXController { showBlueConnetctToastTimer(action: () { dismissEasyLoading(); }); - BlueManage().blueSendData(BlueManage().connectDeviceName, - (BluetoothConnectionState deviceConnectionState) async { + BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { if (deviceConnectionState == BluetoothConnectionState.connected) { - final List? privateKey = - await Storage.getStringList(saveBluePrivateKey); - final List getPrivateKeyList = - changeStringListToIntList(privateKey!); - final List? signKey = - await Storage.getStringList(saveBlueSignKey); + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? signKey = await Storage.getStringList(saveBlueSignKey); final List signKeyDataList = changeStringListToIntList(signKey!); final String uid = await Storage.getUid() ?? ''; final String md5Str = md5.convert(data).toString().toUpperCase(); @@ -203,8 +195,7 @@ class LockVoiceSettingLogic extends BaseGetXController { privateKey: getPrivateKeyList) .packageData(), ); - } else if (deviceConnectionState == - BluetoothConnectionState.disconnected) { + } else if (deviceConnectionState == BluetoothConnectionState.disconnected) { dismissEasyLoading(); cancelBlueConnetctToastTimer(); @@ -216,8 +207,7 @@ class LockVoiceSettingLogic extends BaseGetXController { }); } - void _handlerVoicePackageConfigureProcess( - VoicePackageConfigureProcessReply reply) { + void _handlerVoicePackageConfigureProcess(VoicePackageConfigureProcessReply reply) { // 取消超时定时器(已收到回复,无需继续等待) _sendTimeoutTimer?.cancel(); _isTimeout = false; // 重置超时标志 @@ -235,8 +225,7 @@ class LockVoiceSettingLogic extends BaseGetXController { } // 开始配置语音包 - void _handlerStartVoicePackageConfigure( - VoicePackageConfigureReply reply) async { + void _handlerStartVoicePackageConfigure(VoicePackageConfigureReply reply) async { final int status = reply.data[6]; switch (status) { case 0x00: @@ -265,8 +254,7 @@ class LockVoiceSettingLogic extends BaseGetXController { final vendor = state.lockSetInfoData.value.lockBasicInfo?.vendor; final model = state.lockSetInfoData.value.lockBasicInfo?.model; - final PassthroughListResponse entity = - await ApiRepository.to.getPassthroughList(data: { + final PassthroughListResponse entity = await ApiRepository.to.getPassthroughList(data: { 'vendor': vendor!, 'model': model!, }); @@ -302,8 +290,7 @@ class LockVoiceSettingLogic extends BaseGetXController { final passthroughItem = PassthroughItem( lang: element.lang, timbres: element.timbres, - langText: - ExtensionLanguageType.fromLocale(locales[indexOf]).lanTitle, + langText: ExtensionLanguageType.fromLocale(locales[indexOf]).lanTitle, name: element.name, ); @@ -311,10 +298,8 @@ class LockVoiceSettingLogic extends BaseGetXController { } }); state.languages.refresh(); - final lang = state - .lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre?.lang; - final timbre = state - .lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre?.timbre; + final lang = state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre?.lang; + final timbre = state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre?.timbre; state.languages.value.forEach((element) { final timbres = element.timbres; timbres.forEach((item) { @@ -335,8 +320,7 @@ class LockVoiceSettingLogic extends BaseGetXController { if (state.data == null) return; state.voiceSubcontractingIndex = 0; state.voiceSubcontractingCount = - (state.data!.length + state.voiceSubcontractingSize - 1) ~/ - state.voiceSubcontractingSize; + (state.data!.length + state.voiceSubcontractingSize - 1) ~/ state.voiceSubcontractingSize; state.progress.value = 0.0; // 开始前重置进度 _sendNextPackage(); } @@ -380,8 +364,7 @@ class LockVoiceSettingLogic extends BaseGetXController { Uint8List packageData = state.data!.sublist(start, end); // 更新分包进度 - state.progress.value = - (state.voiceSubcontractingIndex + 1) / state.voiceSubcontractingCount; + state.progress.value = (state.voiceSubcontractingIndex + 1) / state.voiceSubcontractingCount; EasyLoading.showProgress(state.progress.value, status: '正在发送数据 ${(state.progress.value * 100).toStringAsFixed(0)}%'); _sendLanguageFileBleMessage( @@ -391,8 +374,7 @@ class LockVoiceSettingLogic extends BaseGetXController { } _sendLanguageFileBleMessage({required int index, required Uint8List data}) { - BlueManage().blueSendData(BlueManage().connectDeviceName, - (BluetoothConnectionState deviceConnectionState) async { + BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { if (deviceConnectionState == BluetoothConnectionState.connected) { BlueManage().writeCharacteristicWithResponse( VoicePackageConfigureProcess( @@ -401,8 +383,7 @@ class LockVoiceSettingLogic extends BaseGetXController { data: data, ).packageData(), ); - } else if (deviceConnectionState == - BluetoothConnectionState.disconnected) { + } else if (deviceConnectionState == BluetoothConnectionState.disconnected) { dismissEasyLoading(); cancelBlueConnetctToastTimer(); // showBlueConnetctToast(); @@ -445,9 +426,12 @@ class LockVoiceSettingLogic extends BaseGetXController { void readLockLanguage() async { showEasyLoading(); - showBlueConnetctToastTimer(action: () { - dismissEasyLoading(); - }); + showBlueConnetctToastTimer( + action: () { + dismissEasyLoading(); + }, + isShowBlueConnetctToast: false, + ); await BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { if (deviceConnectionState == BluetoothConnectionState.connected) { @@ -456,17 +440,15 @@ class LockVoiceSettingLogic extends BaseGetXController { lockID: BlueManage().connectDeviceName, ).packageData(), ); - } else if (deviceConnectionState == - BluetoothConnectionState.disconnected) { + } else if (deviceConnectionState == BluetoothConnectionState.disconnected) { dismissEasyLoading(); cancelBlueConnetctToastTimer(); - showBlueConnetctToast(); + // showBlueConnetctToast(); } }); } - void handleLockCurrentVoicePacketResult( - ReadLockCurrentVoicePacketReply reply) { + void handleLockCurrentVoicePacketResult(ReadLockCurrentVoicePacketReply reply) { final int status = reply.data[2]; switch (status) { case 0x00: @@ -475,28 +457,24 @@ class LockVoiceSettingLogic extends BaseGetXController { const int languageCodeStartIndex = 3; const int languageCodeLength = 20; - const int languageCodeEndIndex = - languageCodeStartIndex + languageCodeLength; // 23 + const int languageCodeEndIndex = languageCodeStartIndex + languageCodeLength; // 23 if (reply.data.length < languageCodeEndIndex) { throw Exception( 'Reply data is too short to contain LanguageCode. Expected at least $languageCodeEndIndex bytes, got ${reply.data.length}'); } - List languageCodeBytes = - reply.data.sublist(languageCodeStartIndex, languageCodeEndIndex); + List languageCodeBytes = reply.data.sublist(languageCodeStartIndex, languageCodeEndIndex); String languageCode = String.fromCharCodes(languageCodeBytes); languageCode = languageCode.trim(); // 移除首尾空格 - languageCode = - languageCode.replaceAll('\u0000', ''); // 移除空字符 (null bytes) + languageCode = languageCode.replaceAll('\u0000', ''); // 移除空字符 (null bytes) print('LanguageCode: $languageCode'); // 例如: zh_CN, en_US if (languageCode != null && languageCode != '') { - final indexWhere = state.languages - .indexWhere((element) => element.lang == languageCode); + final indexWhere = state.languages.indexWhere((element) => element.lang == languageCode); if (indexWhere != -1) { print('锁板上的语言是:$languageCode,下标是:$indexWhere'); state.selectPassthroughListIndex.value = indexWhere; From adf1cf3f1c50a52743b381a1004378090a12ba0e Mon Sep 17 00:00:00 2001 From: liyi Date: Fri, 19 Sep 2025 10:20:39 +0800 Subject: [PATCH 04/37] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=B7=B2?= =?UTF-8?q?=E9=85=8D=E5=AF=B9=E7=9A=84=E8=AE=BE=E5=A4=87=E8=BF=98=E8=83=BD?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E5=88=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/blue/blue_manage.dart | 256 +++++++++++++------------------------- 1 file changed, 85 insertions(+), 171 deletions(-) diff --git a/lib/blue/blue_manage.dart b/lib/blue/blue_manage.dart index 398171f6..94fdad02 100755 --- a/lib/blue/blue_manage.dart +++ b/lib/blue/blue_manage.dart @@ -16,8 +16,7 @@ import 'io_type.dart'; import 'reciver_data.dart'; //连接状态回调 -typedef ConnectStateCallBack = Function( - BluetoothConnectionState connectionState); +typedef ConnectStateCallBack = Function(BluetoothConnectionState connectionState); typedef ScanDevicesCallBack = Function(List); class BlueManage { @@ -62,8 +61,7 @@ class BlueManage { ScanResult? scanResult; // 监听蓝牙连接状态 - BluetoothConnectionState? bluetoothConnectionState = - BluetoothConnectionState.disconnected; + BluetoothConnectionState? bluetoothConnectionState = BluetoothConnectionState.disconnected; BluetoothAdapterState? _adapterState = BluetoothAdapterState.on; StreamSubscription? _adapterStateStateSubscription; @@ -103,7 +101,7 @@ class BlueManage { // 先取消之前的订阅,避免重复监听 _mtuSubscription?.cancel(); _mtuSubscription = null; - + _mtuSubscription = bluetoothConnectDevice!.mtu.listen((int value) { _mtuSize = value - 3; AppLog.log('设备MTU变化 - 原始值:$value 计算后MTU:$_mtuSize 设备:${bluetoothConnectDevice?.remoteId.str}'); @@ -111,8 +109,7 @@ class BlueManage { } void _initAdapterStateStateSubscription() { - _adapterStateStateSubscription ??= - FlutterBluePlus.adapterState.listen((BluetoothAdapterState state) { + _adapterStateStateSubscription ??= FlutterBluePlus.adapterState.listen((BluetoothAdapterState state) { AppLog.log('蓝牙状态:$state'); _adapterState = state; }); @@ -122,18 +119,15 @@ class BlueManage { _connectionStateSubscription?.cancel(); _connectionStateSubscription = null; - _connectionStateSubscription = bluetoothConnectDevice!.connectionState - .listen((BluetoothConnectionState state) async { + _connectionStateSubscription = + bluetoothConnectDevice!.connectionState.listen((BluetoothConnectionState state) async { bluetoothConnectionState = state; AppLog.log('蓝牙连接回调状态:$state'); }); } void _initSendStreamSubscription() { - _sendStreamSubscription ??= EventBusManager() - .eventBus! - .on() - .listen((EventSendModel model) { + _sendStreamSubscription ??= EventBusManager().eventBus!.on().listen((EventSendModel model) { AppLog.log('eventBus接收发送数据:${model}'); if (model.sendChannel == DataChannel.ble) { FlutterBluePlus.isSupported.then((bool isAvailable) async { @@ -158,8 +152,7 @@ class BlueManage { } /// 开始指定设备名称的扫描蓝牙设备 - Future startScanSingle(String deviceName, int timeout, - ScanDevicesCallBack scanDevicesCallBack) async { + Future startScanSingle(String deviceName, int timeout, ScanDevicesCallBack scanDevicesCallBack) async { final DateTime start = DateTime.now(); FlutterBluePlus.isSupported.then((bool isAvailable) async { if (isAvailable) { @@ -167,9 +160,7 @@ class BlueManage { if (_adapterState == BluetoothAdapterState.on) { try { BuglyTool.uploadException( - message: '开始指定设备名称的扫描蓝牙设备', - detail: '调用方法是:startScanSingle 指定设备名称是:$deviceName', - upload: false); + message: '开始指定设备名称的扫描蓝牙设备', detail: '调用方法是:startScanSingle 指定设备名称是:$deviceName', upload: false); //android 扫描比较慢,取样只要 3 分之一 final int divisor = Platform.isAndroid ? 3 : 1; FlutterBluePlus.startScan( @@ -181,12 +172,9 @@ class BlueManage { final StreamSubscription> subscription = FlutterBluePlus.scanResults.listen((List results) { final bool isExit = results.any((ScanResult element) => - (element.device.platformName == deviceName) || - (element.advertisementData.advName == deviceName)); - final int milliseconds = DateTime.now().millisecondsSinceEpoch - - start.millisecondsSinceEpoch; - AppLog.log( - '扫描到的设备数:${results.length} 是否查找到 $isExit 以查找$milliseconds毫秒'); + (element.device.platformName == deviceName) || (element.advertisementData.advName == deviceName)); + final int milliseconds = DateTime.now().millisecondsSinceEpoch - start.millisecondsSinceEpoch; + AppLog.log('扫描到的设备数:${results.length} 是否查找到 $isExit 以查找$milliseconds毫秒'); BuglyTool.uploadException( message: '指定设备名称的扫描蓝牙设备 监听扫描结果', detail: @@ -202,20 +190,15 @@ class BlueManage { } final isMatch = _isMatch( - scanResult.advertisementData.serviceUuids - .map((e) => e.uuid) - .toList(), + scanResult.advertisementData.serviceUuids.map((e) => e.uuid).toList(), isSingle: true, ); if (isMatch && (scanResult.rssi >= -100)) { // 查询id相同的元素 - final int knownDeviceIndex = scanDevices.indexWhere( - (ScanResult d) => - (d.device.platformName == - scanResult.device.platformName) || - (d.advertisementData.advName == - scanResult.advertisementData.advName)); + final int knownDeviceIndex = scanDevices.indexWhere((ScanResult d) => + (d.device.platformName == scanResult.device.platformName) || + (d.advertisementData.advName == scanResult.advertisementData.advName)); // 不存在的时候返回-1 if (knownDeviceIndex >= 0) { scanDevices[knownDeviceIndex] = scanResult; @@ -224,8 +207,7 @@ class BlueManage { } BuglyTool.uploadException( message: '遍历扫描到的结果跟缓存的结果对比,如果有最新的就更新缓存', - detail: - 'startScanSingle deviceName:$deviceName 查询到的结果scanResult:$scanResult', + detail: 'startScanSingle deviceName:$deviceName 查询到的结果scanResult:$scanResult', upload: false); } } @@ -234,9 +216,7 @@ class BlueManage { } }, onError: (e) { BuglyTool.uploadException( - message: '指定设备名称的扫描蓝牙设备 监听扫描结果失败', - detail: '打印失败问题 e:${e.toString()}', - upload: false); + message: '指定设备名称的扫描蓝牙设备 监听扫描结果失败', detail: '打印失败问题 e:${e.toString()}', upload: false); AppLog.log('扫描失败:$e'); }); FlutterBluePlus.cancelWhenScanComplete(subscription); @@ -245,9 +225,7 @@ class BlueManage { subscription.cancel(); } catch (e) { BuglyTool.uploadException( - message: '指定设备名称的扫描蓝牙设备 内部逻辑整形失败', - detail: 'tartScanSingle内部逻辑整形失败 e:${e.toString()}', - upload: false); + message: '指定设备名称的扫描蓝牙设备 内部逻辑整形失败', detail: 'tartScanSingle内部逻辑整形失败 e:${e.toString()}', upload: false); AppLog.log('扫描失败'); } } else { @@ -264,8 +242,7 @@ class BlueManage { } /// 开始扫描蓝牙设备 - Future startScan(int timeout, DeviceType deviceType, - ScanDevicesCallBack scanDevicesCallBack, + Future startScan(int timeout, DeviceType deviceType, ScanDevicesCallBack scanDevicesCallBack, {List? idList}) async { FlutterBluePlus.isSupported.then((bool isAvailable) async { if (isAvailable) { @@ -285,21 +262,16 @@ class BlueManage { } final isMatch = _isMatch( - scanResult.advertisementData.serviceUuids - .map((e) => e.uuid) - .toList(), + scanResult.advertisementData.serviceUuids.map((e) => e.uuid).toList(), deviceType: deviceType, isSingle: false, ); // 判断名字为空的直接剔除 if (isMatch && (scanResult.rssi >= -100)) { // 查询id相同的元素 - final int knownDeviceIndex = scanDevices.indexWhere( - (ScanResult d) => - (d.device.platformName == - scanResult.device.platformName) || - (d.advertisementData.advName == - scanResult.advertisementData.advName)); + final int knownDeviceIndex = scanDevices.indexWhere((ScanResult d) => + (d.device.platformName == scanResult.device.platformName) || + (d.advertisementData.advName == scanResult.advertisementData.advName)); // 不存在的时候返回-1 if (knownDeviceIndex >= 0) { scanDevices[knownDeviceIndex] = scanResult; @@ -333,10 +305,8 @@ class BlueManage { } /// 判断是否包含指定的uuid - bool _isMatch(List serviceUuids, - {DeviceType deviceType = DeviceType.blue, required bool isSingle}) { - final List prefixes = - getDeviceType(deviceType).map((e) => e.toLowerCase()).toList(); + bool _isMatch(List serviceUuids, {DeviceType deviceType = DeviceType.blue, required bool isSingle}) { + final List prefixes = getDeviceType(deviceType).map((e) => e.toLowerCase()).toList(); for (String uuid in serviceUuids) { final String cleanUuid = uuid.toLowerCase(); if (cleanUuid.length == 8) { @@ -367,8 +337,7 @@ class BlueManage { } else { // 判断配对状态(带横杠UUID的第31、32位,从1开始计数) if (cleanUuid.length >= 32) { - String pairStatus = - cleanUuid.substring(30, 32); // 第31、32位(从1开始计数) + String pairStatus = cleanUuid.substring(30, 32); // 第31、32位(从1开始计数) // 00=未配对,01=已配对 if (pairStatus == '00') { return true; // 未配对才返回true @@ -386,12 +355,11 @@ class BlueManage { // 判断是否有新事件 bool hasNewEvent = (byte1 == 1); - // 返回是否未配对(原逻辑) - if (isPaired) { - return true; // 已配对返回false + if (!isPaired) { + return true; // 未配对返回true } else { - return false; // 未配对返回true + return false; // 配对返回false } } // 已配对(01)不返回true,继续判断下一个uuid @@ -408,8 +376,7 @@ class BlueManage { } else { // 判断配对状态(带横杠UUID的第31、32位,从1开始计数) if (cleanUuid.length >= 32) { - String pairStatus = - cleanUuid.substring(30, 32); // 第31、32位(从1开始计数) + String pairStatus = cleanUuid.substring(30, 32); // 第31、32位(从1开始计数) // 00=未配对,01=已配对 if (pairStatus == '00') { return true; // 未配对才返回true @@ -427,8 +394,7 @@ class BlueManage { } /// 调用发送数据 List senderData, - Future blueSendData( - String deviceName, ConnectStateCallBack stateCallBack, + Future blueSendData(String deviceName, ConnectStateCallBack stateCallBack, {bool isAddEquipment = false}) async { FlutterBluePlus.isSupported.then((bool isAvailable) async { if (isAvailable) { @@ -438,8 +404,7 @@ class BlueManage { if (bluetoothConnectionState != BluetoothConnectionState.connected) { BuglyTool.uploadException( message: '点击按钮 蓝牙未连接 下一步扫描连接蓝牙', - detail: - 'blueSendData 蓝牙连接状态 bluetoothConnectionState:$bluetoothConnectionState deviceName:$deviceName', + detail: 'blueSendData 蓝牙连接状态 bluetoothConnectionState:$bluetoothConnectionState deviceName:$deviceName', upload: false); _connect(deviceName, (BluetoothConnectionState state) { stateCallBack(bluetoothConnectionState!); @@ -455,8 +420,7 @@ class BlueManage { } else { BuglyTool.uploadException( message: '点击按钮 蓝牙未打开', - detail: - 'blueSendData 蓝牙未打开--_adapterState:${BluetoothAdapterState.on} deviceName:$deviceName', + detail: 'blueSendData 蓝牙未打开--_adapterState:${BluetoothAdapterState.on} deviceName:$deviceName', upload: false); try { stateCallBack(BluetoothConnectionState.disconnected); @@ -465,16 +429,13 @@ class BlueManage { AppLog.log('蓝牙打开失败'); BuglyTool.uploadException( message: '点击按钮 蓝牙未打开 然后蓝牙打开失败', - detail: - 'blueSendData 蓝牙打开失败--_adapterState:${BluetoothAdapterState.on} deviceName:$deviceName', + detail: 'blueSendData 蓝牙打开失败--_adapterState:${BluetoothAdapterState.on} deviceName:$deviceName', upload: false); } } } else { BuglyTool.uploadException( - message: '点击按钮 蓝牙状态不可用', - detail: 'blueSendData 蓝牙状态不可用--isAvailable:$isAvailable', - upload: false); + message: '点击按钮 蓝牙状态不可用', detail: 'blueSendData 蓝牙状态不可用--isAvailable:$isAvailable', upload: false); stateCallBack(BluetoothConnectionState.disconnected); AppLog.log('开始扫描 蓝牙不可用,不能进行蓝牙操作'); } @@ -482,8 +443,7 @@ class BlueManage { } /// 连接 - Future _connect( - String deviceName, ConnectStateCallBack connectStateCallBack, + Future _connect(String deviceName, ConnectStateCallBack connectStateCallBack, {bool isAddEquipment = false}) async { connectDeviceName = deviceName; // 当前已扫描到的缓存设备 @@ -491,16 +451,12 @@ class BlueManage { // 是否有缓存设备 true是有缓存设备 final bool isExistDevice = isExistScanDevices(connectDeviceName); // 是否是当前设备 - final bool isCurrentDevice = - CommonDataManage().currentKeyInfo.lockName == deviceName; + final bool isCurrentDevice = CommonDataManage().currentKeyInfo.lockName == deviceName; // mac地址 final String? mac = CommonDataManage().currentKeyInfo.mac; AppLog.log('开始连接 是否存在缓存:$isExistDevice 是否是当前设备:$isCurrentDevice mac:$mac'); - if (GetPlatform.isAndroid && - !isExistDevice && - isCurrentDevice && - mac != null) { + if (GetPlatform.isAndroid && !isExistDevice && isCurrentDevice && mac != null) { // 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空 BuglyTool.uploadException( message: '开始连接 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空 上传记录当前方法是:_connect', @@ -512,22 +468,17 @@ class BlueManage { try { if (!needScanSingle) { BuglyTool.uploadException( - message: - '开始连接 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空 上传记录当前方法是:_connect', + message: '开始连接 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空 上传记录当前方法是:_connect', detail: '调用方法doNotSearchBLE,直接连接,needScanSingle:$needScanSingle', upload: false); - await doNotSearchBLE(mac, connectStateCallBack, - isAddEquipment: isAddEquipment); + await doNotSearchBLE(mac, connectStateCallBack, isAddEquipment: isAddEquipment); } else { BuglyTool.uploadException( - message: - '开始连接 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空 上传记录当前方法是:_connect', - detail: - '调用方法startScanSingle,执行扫描函数,needScanSingle:$needScanSingle', + message: '开始连接 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空 上传记录当前方法是:_connect', + detail: '调用方法startScanSingle,执行扫描函数,needScanSingle:$needScanSingle', upload: false); startScanSingle(deviceName, 15, (List scanDevices) { - _connectDevice(scanDevices, deviceName, connectStateCallBack, - isAddEquipment: isAddEquipment); + _connectDevice(scanDevices, deviceName, connectStateCallBack, isAddEquipment: isAddEquipment); }); } } catch (e) { @@ -536,8 +487,7 @@ class BlueManage { detail: '调用方法doNotSearchBLE发生异常,执行扫描函数 startScanSingle,异常信息:$e', upload: false); startScanSingle(deviceName, 15, (List scanDevices) { - _connectDevice(scanDevices, deviceName, connectStateCallBack, - isAddEquipment: isAddEquipment); + _connectDevice(scanDevices, deviceName, connectStateCallBack, isAddEquipment: isAddEquipment); }); } // @@ -554,16 +504,13 @@ class BlueManage { } else if (isAddEquipment == false && isExistDevice == false) { // 取消缓存直接使用,存在配对场景设备信息会更变 BuglyTool.uploadException( - message: - '取消缓存直接使用,存在配对场景设备信息会更变 然后开始指定设备名称的扫描蓝牙设备 上传记录当前方法是:_connect', - detail: - '符合条件(isAddEquipment == false && isExistDevice == false) 下一步调用startScanSingle', + message: '取消缓存直接使用,存在配对场景设备信息会更变 然后开始指定设备名称的扫描蓝牙设备 上传记录当前方法是:_connect', + detail: '符合条件(isAddEquipment == false && isExistDevice == false) 下一步调用startScanSingle', upload: false); // AppLog.log('无存在设备需要扫描 deviceName:$deviceName isAddEquipment:$isAddEquipment'); startScanSingle(deviceName, 15, (List scanDevices) { - _connectDevice(scanDevices, deviceName, connectStateCallBack, - isAddEquipment: isAddEquipment); + _connectDevice(scanDevices, deviceName, connectStateCallBack, isAddEquipment: isAddEquipment); }); } else { BuglyTool.uploadException( @@ -572,16 +519,14 @@ class BlueManage { '走这个方法是有缓存或者添加设备的时候以及不符合(GetPlatform.isAndroid && !isExistDevice && isCurrentDevice && mac != null) deviceName:$deviceName 直接调用_connectDevice', upload: false); // AppLog.log('安卓或者iOS 存在设备不需要扫描 deviceName:$deviceName isAddEquipment:$isAddEquipment'); - _connectDevice(devicesList, deviceName, connectStateCallBack, - isAddEquipment: isAddEquipment); + _connectDevice(devicesList, deviceName, connectStateCallBack, isAddEquipment: isAddEquipment); } } //查找缓存里面是否有设备 bool isExistScanDevices(String connectDeviceName) { final bool isExistDevice = scanDevices.any((ScanResult element) => - element.device.platformName == connectDeviceName || - element.advertisementData.advName == connectDeviceName); + element.device.platformName == connectDeviceName || element.advertisementData.advName == connectDeviceName); return isExistDevice; } @@ -595,17 +540,15 @@ class BlueManage { // 判断数组列表里面是否有这个设备 // AppLog.log("devicesList:$devicesList"); - final int knownDeviceIndex = devicesList.indexWhere((ScanResult d) => - (d.device.platformName == deviceName) || - (d.advertisementData.advName == deviceName)); + final int knownDeviceIndex = devicesList.indexWhere( + (ScanResult d) => (d.device.platformName == deviceName) || (d.advertisementData.advName == deviceName)); ScanResult? scanResult; //使用局部变量防止出现缓存 if (knownDeviceIndex >= 0) { // 存在的时候赋值 - connectDeviceMacAddress = - devicesList[knownDeviceIndex].advertisementData.advName.isNotEmpty - ? devicesList[knownDeviceIndex].advertisementData.advName - : devicesList[knownDeviceIndex].device.platformName; + connectDeviceMacAddress = devicesList[knownDeviceIndex].advertisementData.advName.isNotEmpty + ? devicesList[knownDeviceIndex].advertisementData.advName + : devicesList[knownDeviceIndex].device.platformName; bluetoothConnectDevice = devicesList[knownDeviceIndex].device; scanResult = devicesList[knownDeviceIndex]; @@ -616,10 +559,8 @@ class BlueManage { } if (scanResult == null || connectDeviceMacAddress.isEmpty) { BuglyTool.uploadException( - message: - '扫描结果scanResult == null || connectDeviceMacAddress.isEmpty不往下执行 return 上传记录当前方法是:_connectDevice', - detail: - 'scanResult:$scanResult connectDeviceMacAddress:$connectDeviceMacAddress', + message: '扫描结果scanResult == null || connectDeviceMacAddress.isEmpty不往下执行 return 上传记录当前方法是:_connectDevice', + detail: 'scanResult:$scanResult connectDeviceMacAddress:$connectDeviceMacAddress', upload: false); return; } @@ -653,8 +594,7 @@ class BlueManage { BuglyTool.uploadException( message: '提示该锁已被重置, 回调断开连接, 清除缓存,上传记录当前方法是:_connectDevice', - detail: - 'isReconnect:$isReconnect serviceUuids:${scanResult.advertisementData.serviceUuids[0].toString()}', + detail: 'isReconnect:$isReconnect serviceUuids:${scanResult.advertisementData.serviceUuids[0].toString()}', upload: false); } return; @@ -686,8 +626,7 @@ class BlueManage { BuglyTool.uploadException( message: '提示该锁已被重置, 回调断开连接, 清除缓存,上传记录当前方法是:_connectDevice', - detail: - 'isReconnect:$isReconnect serviceUuids:${scanResult.advertisementData.serviceUuids[0].toString()}', + detail: 'isReconnect:$isReconnect serviceUuids:${scanResult.advertisementData.serviceUuids[0].toString()}', upload: false); } return; @@ -704,13 +643,11 @@ class BlueManage { } //直接给蓝牙设备写入 - Future doNotSearchBLE( - String masAdds, ConnectStateCallBack connectStateCallBack, + Future doNotSearchBLE(String masAdds, ConnectStateCallBack connectStateCallBack, {bool isAddEquipment = false}) async { await FlutterBluePlus.stopScan(); - if (bluetoothConnectDevice == null || - bluetoothConnectDevice?.remoteId.str != masAdds) { + if (bluetoothConnectDevice == null || bluetoothConnectDevice?.remoteId.str != masAdds) { bluetoothConnectDevice = BluetoothDevice.fromId(masAdds); _initGetMtuSubscription(); _initListenConnectionState(); @@ -721,18 +658,15 @@ class BlueManage { } else { BuglyTool.uploadException( message: '直接给蓝牙设备写入 上传记录当前方法是:doNotSearchBLE', - detail: - '直接给蓝牙设备写入 用传入的bluetoothConnectDevice:${bluetoothConnectDevice.toString()}连接 masAdds:$masAdds', + detail: '直接给蓝牙设备写入 用传入的bluetoothConnectDevice:${bluetoothConnectDevice.toString()}连接 masAdds:$masAdds', upload: false); } //尝试连接设备 - await bluetoothDeviceConnect(bluetoothConnectDevice!, connectStateCallBack, - isAddEquipment: isAddEquipment); + await bluetoothDeviceConnect(bluetoothConnectDevice!, connectStateCallBack, isAddEquipment: isAddEquipment); } //设备连接 - Future bluetoothDeviceConnect(BluetoothDevice bluetoothConnectDevice, - ConnectStateCallBack connectStateCallBack, + Future bluetoothDeviceConnect(BluetoothDevice bluetoothConnectDevice, ConnectStateCallBack connectStateCallBack, {bool isAddEquipment = false}) async { // 重连三次 const int maxAttempts = 3; @@ -754,8 +688,7 @@ class BlueManage { AppLog.log('$maxAttempts次后尝试连接失败'); BuglyTool.uploadException( message: '连接三次超时断开连接 回调断开连接 上传记录当前方法是:bluetoothDeviceConnect', - detail: - 'bluetoothDeviceConnect:${bluetoothConnectDevice.toString()} $maxAttempts次后尝试连接失败', + detail: 'bluetoothDeviceConnect:${bluetoothConnectDevice.toString()} $maxAttempts次后尝试连接失败', upload: false); needScanSingle = true; connectStateCallBack(BluetoothConnectionState.disconnected); @@ -764,22 +697,18 @@ class BlueManage { if (bluetoothConnectionState == BluetoothConnectionState.connected) { try { needScanSingle = false; - final List services = - await bluetoothConnectDevice.discoverServices(); + final List services = await bluetoothConnectDevice.discoverServices(); //循环判断服务 for (final BluetoothService service in services) { if (service.uuid == _serviceIdConnect) { - for (final BluetoothCharacteristic characteristic - in service.characteristics) { - if (characteristic.characteristicUuid == - _characteristicIdSubscription) { + for (final BluetoothCharacteristic characteristic in service.characteristics) { + if (characteristic.characteristicUuid == _characteristicIdSubscription) { _subScribeToCharacteristic(characteristic); bluetoothConnectionState = BluetoothConnectionState.connected; connectStateCallBack(bluetoothConnectionState!); BuglyTool.uploadException( message: '订阅成功 上传记录当前方法是:bluetoothDeviceConnect', - detail: - '发现服务,连接成功,订阅数据 bluetoothDeviceConnect:${bluetoothConnectDevice.toString()} ', + detail: '发现服务,连接成功,订阅数据 bluetoothDeviceConnect:${bluetoothConnectDevice.toString()} ', upload: false); } else { BuglyTool.uploadException( @@ -801,22 +730,18 @@ class BlueManage { needScanSingle = true; bluetoothConnectionState = BluetoothConnectionState.disconnected; connectStateCallBack(bluetoothConnectionState!); - AppLog.log( - '发现设备时失败 e:$e bluetoothConnectionState:$bluetoothConnectionState'); + AppLog.log('发现设备时失败 e:$e bluetoothConnectionState:$bluetoothConnectionState'); BuglyTool.uploadException( message: '发现服务时失败', - detail: - '发现服务时报错原因e:$e bluetoothDeviceConnect:${bluetoothConnectDevice.toString()}', + detail: '发现服务时报错原因e:$e bluetoothDeviceConnect:${bluetoothConnectDevice.toString()}', upload: false); rethrow; } } } - Future _subScribeToCharacteristic( - BluetoothCharacteristic characteristic) async { - final StreamSubscription> subscription = - characteristic.onValueReceived.listen((List data) { + Future _subScribeToCharacteristic(BluetoothCharacteristic characteristic) async { + final StreamSubscription> subscription = characteristic.onValueReceived.listen((List data) { AppLog.log('订阅获取的数据: $data '); if (data == lastTimeData || data.isEmpty) { return; @@ -864,10 +789,7 @@ class BlueManage { return false; } //239, 1, 238, 2, 是数据包头 - if ((data[0] == 0xEF) && - (data[1] == 0x01) && - (data[2] == 0xEE) && - (data[3] == 0x02)) { + if ((data[0] == 0xEF) && (data[1] == 0x01) && (data[2] == 0xEE) && (data[3] == 0x02)) { return true; } else { return false; @@ -876,12 +798,10 @@ class BlueManage { /// 写入蓝牙特征值,并等待响应 Future writeCharacteristicWithResponse(List value) async { - final List services = - await bluetoothConnectDevice!.discoverServices(); + final List services = await bluetoothConnectDevice!.discoverServices(); for (final BluetoothService service in services) { if (service.uuid == _serviceIdConnect) { - for (final BluetoothCharacteristic characteristic - in service.characteristics) { + for (final BluetoothCharacteristic characteristic in service.characteristics) { if (characteristic.characteristicUuid == _characteristicIdWrite) { try { // 添加重试机制 @@ -900,27 +820,22 @@ class BlueManage { while (!packetSent && retryCount < maxRetries) { try { if (characteristic.properties.writeWithoutResponse) { - await characteristic.write(subData[i], - withoutResponse: true); + await characteristic.write(subData[i], withoutResponse: true); } else if (characteristic.properties.write) { await characteristic.write(subData[i]); } else { // 特性不支持写入 - throw Exception( - 'This characteristic does not support writing.'); + throw Exception('This characteristic does not support writing.'); } // 如果到这里没有异常,则包发送成功 packetSent = true; } catch (e) { - if (e.toString().contains('UNKNOWN_GATT_ERROR (133)') && - retryCount < maxRetries - 1) { + if (e.toString().contains('UNKNOWN_GATT_ERROR (133)') && retryCount < maxRetries - 1) { // GATT错误133,尝试重试 retryCount++; - AppLog.log( - '蓝牙写入失败(GATT 133),数据包 ${i + 1}/${subData.length} 正在重试 $retryCount/$maxRetries...'); - await Future.delayed( - Duration(milliseconds: retryDelayMs)); + AppLog.log('蓝牙写入失败(GATT 133),数据包 ${i + 1}/${subData.length} 正在重试 $retryCount/$maxRetries...'); + await Future.delayed(Duration(milliseconds: retryDelayMs)); continue; } else { // 其他错误或已达到最大重试次数,抛出异常 @@ -931,8 +846,7 @@ class BlueManage { } if (!packetSent) { - throw Exception( - '蓝牙写入失败,数据包 ${i + 1}/${subData.length} 已达到最大重试次数'); + throw Exception('蓝牙写入失败,数据包 ${i + 1}/${subData.length} 已达到最大重试次数'); } } @@ -964,12 +878,12 @@ class BlueManage { Future disconnect() async { try { connectDeviceMacAddress = ''; - + // 清理MTU监听 _mtuSubscription?.cancel(); _mtuSubscription = null; _mtuSize = 20; // 重置MTU为默认值 - + if (bluetoothConnectionState == BluetoothConnectionState.connected) { //加快蓝牙断连 await bluetoothConnectDevice!.disconnect(timeout: 3); @@ -1006,7 +920,7 @@ class BlueManage { _mtuSubscription?.cancel(); _adapterStateStateSubscription?.cancel(); _connectionStateSubscription?.cancel(); - + // 重置状态 _mtuSize = 20; connectDeviceName = ''; From 987fd4770ad89c84c3c37e6f64f48fcf664ccd9e Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 22 Sep 2025 15:01:44 +0800 Subject: [PATCH 05/37] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=E5=BC=80?= =?UTF-8?q?=E9=94=81=E5=9C=A8=E5=90=8C=E6=AD=A5=E6=95=B0=E6=8D=AE=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E4=B9=8B=E5=90=8E=E6=96=AD=E5=BC=80=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/blue/blue_manage.dart | 34 ++++++++----- .../lockDetail/lockDetail_logic.dart | 51 ++++++++++--------- 2 files changed, 47 insertions(+), 38 deletions(-) diff --git a/lib/blue/blue_manage.dart b/lib/blue/blue_manage.dart index 94fdad02..1eecc7cb 100755 --- a/lib/blue/blue_manage.dart +++ b/lib/blue/blue_manage.dart @@ -246,7 +246,7 @@ class BlueManage { {List? idList}) async { FlutterBluePlus.isSupported.then((bool isAvailable) async { if (isAvailable) { - // AppLog.log('startScan 蓝牙状态 系统蓝牙状态:$_adapterState 蓝牙连接状态:$bluetoothConnectionState'); + AppLog.log('startScan 蓝牙状态 系统蓝牙状态:$_adapterState 蓝牙连接状态:$bluetoothConnectionState'); if (_adapterState == BluetoothAdapterState.on) { try { FlutterBluePlus.startScan(timeout: Duration(seconds: timeout)); @@ -255,8 +255,8 @@ class BlueManage { scanDevices.clear(); for (final ScanResult scanResult in results) { if (scanResult.advertisementData.serviceUuids.isNotEmpty) { - // AppLog.log( - // '扫描到的设备:${scanResult.advertisementData.serviceUuids[0].toString()}====${scanResult.advertisementData.advName}'); + AppLog.log( + '扫描到的设备:${scanResult.advertisementData.serviceUuids[0].toString()}====${scanResult.advertisementData.advName}'); } else { continue; } @@ -394,8 +394,11 @@ class BlueManage { } /// 调用发送数据 List senderData, - Future blueSendData(String deviceName, ConnectStateCallBack stateCallBack, - {bool isAddEquipment = false}) async { + Future blueSendData( + String deviceName, + ConnectStateCallBack stateCallBack, { + bool isAddEquipment = false, + }) async { FlutterBluePlus.isSupported.then((bool isAvailable) async { if (isAvailable) { // AppLog.log('蓝牙状态 系统蓝牙状态:$_adapterState 蓝牙连接状态:$bluetoothConnectionState'); @@ -406,9 +409,14 @@ class BlueManage { message: '点击按钮 蓝牙未连接 下一步扫描连接蓝牙', detail: 'blueSendData 蓝牙连接状态 bluetoothConnectionState:$bluetoothConnectionState deviceName:$deviceName', upload: false); - _connect(deviceName, (BluetoothConnectionState state) { - stateCallBack(bluetoothConnectionState!); - }, isAddEquipment: isAddEquipment); + // 连接设备 + _connect( + deviceName, + (BluetoothConnectionState state) { + stateCallBack(bluetoothConnectionState!); + }, + isAddEquipment: isAddEquipment, + ); } else { BuglyTool.uploadException( message: '点击按钮 蓝牙已经连接 下一步扫描连接蓝牙', @@ -673,7 +681,9 @@ class BlueManage { int attempt = 0; while (attempt < maxAttempts) { try { - await bluetoothConnectDevice.connect(timeout: 5.seconds); + await bluetoothConnectDevice.connect( + timeout: 5.seconds, + ); break; // If the connection is successful, break the loop } catch (e) { AppLog.log('连接失败 重连了: $e'); @@ -885,14 +895,12 @@ class BlueManage { _mtuSize = 20; // 重置MTU为默认值 if (bluetoothConnectionState == BluetoothConnectionState.connected) { + AppLog.log('请求断开蓝牙连接'); //加快蓝牙断连 - await bluetoothConnectDevice!.disconnect(timeout: 3); - AppLog.log('断开连接成功'); + await bluetoothConnectDevice!.disconnect(timeout: 1); } } on Exception catch (e, _) { AppLog.log('断开连接失败: $e'); - } finally { - bluetoothConnectionState = BluetoothConnectionState.disconnected; } } diff --git a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart index e122ccf1..42fd92df 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart @@ -165,6 +165,7 @@ class LockDetailLogic extends BaseGetXController { } _handleSynchronizeUploadLockData(); + break; case 0x06: //无权限 @@ -928,28 +929,31 @@ class LockDetailLogic extends BaseGetXController { } void _handleGetLockPasswordData() { - BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { - if (connectionState == BluetoothConnectionState.connected) { - final List? token = await Storage.getStringList(saveBlueToken); - final List getTokenList = changeStringListToIntList(token!); + BlueManage().blueSendData( + BlueManage().connectDeviceName, + (BluetoothConnectionState connectionState) async { + if (connectionState == BluetoothConnectionState.connected) { + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); - final List? privateKey = await Storage.getStringList(saveBluePrivateKey); - final List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); - final List? signKey = await Storage.getStringList(saveBlueSignKey); - final List signKeyDataList = changeStringListToIntList(signKey!); + final List? signKey = await Storage.getStringList(saveBlueSignKey); + final List signKeyDataList = changeStringListToIntList(signKey!); - IoSenderManage.updataLockPasswordListCommand( - lockID: BlueManage().connectDeviceName, - userID: await Storage.getUid(), - page: state.uploadPasswordPage, - countReq: state.countReq, - token: getTokenList, - needAuthor: 1, - signKey: signKeyDataList, - privateKey: getPrivateKeyList); - } - }); + IoSenderManage.updataLockPasswordListCommand( + lockID: BlueManage().connectDeviceName, + userID: await Storage.getUid(), + page: state.uploadPasswordPage, + countReq: state.countReq, + token: getTokenList, + needAuthor: 1, + signKey: signKeyDataList, + privateKey: getPrivateKeyList); + } + }, + ); } // 上传数据获取锁密码列表 @@ -963,7 +967,7 @@ class LockDetailLogic extends BaseGetXController { // 当数据是10的时候继续请求 state.uploadPasswordPage = state.uploadPasswordPage + 1; final List token = reply.data.sublist(3, 7); - showEasyLoading(); + BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected) { final List? privateKey = await Storage.getStringList(saveBluePrivateKey); @@ -1067,7 +1071,6 @@ class LockDetailLogic extends BaseGetXController { final List token = reply.data.sublist(3, 7); - showEasyLoading(); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected) { final List? privateKey = await Storage.getStringList(saveBluePrivateKey); @@ -1171,7 +1174,6 @@ class LockDetailLogic extends BaseGetXController { final List token = reply.data.sublist(3, 7); - showEasyLoading(); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected) { final List? privateKey = await Storage.getStringList(saveBluePrivateKey); @@ -1325,7 +1327,6 @@ class LockDetailLogic extends BaseGetXController { final List token = reply.data.sublist(3, 7); - showEasyLoading(); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected) { final List? privateKey = await Storage.getStringList(saveBluePrivateKey); @@ -1402,7 +1403,6 @@ class LockDetailLogic extends BaseGetXController { final List token = reply.data.sublist(3, 7); - showEasyLoading(); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected) { final List? privateKey = await Storage.getStringList(saveBluePrivateKey); @@ -1479,7 +1479,6 @@ class LockDetailLogic extends BaseGetXController { final List token = reply.data.sublist(3, 7); - showEasyLoading(); BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { if (connectionState == BluetoothConnectionState.connected) { final List? privateKey = await Storage.getStringList(saveBluePrivateKey); @@ -1503,6 +1502,8 @@ class LockDetailLogic extends BaseGetXController { } else { state.indexCount.value = state.indexCount.value + 1; _lockDataUpload(uploadType: 2, recordType: 7, records: state.uploadRemoteControlDataList); + AppLog.log('需要执行断开操作'); + BlueManage().disconnect(); } break; case 0x06: From 766dd8877006fad97226ba6501a1fe9583716358 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 22 Sep 2025 15:27:45 +0800 Subject: [PATCH 06/37] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pubspec.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index 79c06251..c3a01161 100755 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -176,7 +176,7 @@ dependencies: url_launcher: ^6.1.10 #蓝牙 # flutter_reactive_ble: ^5.1.1 - flutter_blue_plus: 1.32.7 + flutter_blue_plus: 1.33.0 # event_bus: ^2.0.0 #菊花 @@ -235,6 +235,7 @@ dependencies: # ffmpeg_kit_flutter: 5.1.0-LTS fast_gbk: ^1.0.0 flutter_pcm_sound: ^1.1.0 + flutter_spinkit: 5.2.1 intl: ^0.18.0 # flutter_audio_capture: <1.1.5 @@ -246,7 +247,7 @@ dependencies: #侧滑删除 flutter_slidable: ^3.0.1 # audio_service: ^0.18.12 - app_settings: ^5.1.1 + app_settings: ^6.1.1 flutter_local_notifications: ^17.0.0 fluwx: 4.5.5 system_settings: ^2.0.0 From 30283fe5131918b9a0270a1d4836181568e1b381 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 22 Sep 2025 15:35:15 +0800 Subject: [PATCH 07/37] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index c3a01161..85b77440 100755 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -235,7 +235,7 @@ dependencies: # ffmpeg_kit_flutter: 5.1.0-LTS fast_gbk: ^1.0.0 flutter_pcm_sound: ^1.1.0 - flutter_spinkit: 5.2.1 + intl: ^0.18.0 # flutter_audio_capture: <1.1.5 From e8b2cf46600a7d2516d972182ce2916be6dfd8ec Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 22 Sep 2025 17:17:00 +0800 Subject: [PATCH 08/37] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d6ee8c02..8d2bf3ad 100755 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ keytool -list -v -keystore android/app/sky.jks ``` 输入密码(在android/app/build.gradle:38可以看到) - +测试ci 一般需要的是:证书指纹-SHA1 看起来像 95:6B:***********(共59个字符) ## 编译 From 31123e503a30df4a12f87b0a90dd0fc4e2164359 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 22 Sep 2025 17:28:58 +0800 Subject: [PATCH 09/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 253 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100644 .gitea/workflows/ci.yml diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml new file mode 100644 index 00000000..0ec3351a --- /dev/null +++ b/.gitea/workflows/ci.yml @@ -0,0 +1,253 @@ +# .gitea/workflows/ci.yml + +name: Flutter CI/CD Pipeline + +# 触发条件 +on: + push: + branches: + - develop_sky + - release_sky + - master_sky + - canary_release_sky + - /^feat_[a-zA-Z]+$/ # 注意:Gitea 不支持正则分支名直接写在 YAML 中,需用 if 判断 + tags: + - v* # 匹配 v1.0.0 等 tag + pull_request: + branches: + - develop_sky + - release_sky + - canary_release_sky + - /^feat_[a-zA-Z]+$/ + +# 全局环境变量 +env: + LC_ALL: en_US.UTF-8 + LANG: en_US.UTF-8 + PUB_HOSTED_URL: https://pub.flutter-io.cn + FLUTTER_STORAGE_BASE_URL: https://storage.flutter-io.cn + +# 所有 job 共用的 runner 标签 +defaults: + run: + shell: bash + +jobs: + # ============ 1. 打印环境信息 ============ + print_env: + name: Print Environment + runs-on: macos,flutter # 必须匹配你 Runner 的 labels + if: | + contains(github.ref, 'develop_sky') || + contains(github.ref, 'release_sky') || + contains(github.ref, 'canary_release_sky') || + startsWith(github.ref, 'refs/heads/feat_') || + startsWith(github.ref, 'refs/tags/v') + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Set up Ruby + run: | + export PATH="/opt/homebrew/bin:$PATH" + eval "$(rbenv init -)" + rbenv global 2.6.10 + ruby -v + which ruby + gem env + + - name: Print Env + run: | + java --version + printenv | sort + + - name: Set NEXT_VERSION from file + run: | + echo "NEXT_VERSION=$(cat app_new.version)" >> $GITHUB_ENV + if: always() && !cancelled() + + # ============ 2. 生成 Git Tag(仅 master_sky) ============ + generate_git_tag: + name: Generate Git Tag + needs: print_env + runs-on: macos,flutter + if: github.branch == 'master_sky' + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Setup SSH & Generate Tag + run: | + bash pre_build.sh sky + project_url=$(echo $CI_GITEA_SERVER_URL | sed 's|http://||') + git remote set-url origin git@gitea.example.com:your-namespace/your-repo.git + bash tag_generator.sh generate_tag + + # ============ 3. 生成下一个版本号 ============ + generate_next_version: + name: Generate Next Version + needs: print_env + runs-on: macos,flutter + if: | + contains(github.ref, 'develop_sky') || + contains(github.ref, 'release_sky') || + contains(github.ref, 'canary_release_sky') || + startsWith(github.ref, 'refs/heads/feat_') + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Generate Version + run: | + bash tag_generator.sh generate_version + id: version_gen + + - name: Save Version for Downstream + run: | + echo "NEXT_VERSION=$(cat app_new.version)" >> $GITHUB_ENV + if: always() + outputs: + next_version: ${{ env.NEXT_VERSION }} + + # ============ 4. 构建 Android ============ + build_android: + name: Build Android APK/AAB + needs: [print_env, generate_next_version] + runs-on: macos,flutter + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Setup Flutter & Fastlane (Android) + run: | + export PATH="/opt/homebrew/bin:$PATH" + eval "$(rbenv init -)" + rbenv global 2.6.10 + bundle config mirror.https://rubygems.org https://mirrors.aliyun.com/rubygems/ + bundle install --gemfile android/Gemfile --path vendor/bundle_android --quiet + flutter clean + flutter pub get + + - name: Build Android + run: | + bash android/build.sh + + - name: Upload Artifacts + uses: actions/upload-artifact@v4 + with: + name: android-artifacts + path: build/app/outputs/flutter-apk/ + + # ============ 5. 构建 iOS ============ + build_ios: + name: Build iOS IPA + needs: [print_env, generate_next_version] + runs-on: macos,flutter + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Setup Flutter & Fastlane (iOS) + run: | + export PATH="/opt/homebrew/bin:$PATH" + eval "$(rbenv init -)" + rbenv global 2.6.10 + bundle config mirror.https://rubygems.org https://mirrors.aliyun.com/rubygems/ + bundle install --gemfile ios/Gemfile --path vendor/bundle_ios --quiet + flutter clean + flutter pub get + + - name: Build iOS + run: | + bash ios/build.sh + + - name: Upload Artifacts + uses: actions/upload-artifact@v4 + with: + name: ios-artifacts + path: build/app/outputs/flutter-ipa/ + + # ============ 6. 发布 Release(仅当打 tag 时) ============ + create_release: + name: Create Release & Upload Assets + needs: [build_android, build_ios] + runs-on: macos,flutter + if: startsWith(github.ref, 'refs/tags/') + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Download Artifacts + uses: actions/download-artifact@v4 + + - name: Generate Release Description + run: | + bash release_description_generator.sh + cat changelog.md + + - name: Upload to Gitea Package Registry & Create Release + env: + STARLOCK_VERSION: ${{ split(github.ref, '/')[2] }} # 提取 tag 名,如 v1.0.0 -> v1.0.0 + run: | + TAG_NAME="${STARLOCK_VERSION}" + VERSION_PART="${TAG_NAME#v}" # 去掉 v 前缀 + + # 上传到 Gitea 通用包(Generic Package) + curl -f -i \ + -H "Authorization: Bearer $CI_GITEA_TOKEN" \ + --upload-file "starlock-sky-release-${TAG_NAME}.apk" \ + "$CI_GITEA_SERVER_URL/api/packages/$GITHUB_REPOSITORY_OWNER/StarLock/$VERSION_PART/starlock-sky-release-${TAG_NAME}.apk" + + curl -f -i \ + -H "Authorization: Bearer $CI_GITEA_TOKEN" \ + --upload-file "starlock-sky-release-${TAG_NAME}.aab" \ + "$CI_GITEA_SERVER_URL/api/packages/$GITHUB_REPOSITORY_OWNER/StarLock/$VERSION_PART/starlock-sky-release-${TAG_NAME}.aab" + + curl -f -i \ + -H "Authorization: Bearer $CI_GITEA_TOKEN" \ + --upload-file "starlock-sky-release-${TAG_NAME}.ipa" \ + "$CI_GITEA_SERVER_URL/api/packages/$GITHUB_REPOSITORY_OWNER/StarLock/$VERSION_PART/starlock-sky-release-${TAG_NAME}.ipa" + + # 创建 Gitea Release(使用 Gitea API) + RELEASE_NOTES="$(cat changelog.md)" + curl -f -i -X POST \ + -H "Authorization: Bearer $CI_GITEA_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "tag_name": "'"$TAG_NAME"'", + "target_commitish": "'"$GITHUB_SHA"'", + "title": "Release '"$TAG_NAME"'", + "note": '"$(printf '%s' "$RELEASE_NOTES" | jq -R -s '.')"', + "is_draft": false, + "is_prerelease": false + }' \ + "$CI_GITEA_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/releases" + + # ============ 7. 通知 ============ + notify_success: + name: Notify on Success + needs: [create_release, build_android, build_ios] + runs-on: macos,flutter + if: success() + steps: + - run: bash notify.sh success + + notify_failure: + name: Notify on Failure + needs: [build_android, build_ios, create_release] + runs-on: macos,flutter + if: failure() + steps: + - run: bash notify.sh failure + + # ============ 8. 清理 ============ + clean_up: + name: Clean Workspace + runs-on: macos,flutter + needs: [notify_success, notify_failure] + if: always() + steps: + - name: Reset Git + run: | + git reset --hard + git clean -fdx \ No newline at end of file From 1b70bd8b9247eaddb99c05585f679c5d6e866689 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 22 Sep 2025 17:33:51 +0800 Subject: [PATCH 10/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 262 +++------------------------------------- 1 file changed, 14 insertions(+), 248 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 0ec3351a..394c8076 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -1,253 +1,19 @@ -# .gitea/workflows/ci.yml - -name: Flutter CI/CD Pipeline - -# 触发条件 -on: - push: - branches: - - develop_sky - - release_sky - - master_sky - - canary_release_sky - - /^feat_[a-zA-Z]+$/ # 注意:Gitea 不支持正则分支名直接写在 YAML 中,需用 if 判断 - tags: - - v* # 匹配 v1.0.0 等 tag - pull_request: - branches: - - develop_sky - - release_sky - - canary_release_sky - - /^feat_[a-zA-Z]+$/ - -# 全局环境变量 -env: - LC_ALL: en_US.UTF-8 - LANG: en_US.UTF-8 - PUB_HOSTED_URL: https://pub.flutter-io.cn - FLUTTER_STORAGE_BASE_URL: https://storage.flutter-io.cn - -# 所有 job 共用的 runner 标签 -defaults: - run: - shell: bash +name: Gitea Actions Demo +run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀 +on: [push] jobs: - # ============ 1. 打印环境信息 ============ - print_env: - name: Print Environment - runs-on: macos,flutter # 必须匹配你 Runner 的 labels - if: | - contains(github.ref, 'develop_sky') || - contains(github.ref, 'release_sky') || - contains(github.ref, 'canary_release_sky') || - startsWith(github.ref, 'refs/heads/feat_') || - startsWith(github.ref, 'refs/tags/v') + Explore-Gitea-Actions: + runs-on: ubuntu-latest steps: - - name: Checkout Code + - run: echo "🎉 The job was automatically triggered by a ${{ gitea.event_name }} event." + - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by Gitea!" + - run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}." + - name: Check out repository code uses: actions/checkout@v4 - - - name: Set up Ruby + - run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner." + - run: echo "🖥️ The workflow is now ready to test your code on the runner." + - name: List files in the repository run: | - export PATH="/opt/homebrew/bin:$PATH" - eval "$(rbenv init -)" - rbenv global 2.6.10 - ruby -v - which ruby - gem env - - - name: Print Env - run: | - java --version - printenv | sort - - - name: Set NEXT_VERSION from file - run: | - echo "NEXT_VERSION=$(cat app_new.version)" >> $GITHUB_ENV - if: always() && !cancelled() - - # ============ 2. 生成 Git Tag(仅 master_sky) ============ - generate_git_tag: - name: Generate Git Tag - needs: print_env - runs-on: macos,flutter - if: github.branch == 'master_sky' - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Setup SSH & Generate Tag - run: | - bash pre_build.sh sky - project_url=$(echo $CI_GITEA_SERVER_URL | sed 's|http://||') - git remote set-url origin git@gitea.example.com:your-namespace/your-repo.git - bash tag_generator.sh generate_tag - - # ============ 3. 生成下一个版本号 ============ - generate_next_version: - name: Generate Next Version - needs: print_env - runs-on: macos,flutter - if: | - contains(github.ref, 'develop_sky') || - contains(github.ref, 'release_sky') || - contains(github.ref, 'canary_release_sky') || - startsWith(github.ref, 'refs/heads/feat_') - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Generate Version - run: | - bash tag_generator.sh generate_version - id: version_gen - - - name: Save Version for Downstream - run: | - echo "NEXT_VERSION=$(cat app_new.version)" >> $GITHUB_ENV - if: always() - outputs: - next_version: ${{ env.NEXT_VERSION }} - - # ============ 4. 构建 Android ============ - build_android: - name: Build Android APK/AAB - needs: [print_env, generate_next_version] - runs-on: macos,flutter - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Setup Flutter & Fastlane (Android) - run: | - export PATH="/opt/homebrew/bin:$PATH" - eval "$(rbenv init -)" - rbenv global 2.6.10 - bundle config mirror.https://rubygems.org https://mirrors.aliyun.com/rubygems/ - bundle install --gemfile android/Gemfile --path vendor/bundle_android --quiet - flutter clean - flutter pub get - - - name: Build Android - run: | - bash android/build.sh - - - name: Upload Artifacts - uses: actions/upload-artifact@v4 - with: - name: android-artifacts - path: build/app/outputs/flutter-apk/ - - # ============ 5. 构建 iOS ============ - build_ios: - name: Build iOS IPA - needs: [print_env, generate_next_version] - runs-on: macos,flutter - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Setup Flutter & Fastlane (iOS) - run: | - export PATH="/opt/homebrew/bin:$PATH" - eval "$(rbenv init -)" - rbenv global 2.6.10 - bundle config mirror.https://rubygems.org https://mirrors.aliyun.com/rubygems/ - bundle install --gemfile ios/Gemfile --path vendor/bundle_ios --quiet - flutter clean - flutter pub get - - - name: Build iOS - run: | - bash ios/build.sh - - - name: Upload Artifacts - uses: actions/upload-artifact@v4 - with: - name: ios-artifacts - path: build/app/outputs/flutter-ipa/ - - # ============ 6. 发布 Release(仅当打 tag 时) ============ - create_release: - name: Create Release & Upload Assets - needs: [build_android, build_ios] - runs-on: macos,flutter - if: startsWith(github.ref, 'refs/tags/') - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Download Artifacts - uses: actions/download-artifact@v4 - - - name: Generate Release Description - run: | - bash release_description_generator.sh - cat changelog.md - - - name: Upload to Gitea Package Registry & Create Release - env: - STARLOCK_VERSION: ${{ split(github.ref, '/')[2] }} # 提取 tag 名,如 v1.0.0 -> v1.0.0 - run: | - TAG_NAME="${STARLOCK_VERSION}" - VERSION_PART="${TAG_NAME#v}" # 去掉 v 前缀 - - # 上传到 Gitea 通用包(Generic Package) - curl -f -i \ - -H "Authorization: Bearer $CI_GITEA_TOKEN" \ - --upload-file "starlock-sky-release-${TAG_NAME}.apk" \ - "$CI_GITEA_SERVER_URL/api/packages/$GITHUB_REPOSITORY_OWNER/StarLock/$VERSION_PART/starlock-sky-release-${TAG_NAME}.apk" - - curl -f -i \ - -H "Authorization: Bearer $CI_GITEA_TOKEN" \ - --upload-file "starlock-sky-release-${TAG_NAME}.aab" \ - "$CI_GITEA_SERVER_URL/api/packages/$GITHUB_REPOSITORY_OWNER/StarLock/$VERSION_PART/starlock-sky-release-${TAG_NAME}.aab" - - curl -f -i \ - -H "Authorization: Bearer $CI_GITEA_TOKEN" \ - --upload-file "starlock-sky-release-${TAG_NAME}.ipa" \ - "$CI_GITEA_SERVER_URL/api/packages/$GITHUB_REPOSITORY_OWNER/StarLock/$VERSION_PART/starlock-sky-release-${TAG_NAME}.ipa" - - # 创建 Gitea Release(使用 Gitea API) - RELEASE_NOTES="$(cat changelog.md)" - curl -f -i -X POST \ - -H "Authorization: Bearer $CI_GITEA_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "tag_name": "'"$TAG_NAME"'", - "target_commitish": "'"$GITHUB_SHA"'", - "title": "Release '"$TAG_NAME"'", - "note": '"$(printf '%s' "$RELEASE_NOTES" | jq -R -s '.')"', - "is_draft": false, - "is_prerelease": false - }' \ - "$CI_GITEA_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/releases" - - # ============ 7. 通知 ============ - notify_success: - name: Notify on Success - needs: [create_release, build_android, build_ios] - runs-on: macos,flutter - if: success() - steps: - - run: bash notify.sh success - - notify_failure: - name: Notify on Failure - needs: [build_android, build_ios, create_release] - runs-on: macos,flutter - if: failure() - steps: - - run: bash notify.sh failure - - # ============ 8. 清理 ============ - clean_up: - name: Clean Workspace - runs-on: macos,flutter - needs: [notify_success, notify_failure] - if: always() - steps: - - name: Reset Git - run: | - git reset --hard - git clean -fdx \ No newline at end of file + ls ${{ gitea.workspace }} + - run: echo "🍏 This job's status is ${{ job.status }}." \ No newline at end of file From 725ef31640c1cc32201f0057b60935d0425fae96 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 22 Sep 2025 17:38:39 +0800 Subject: [PATCH 11/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 394c8076..f78b7449 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -4,7 +4,7 @@ on: [push] jobs: Explore-Gitea-Actions: - runs-on: ubuntu-latest + runs-on: flutter steps: - run: echo "🎉 The job was automatically triggered by a ${{ gitea.event_name }} event." - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by Gitea!" From a8cc945d61bb64176a6b72821d19269267658801 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 22 Sep 2025 17:46:41 +0800 Subject: [PATCH 12/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 262 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 248 insertions(+), 14 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index f78b7449..0ec3351a 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -1,19 +1,253 @@ -name: Gitea Actions Demo -run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀 -on: [push] +# .gitea/workflows/ci.yml + +name: Flutter CI/CD Pipeline + +# 触发条件 +on: + push: + branches: + - develop_sky + - release_sky + - master_sky + - canary_release_sky + - /^feat_[a-zA-Z]+$/ # 注意:Gitea 不支持正则分支名直接写在 YAML 中,需用 if 判断 + tags: + - v* # 匹配 v1.0.0 等 tag + pull_request: + branches: + - develop_sky + - release_sky + - canary_release_sky + - /^feat_[a-zA-Z]+$/ + +# 全局环境变量 +env: + LC_ALL: en_US.UTF-8 + LANG: en_US.UTF-8 + PUB_HOSTED_URL: https://pub.flutter-io.cn + FLUTTER_STORAGE_BASE_URL: https://storage.flutter-io.cn + +# 所有 job 共用的 runner 标签 +defaults: + run: + shell: bash jobs: - Explore-Gitea-Actions: - runs-on: flutter + # ============ 1. 打印环境信息 ============ + print_env: + name: Print Environment + runs-on: macos,flutter # 必须匹配你 Runner 的 labels + if: | + contains(github.ref, 'develop_sky') || + contains(github.ref, 'release_sky') || + contains(github.ref, 'canary_release_sky') || + startsWith(github.ref, 'refs/heads/feat_') || + startsWith(github.ref, 'refs/tags/v') steps: - - run: echo "🎉 The job was automatically triggered by a ${{ gitea.event_name }} event." - - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by Gitea!" - - run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}." - - name: Check out repository code + - name: Checkout Code uses: actions/checkout@v4 - - run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner." - - run: echo "🖥️ The workflow is now ready to test your code on the runner." - - name: List files in the repository + + - name: Set up Ruby run: | - ls ${{ gitea.workspace }} - - run: echo "🍏 This job's status is ${{ job.status }}." \ No newline at end of file + export PATH="/opt/homebrew/bin:$PATH" + eval "$(rbenv init -)" + rbenv global 2.6.10 + ruby -v + which ruby + gem env + + - name: Print Env + run: | + java --version + printenv | sort + + - name: Set NEXT_VERSION from file + run: | + echo "NEXT_VERSION=$(cat app_new.version)" >> $GITHUB_ENV + if: always() && !cancelled() + + # ============ 2. 生成 Git Tag(仅 master_sky) ============ + generate_git_tag: + name: Generate Git Tag + needs: print_env + runs-on: macos,flutter + if: github.branch == 'master_sky' + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Setup SSH & Generate Tag + run: | + bash pre_build.sh sky + project_url=$(echo $CI_GITEA_SERVER_URL | sed 's|http://||') + git remote set-url origin git@gitea.example.com:your-namespace/your-repo.git + bash tag_generator.sh generate_tag + + # ============ 3. 生成下一个版本号 ============ + generate_next_version: + name: Generate Next Version + needs: print_env + runs-on: macos,flutter + if: | + contains(github.ref, 'develop_sky') || + contains(github.ref, 'release_sky') || + contains(github.ref, 'canary_release_sky') || + startsWith(github.ref, 'refs/heads/feat_') + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Generate Version + run: | + bash tag_generator.sh generate_version + id: version_gen + + - name: Save Version for Downstream + run: | + echo "NEXT_VERSION=$(cat app_new.version)" >> $GITHUB_ENV + if: always() + outputs: + next_version: ${{ env.NEXT_VERSION }} + + # ============ 4. 构建 Android ============ + build_android: + name: Build Android APK/AAB + needs: [print_env, generate_next_version] + runs-on: macos,flutter + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Setup Flutter & Fastlane (Android) + run: | + export PATH="/opt/homebrew/bin:$PATH" + eval "$(rbenv init -)" + rbenv global 2.6.10 + bundle config mirror.https://rubygems.org https://mirrors.aliyun.com/rubygems/ + bundle install --gemfile android/Gemfile --path vendor/bundle_android --quiet + flutter clean + flutter pub get + + - name: Build Android + run: | + bash android/build.sh + + - name: Upload Artifacts + uses: actions/upload-artifact@v4 + with: + name: android-artifacts + path: build/app/outputs/flutter-apk/ + + # ============ 5. 构建 iOS ============ + build_ios: + name: Build iOS IPA + needs: [print_env, generate_next_version] + runs-on: macos,flutter + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Setup Flutter & Fastlane (iOS) + run: | + export PATH="/opt/homebrew/bin:$PATH" + eval "$(rbenv init -)" + rbenv global 2.6.10 + bundle config mirror.https://rubygems.org https://mirrors.aliyun.com/rubygems/ + bundle install --gemfile ios/Gemfile --path vendor/bundle_ios --quiet + flutter clean + flutter pub get + + - name: Build iOS + run: | + bash ios/build.sh + + - name: Upload Artifacts + uses: actions/upload-artifact@v4 + with: + name: ios-artifacts + path: build/app/outputs/flutter-ipa/ + + # ============ 6. 发布 Release(仅当打 tag 时) ============ + create_release: + name: Create Release & Upload Assets + needs: [build_android, build_ios] + runs-on: macos,flutter + if: startsWith(github.ref, 'refs/tags/') + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Download Artifacts + uses: actions/download-artifact@v4 + + - name: Generate Release Description + run: | + bash release_description_generator.sh + cat changelog.md + + - name: Upload to Gitea Package Registry & Create Release + env: + STARLOCK_VERSION: ${{ split(github.ref, '/')[2] }} # 提取 tag 名,如 v1.0.0 -> v1.0.0 + run: | + TAG_NAME="${STARLOCK_VERSION}" + VERSION_PART="${TAG_NAME#v}" # 去掉 v 前缀 + + # 上传到 Gitea 通用包(Generic Package) + curl -f -i \ + -H "Authorization: Bearer $CI_GITEA_TOKEN" \ + --upload-file "starlock-sky-release-${TAG_NAME}.apk" \ + "$CI_GITEA_SERVER_URL/api/packages/$GITHUB_REPOSITORY_OWNER/StarLock/$VERSION_PART/starlock-sky-release-${TAG_NAME}.apk" + + curl -f -i \ + -H "Authorization: Bearer $CI_GITEA_TOKEN" \ + --upload-file "starlock-sky-release-${TAG_NAME}.aab" \ + "$CI_GITEA_SERVER_URL/api/packages/$GITHUB_REPOSITORY_OWNER/StarLock/$VERSION_PART/starlock-sky-release-${TAG_NAME}.aab" + + curl -f -i \ + -H "Authorization: Bearer $CI_GITEA_TOKEN" \ + --upload-file "starlock-sky-release-${TAG_NAME}.ipa" \ + "$CI_GITEA_SERVER_URL/api/packages/$GITHUB_REPOSITORY_OWNER/StarLock/$VERSION_PART/starlock-sky-release-${TAG_NAME}.ipa" + + # 创建 Gitea Release(使用 Gitea API) + RELEASE_NOTES="$(cat changelog.md)" + curl -f -i -X POST \ + -H "Authorization: Bearer $CI_GITEA_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "tag_name": "'"$TAG_NAME"'", + "target_commitish": "'"$GITHUB_SHA"'", + "title": "Release '"$TAG_NAME"'", + "note": '"$(printf '%s' "$RELEASE_NOTES" | jq -R -s '.')"', + "is_draft": false, + "is_prerelease": false + }' \ + "$CI_GITEA_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/releases" + + # ============ 7. 通知 ============ + notify_success: + name: Notify on Success + needs: [create_release, build_android, build_ios] + runs-on: macos,flutter + if: success() + steps: + - run: bash notify.sh success + + notify_failure: + name: Notify on Failure + needs: [build_android, build_ios, create_release] + runs-on: macos,flutter + if: failure() + steps: + - run: bash notify.sh failure + + # ============ 8. 清理 ============ + clean_up: + name: Clean Workspace + runs-on: macos,flutter + needs: [notify_success, notify_failure] + if: always() + steps: + - name: Reset Git + run: | + git reset --hard + git clean -fdx \ No newline at end of file From 4cbaa925935e01b01ad0d88ed753db02831f2ef5 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 22 Sep 2025 18:03:43 +0800 Subject: [PATCH 13/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 268 +++++----------------------------------- 1 file changed, 34 insertions(+), 234 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 0ec3351a..5620a055 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -1,253 +1,53 @@ -# .gitea/workflows/ci.yml +# .gitea/workflows/flutter-ci.yml +name: Flutter CI - Develop Sky -name: Flutter CI/CD Pipeline - -# 触发条件 +# 触发条件:仅当推送到 develop_sky 分支时 on: push: branches: - develop_sky - - release_sky - - master_sky - - canary_release_sky - - /^feat_[a-zA-Z]+$/ # 注意:Gitea 不支持正则分支名直接写在 YAML 中,需用 if 判断 - tags: - - v* # 匹配 v1.0.0 等 tag - pull_request: - branches: - - develop_sky - - release_sky - - canary_release_sky - - /^feat_[a-zA-Z]+$/ - -# 全局环境变量 -env: - LC_ALL: en_US.UTF-8 - LANG: en_US.UTF-8 - PUB_HOSTED_URL: https://pub.flutter-io.cn - FLUTTER_STORAGE_BASE_URL: https://storage.flutter-io.cn - -# 所有 job 共用的 runner 标签 -defaults: - run: - shell: bash jobs: - # ============ 1. 打印环境信息 ============ - print_env: - name: Print Environment - runs-on: macos,flutter # 必须匹配你 Runner 的 labels - if: | - contains(github.ref, 'develop_sky') || - contains(github.ref, 'release_sky') || - contains(github.ref, 'canary_release_sky') || - startsWith(github.ref, 'refs/heads/feat_') || - startsWith(github.ref, 'refs/tags/v') - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Set up Ruby - run: | - export PATH="/opt/homebrew/bin:$PATH" - eval "$(rbenv init -)" - rbenv global 2.6.10 - ruby -v - which ruby - gem env - - - name: Print Env - run: | - java --version - printenv | sort - - - name: Set NEXT_VERSION from file - run: | - echo "NEXT_VERSION=$(cat app_new.version)" >> $GITHUB_ENV - if: always() && !cancelled() - - # ============ 2. 生成 Git Tag(仅 master_sky) ============ - generate_git_tag: - name: Generate Git Tag - needs: print_env + build: + name: Build iOS & Android + # 使用你之前配置的标签 runs-on: macos,flutter - if: github.branch == 'master_sky' + steps: + # 1. 检出代码 - name: Checkout Code uses: actions/checkout@v4 - - name: Setup SSH & Generate Tag + # 2. 获取 Flutter 依赖 + - name: Setup Flutter run: | - bash pre_build.sh sky - project_url=$(echo $CI_GITEA_SERVER_URL | sed 's|http://||') - git remote set-url origin git@gitea.example.com:your-namespace/your-repo.git - bash tag_generator.sh generate_tag - - # ============ 3. 生成下一个版本号 ============ - generate_next_version: - name: Generate Next Version - needs: print_env - runs-on: macos,flutter - if: | - contains(github.ref, 'develop_sky') || - contains(github.ref, 'release_sky') || - contains(github.ref, 'canary_release_sky') || - startsWith(github.ref, 'refs/heads/feat_') - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Generate Version - run: | - bash tag_generator.sh generate_version - id: version_gen - - - name: Save Version for Downstream - run: | - echo "NEXT_VERSION=$(cat app_new.version)" >> $GITHUB_ENV - if: always() - outputs: - next_version: ${{ env.NEXT_VERSION }} - - # ============ 4. 构建 Android ============ - build_android: - name: Build Android APK/AAB - needs: [print_env, generate_next_version] - runs-on: macos,flutter - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Setup Flutter & Fastlane (Android) - run: | - export PATH="/opt/homebrew/bin:$PATH" - eval "$(rbenv init -)" - rbenv global 2.6.10 - bundle config mirror.https://rubygems.org https://mirrors.aliyun.com/rubygems/ - bundle install --gemfile android/Gemfile --path vendor/bundle_android --quiet - flutter clean + flutter --version flutter pub get - - name: Build Android - run: | - bash android/build.sh + # 3. 运行测试(可选,但推荐) + - name: Run Tests + run: flutter test + # 4. 分析代码(可选) + - name: Analyze Code + run: flutter analyze + + # 5. 构建 iOS IPA + - name: Build iOS (IPA) + run: flutter build ipa --release --export-method ad-hoc + + # 6. 构建 Android APK 和 AAB + - name: Build Android (APK & AAB) + run: | + flutter build apk --release + flutter build appbundle --release + + # 7. 上传所有构建产物 - name: Upload Artifacts uses: actions/upload-artifact@v4 with: - name: android-artifacts - path: build/app/outputs/flutter-apk/ - - # ============ 5. 构建 iOS ============ - build_ios: - name: Build iOS IPA - needs: [print_env, generate_next_version] - runs-on: macos,flutter - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Setup Flutter & Fastlane (iOS) - run: | - export PATH="/opt/homebrew/bin:$PATH" - eval "$(rbenv init -)" - rbenv global 2.6.10 - bundle config mirror.https://rubygems.org https://mirrors.aliyun.com/rubygems/ - bundle install --gemfile ios/Gemfile --path vendor/bundle_ios --quiet - flutter clean - flutter pub get - - - name: Build iOS - run: | - bash ios/build.sh - - - name: Upload Artifacts - uses: actions/upload-artifact@v4 - with: - name: ios-artifacts - path: build/app/outputs/flutter-ipa/ - - # ============ 6. 发布 Release(仅当打 tag 时) ============ - create_release: - name: Create Release & Upload Assets - needs: [build_android, build_ios] - runs-on: macos,flutter - if: startsWith(github.ref, 'refs/tags/') - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Download Artifacts - uses: actions/download-artifact@v4 - - - name: Generate Release Description - run: | - bash release_description_generator.sh - cat changelog.md - - - name: Upload to Gitea Package Registry & Create Release - env: - STARLOCK_VERSION: ${{ split(github.ref, '/')[2] }} # 提取 tag 名,如 v1.0.0 -> v1.0.0 - run: | - TAG_NAME="${STARLOCK_VERSION}" - VERSION_PART="${TAG_NAME#v}" # 去掉 v 前缀 - - # 上传到 Gitea 通用包(Generic Package) - curl -f -i \ - -H "Authorization: Bearer $CI_GITEA_TOKEN" \ - --upload-file "starlock-sky-release-${TAG_NAME}.apk" \ - "$CI_GITEA_SERVER_URL/api/packages/$GITHUB_REPOSITORY_OWNER/StarLock/$VERSION_PART/starlock-sky-release-${TAG_NAME}.apk" - - curl -f -i \ - -H "Authorization: Bearer $CI_GITEA_TOKEN" \ - --upload-file "starlock-sky-release-${TAG_NAME}.aab" \ - "$CI_GITEA_SERVER_URL/api/packages/$GITHUB_REPOSITORY_OWNER/StarLock/$VERSION_PART/starlock-sky-release-${TAG_NAME}.aab" - - curl -f -i \ - -H "Authorization: Bearer $CI_GITEA_TOKEN" \ - --upload-file "starlock-sky-release-${TAG_NAME}.ipa" \ - "$CI_GITEA_SERVER_URL/api/packages/$GITHUB_REPOSITORY_OWNER/StarLock/$VERSION_PART/starlock-sky-release-${TAG_NAME}.ipa" - - # 创建 Gitea Release(使用 Gitea API) - RELEASE_NOTES="$(cat changelog.md)" - curl -f -i -X POST \ - -H "Authorization: Bearer $CI_GITEA_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "tag_name": "'"$TAG_NAME"'", - "target_commitish": "'"$GITHUB_SHA"'", - "title": "Release '"$TAG_NAME"'", - "note": '"$(printf '%s' "$RELEASE_NOTES" | jq -R -s '.')"', - "is_draft": false, - "is_prerelease": false - }' \ - "$CI_GITEA_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/releases" - - # ============ 7. 通知 ============ - notify_success: - name: Notify on Success - needs: [create_release, build_android, build_ios] - runs-on: macos,flutter - if: success() - steps: - - run: bash notify.sh success - - notify_failure: - name: Notify on Failure - needs: [build_android, build_ios, create_release] - runs-on: macos,flutter - if: failure() - steps: - - run: bash notify.sh failure - - # ============ 8. 清理 ============ - clean_up: - name: Clean Workspace - runs-on: macos,flutter - needs: [notify_success, notify_failure] - if: always() - steps: - - name: Reset Git - run: | - git reset --hard - git clean -fdx \ No newline at end of file + name: flutter-builds + path: | + build/app/outputs/flutter-apk/ + build/app/outputs/bundle/ + build/ios/ipa/ \ No newline at end of file From 004a0b89a909dbe3eb5e44297125b7c253ed7fdd Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 22 Sep 2025 18:07:29 +0800 Subject: [PATCH 14/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 5620a055..22075be7 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -11,7 +11,7 @@ jobs: build: name: Build iOS & Android # 使用你之前配置的标签 - runs-on: macos,flutter + runs-on: sky,flutter steps: # 1. 检出代码 From 73548e45b60e3f93532d48bf7c2be96e01ebe899 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 22 Sep 2025 18:23:59 +0800 Subject: [PATCH 15/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 62 ++++++++++------------------------------- 1 file changed, 14 insertions(+), 48 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 22075be7..095220b4 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -1,53 +1,19 @@ -# .gitea/workflows/flutter-ci.yml -name: Flutter CI - Develop Sky - -# 触发条件:仅当推送到 develop_sky 分支时 -on: - push: - branches: - - develop_sky +name: Gitea Actions Demo +run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀 +on: [push] jobs: - build: - name: Build iOS & Android - # 使用你之前配置的标签 - runs-on: sky,flutter - + Explore-Gitea-Actions: + runs-on: sky steps: - # 1. 检出代码 - - name: Checkout Code + - run: echo "🎉 The job was automatically triggered by a ${{ gitea.event_name }} event." + - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by Gitea!" + - run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}." + - name: Check out repository code uses: actions/checkout@v4 - - # 2. 获取 Flutter 依赖 - - name: Setup Flutter + - run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner." + - run: echo "🖥️ The workflow is now ready to test your code on the runner." + - name: List files in the repository run: | - flutter --version - flutter pub get - - # 3. 运行测试(可选,但推荐) - - name: Run Tests - run: flutter test - - # 4. 分析代码(可选) - - name: Analyze Code - run: flutter analyze - - # 5. 构建 iOS IPA - - name: Build iOS (IPA) - run: flutter build ipa --release --export-method ad-hoc - - # 6. 构建 Android APK 和 AAB - - name: Build Android (APK & AAB) - run: | - flutter build apk --release - flutter build appbundle --release - - # 7. 上传所有构建产物 - - name: Upload Artifacts - uses: actions/upload-artifact@v4 - with: - name: flutter-builds - path: | - build/app/outputs/flutter-apk/ - build/app/outputs/bundle/ - build/ios/ipa/ \ No newline at end of file + ls ${{ gitea.workspace }} + - run: echo "🍏 This job's status is ${{ job.status }}." \ No newline at end of file From 01d60d2d49ccf167d076c41df8b9f21370cdfc07 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 22 Sep 2025 18:25:50 +0800 Subject: [PATCH 16/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 51 ++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 095220b4..01fb7e3c 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -1,19 +1,44 @@ -name: Gitea Actions Demo -run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀 -on: [push] +name: Flutter CI - Build iOS & Android + +on: + push: + branches: + - develop_sky jobs: - Explore-Gitea-Actions: + build: + name: Build Flutter App runs-on: sky + steps: - - run: echo "🎉 The job was automatically triggered by a ${{ gitea.event_name }} event." - - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by Gitea!" - - run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}." - - name: Check out repository code + - name: Checkout Code uses: actions/checkout@v4 - - run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner." - - run: echo "🖥️ The workflow is now ready to test your code on the runner." - - name: List files in the repository + + - name: Setup Flutter run: | - ls ${{ gitea.workspace }} - - run: echo "🍏 This job's status is ${{ job.status }}." \ No newline at end of file + flutter --version + flutter pub get + + - name: Run Tests + run: flutter test + + - name: Analyze Code + run: flutter analyze + + - name: Build iOS IPA + run: flutter build ipa --release --export-method ad-hoc + + - name: Build Android APK + run: flutter build apk --release + + - name: Build Android AAB + run: flutter build appbundle --release + + - name: Upload Artifacts + uses: actions/upload-artifact@v4 + with: + name: flutter-builds + path: | + build/app/outputs/flutter-apk/ + build/app/outputs/bundle/ + build/ios/ipa/ \ No newline at end of file From 7c346a118e2510b207c1b2a93b6bb8d4314a83da Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 22 Sep 2025 18:31:50 +0800 Subject: [PATCH 17/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 69 ++++++++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 22 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 01fb7e3c..4f67cb7e 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -1,4 +1,4 @@ -name: Flutter CI - Build iOS & Android +name: Flutter Build - Sky Dev on: push: @@ -6,39 +6,64 @@ on: - develop_sky jobs: - build: - name: Build Flutter App - runs-on: sky + build-android: + name: Build Android for Sky (dev) + runs-on: sky,flutter steps: - name: Checkout Code uses: actions/checkout@v4 - - name: Setup Flutter + - name: Setup Environment run: | - flutter --version - flutter pub get + echo "NEXT_VERSION=1.0.0" >> $GITHUB_ENV + echo "BUILD_NUMBER=$(date +%Y%m%d%H)" >> $GITHUB_ENV - - name: Run Tests - run: flutter test + - name: Flutter Pub Get + run: flutter pub get - - name: Analyze Code - run: flutter analyze + - name: Clean Project + run: flutter clean - - name: Build iOS IPA - run: flutter build ipa --release --export-method ad-hoc + - name: Build APK (sky_dev flavor) + run: | + flutter build apk \ + --no-tree-shake-icons \ + --release \ + --flavor sky_dev \ + -t lib/main_sky_dev.dart \ + --build-number=${{ env.BUILD_NUMBER }} \ + --build-name=${{ env.NEXT_VERSION }} - - name: Build Android APK - run: flutter build apk --release + - name: Rename APK + run: | + mkdir -p build/output + mv build/app/outputs/flutter-apk/app-sky_dev-release.apk \ + build/output/starlock-sky-preview-${{ env.NEXT_VERSION }}.apk - - name: Build Android AAB - run: flutter build appbundle --release + - name: Build AppBundle (Release) + run: | + flutter build appbundle \ + --no-tree-shake-icons \ + --release \ + --flavor sky \ + -t lib/main_sky_lite.dart \ + --build-number=${{ env.BUILD_NUMBER }} \ + --build-name=${{ env.NEXT_VERSION }} - - name: Upload Artifacts + - name: Rename AAB + run: | + mkdir -p build/output/skyRelease + mv build/app/outputs/bundle/release/app-sky-release.aab \ + build/output/skyRelease/starlock-sky-release-${{ env.NEXT_VERSION }}.aab + + - name: List Output Files + run: | + ls -la build/output/ + + - name: Upload Artifacts (Optional) uses: actions/upload-artifact@v4 with: - name: flutter-builds + name: flutter-builds-${{ env.NEXT_VERSION }} path: | - build/app/outputs/flutter-apk/ - build/app/outputs/bundle/ - build/ios/ipa/ \ No newline at end of file + build/output/ \ No newline at end of file From 462e464f8a089209885157f6821ccc4e328b9e64 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 22 Sep 2025 18:32:24 +0800 Subject: [PATCH 18/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 4f67cb7e..f0ee6987 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -8,7 +8,7 @@ on: jobs: build-android: name: Build Android for Sky (dev) - runs-on: sky,flutter + runs-on: sky steps: - name: Checkout Code From c122bfa637c2d06d18b1736b399429c81e8d97a1 Mon Sep 17 00:00:00 2001 From: liyi Date: Mon, 22 Sep 2025 18:37:42 +0800 Subject: [PATCH 19/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 5 ----- android/gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index f0ee6987..d4bce19e 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -14,11 +14,6 @@ jobs: - name: Checkout Code uses: actions/checkout@v4 - - name: Setup Environment - run: | - echo "NEXT_VERSION=1.0.0" >> $GITHUB_ENV - echo "BUILD_NUMBER=$(date +%Y%m%d%H)" >> $GITHUB_ENV - - name: Flutter Pub Get run: flutter pub get diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 0971a052..1339e0d2 100755 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists #distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip -distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-7.4-all.zip +distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-7.5-all.zip From 74826b9acbad131eeb504f06dac23d920a8b90cd Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 23 Sep 2025 09:11:59 +0800 Subject: [PATCH 20/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index d4bce19e..16598853 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -14,6 +14,11 @@ jobs: - name: Checkout Code uses: actions/checkout@v4 + - name: Setup Environment Variables + run: | + echo "NEXT_VERSION=1.0.0" >> $GITEA_ENV + echo "BUILD_NUMBER=1" >> $GITEA_ENV + - name: Flutter Pub Get run: flutter pub get From 1f107b4be70790c6cd1297e0eddb8f486e84af0c Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 23 Sep 2025 09:16:36 +0800 Subject: [PATCH 21/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index c0ef16b2..2bcf1d55 100755 --- a/android/build.gradle +++ b/android/build.gradle @@ -14,7 +14,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.1.2' + classpath 'com.android.tools.build:gradle:7.3.1' // ✅ 支持 Gradle 7.5 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // fcm,若不集成 FCM 通道,可直接跳过 classpath 'com.google.gms:google-services:4.3.8' From 2674cf25540b2ab641e7cdfa1bafdfb549779938 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 23 Sep 2025 09:42:50 +0800 Subject: [PATCH 22/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/build.gradle | 2 +- android/gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 2bcf1d55..c0ef16b2 100755 --- a/android/build.gradle +++ b/android/build.gradle @@ -14,7 +14,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.3.1' // ✅ 支持 Gradle 7.5 + classpath 'com.android.tools.build:gradle:7.1.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // fcm,若不集成 FCM 通道,可直接跳过 classpath 'com.google.gms:google-services:4.3.8' diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 1339e0d2..0971a052 100755 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists #distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip -distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-7.5-all.zip +distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-7.4-all.zip From 13af3c02a2185ee8a68bd32fab30f7a3ccb0dc56 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 23 Sep 2025 10:11:29 +0800 Subject: [PATCH 23/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 106 ++++++++++++++++++++++++++++++---------- 1 file changed, 80 insertions(+), 26 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 16598853..a8d71291 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -10,60 +10,114 @@ jobs: name: Build Android for Sky (dev) runs-on: sky + env: + FLAVOR: sky_dev + MAIN_FILE: lib/main_sky_dev.dart + BUILD_TYPE: dev + steps: - name: Checkout Code uses: actions/checkout@v4 + with: + fetch-depth: 0 # 获取全部历史,用于计算 commits - - name: Setup Environment Variables + - name: Determine Version + id: version run: | - echo "NEXT_VERSION=1.0.0" >> $GITEA_ENV - echo "BUILD_NUMBER=1" >> $GITEA_ENV + # 获取上一个 tag(格式 v1.4.598_sky) + LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v1.0.0_sky") + echo "LAST_TAG=$LAST_TAG" - - name: Flutter Pub Get + # 提取基础版本号 v1.4.598 + BASE_VERSION=$(echo "$LAST_TAG" | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+' | head -1) + if [ -z "$BASE_VERSION" ]; then + BASE_VERSION="v1.0.0" + fi + + # 分割版本号 + MAJOR=$(echo $BASE_VERSION | cut -d'.' -f1 | sed 's/v//') + MINOR=$(echo $BASE_VERSION | cut -d'.' -f2) + PATCH=$(echo $BASE_VERSION | cut -d'.' -f3) + + # 计算从上个 tag 到现在的唯一 commit messages 数量 + COMMIT_COUNT=$(git log --pretty=%B "${LAST_TAG}.." | grep -v '^$' | sort -u | wc -l | tr -d ' ') + + # 新 patch = 原 patch + commit 数 + NEW_PATCH=$((PATCH + COMMIT_COUNT)) + + # 构造新版本号 + NEXT_VERSION="v${MAJOR}.${MINOR}.${NEW_PATCH}" + + # 带环境标识的完整版本 + NEXT_VERSION_FULL="${NEXT_VERSION}_${FLAVOR}" + + echo "NEXT_VERSION=$NEXT_VERSION" >> $GITEA_ENV + echo "NEXT_VERSION_FULL=$NEXT_VERSION_FULL" >> $GITEA_ENV + echo "BUILD_NUMBER=$NEW_PATCH" >> $GITEA_ENV + + echo "✅ Next version: $NEXT_VERSION_FULL (Build: $NEW_PATCH)" + + - name: Setup Flutter run: flutter pub get - name: Clean Project run: flutter clean - - name: Build APK (sky_dev flavor) + - name: Build APK (${FLAVOR}) run: | flutter build apk \ --no-tree-shake-icons \ - --release \ - --flavor sky_dev \ - -t lib/main_sky_dev.dart \ + --flavor ${FLAVOR} \ + -t ${MAIN_FILE} \ --build-number=${{ env.BUILD_NUMBER }} \ --build-name=${{ env.NEXT_VERSION }} - - name: Rename APK - run: | - mkdir -p build/output - mv build/app/outputs/flutter-apk/app-sky_dev-release.apk \ - build/output/starlock-sky-preview-${{ env.NEXT_VERSION }}.apk - - - name: Build AppBundle (Release) + - name: Build AppBundle (sky flavor, dev mode) run: | flutter build appbundle \ --no-tree-shake-icons \ - --release \ --flavor sky \ -t lib/main_sky_lite.dart \ --build-number=${{ env.BUILD_NUMBER }} \ --build-name=${{ env.NEXT_VERSION }} - - name: Rename AAB + - name: Prepare Output Directory run: | - mkdir -p build/output/skyRelease - mv build/app/outputs/bundle/release/app-sky-release.aab \ - build/output/skyRelease/starlock-sky-release-${{ env.NEXT_VERSION }}.aab + mkdir -p build/output + # 重命名 APK + mv build/app/outputs/flutter-apk/app-${{ env.FLAVOR }}-release.apk \ + build/output/starlock-sky-${{ env.BUILD_TYPE }}-${{ env.NEXT_VERSION_FULL }}.apk + # 重命名 AAB + mv build/app/outputs/bundle/skyRelease/app-sky-release.aab \ + build/output/starlock-sky-${{ env.BUILD_TYPE }}-${{ env.NEXT_VERSION_FULL }}.aab - - name: List Output Files + - name: Build iOS (${{ env.FLAVOR }}) run: | - ls -la build/output/ + flutter build ios \ + --no-codesign \ + --flavor ${FLAVOR} \ + -t ${MAIN_FILE} \ + --build-number=${{ env.BUILD_NUMBER }} \ + --build-name=${{ env.NEXT_VERSION }} - - name: Upload Artifacts (Optional) + - name: Rename IPA + run: | + mkdir -p build/output + cp -r build/ios/ipa/*.ipa build/output/starlock-sky-${{ env.BUILD_TYPE }}-${{ env.NEXT_VERSION_FULL }}.ipa + + - name: List Outputs + run: ls -la build/output/ + + - name: Upload Artifacts uses: actions/upload-artifact@v4 with: - name: flutter-builds-${{ env.NEXT_VERSION }} - path: | - build/output/ \ No newline at end of file + name: flutter-builds-${{ env.NEXT_VERSION_FULL }} + path: build/output/ + + - name: Create and Push New Tag + run: | + NEW_TAG=${{ env.NEXT_VERSION_FULL }} + git config user.name "Gitea Runner" + git config user.email "runner@gitea.local" + git tag "$NEW_TAG" + git push origin "$NEW_TAG" || echo "Tag might already exist" \ No newline at end of file From c41e1ebd9df2b0aaa1ae0904cb4bb571791c3653 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 23 Sep 2025 10:27:05 +0800 Subject: [PATCH 24/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 157 +++++++++++++++++++++++----------------- 1 file changed, 90 insertions(+), 67 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index a8d71291..0dc156be 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -1,4 +1,4 @@ -name: Flutter Build - Sky Dev +name: Flutter Build - Sky on: push: @@ -6,118 +6,141 @@ on: - develop_sky jobs: - build-android: - name: Build Android for Sky (dev) + # 第一个 job:只负责计算版本号(所有 job 依赖它) + determine-version: + name: 🧮 Determine Version runs-on: sky - - env: - FLAVOR: sky_dev - MAIN_FILE: lib/main_sky_dev.dart - BUILD_TYPE: dev - + outputs: + next_version: ${{ steps.version.outputs.next_version }} + next_version_full: ${{ steps.version.outputs.next_version_full }} + build_number: ${{ steps.version.outputs.build_number }} steps: - name: Checkout Code uses: actions/checkout@v4 with: - fetch-depth: 0 # 获取全部历史,用于计算 commits + fetch-depth: 0 - name: Determine Version id: version run: | - # 获取上一个 tag(格式 v1.4.598_sky) LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v1.0.0_sky") - echo "LAST_TAG=$LAST_TAG" - - # 提取基础版本号 v1.4.598 BASE_VERSION=$(echo "$LAST_TAG" | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+' | head -1) - if [ -z "$BASE_VERSION" ]; then - BASE_VERSION="v1.0.0" - fi + [ -z "$BASE_VERSION" ] && BASE_VERSION="v1.0.0" - # 分割版本号 MAJOR=$(echo $BASE_VERSION | cut -d'.' -f1 | sed 's/v//') MINOR=$(echo $BASE_VERSION | cut -d'.' -f2) PATCH=$(echo $BASE_VERSION | cut -d'.' -f3) - # 计算从上个 tag 到现在的唯一 commit messages 数量 COMMIT_COUNT=$(git log --pretty=%B "${LAST_TAG}.." | grep -v '^$' | sort -u | wc -l | tr -d ' ') - - # 新 patch = 原 patch + commit 数 NEW_PATCH=$((PATCH + COMMIT_COUNT)) - - # 构造新版本号 NEXT_VERSION="v${MAJOR}.${MINOR}.${NEW_PATCH}" - - # 带环境标识的完整版本 - NEXT_VERSION_FULL="${NEXT_VERSION}_${FLAVOR}" + NEXT_VERSION_FULL="${NEXT_VERSION}_sky_dev" + BUILD_NUMBER=$NEW_PATCH echo "NEXT_VERSION=$NEXT_VERSION" >> $GITEA_ENV echo "NEXT_VERSION_FULL=$NEXT_VERSION_FULL" >> $GITEA_ENV - echo "BUILD_NUMBER=$NEW_PATCH" >> $GITEA_ENV + echo "BUILD_NUMBER=$BUILD_NUMBER" >> $GITEA_ENV - echo "✅ Next version: $NEXT_VERSION_FULL (Build: $NEW_PATCH)" + # 输出给其他 job 使用 + echo "::set-output name=next_version::$NEXT_VERSION" + echo "::set-output name=next_version_full::$NEXT_VERSION_FULL" + echo "::set-output name=build_number::$BUILD_NUMBER" + + # 并行 Job 1:Android APK + build-apk: + name: 📦 Build APK + needs: determine-version + runs-on: sky + steps: + - name: Checkout Code + uses: actions/checkout@v4 - name: Setup Flutter run: flutter pub get - - name: Clean Project - run: flutter clean - - - name: Build APK (${FLAVOR}) + - name: Build APK run: | flutter build apk \ --no-tree-shake-icons \ - --flavor ${FLAVOR} \ - -t ${MAIN_FILE} \ - --build-number=${{ env.BUILD_NUMBER }} \ - --build-name=${{ env.NEXT_VERSION }} + --flavor sky \ + -t lib/main_sky_dev.dart \ + --build-number=${{ needs.determine-version.outputs.build_number }} \ + --build-name=${{ needs.determine-version.outputs.next_version }} - - name: Build AppBundle (sky flavor, dev mode) + - name: Upload APK Artifact + uses: actions/upload-artifact@v4 + with: + name: starlock-sky-dev-${{ needs.determine-version.outputs.next_version_full }}.apk + path: build/app/outputs/flutter-apk/app-sky_dev-release.apk + + # 并行 Job 2:Android AAB + build-aab: + name: 📦 Build AAB + needs: determine-version + runs-on: sky + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Setup Flutter + run: flutter pub get + + - name: Build App Bundle run: | flutter build appbundle \ --no-tree-shake-icons \ --flavor sky \ - -t lib/main_sky_lite.dart \ - --build-number=${{ env.BUILD_NUMBER }} \ - --build-name=${{ env.NEXT_VERSION }} + -t lib/main_sky_dev.dart \ + --build-number=${{ needs.determine-version.outputs.build_number }} \ + --build-name=${{ needs.determine-version.outputs.next_version }} - - name: Prepare Output Directory - run: | - mkdir -p build/output - # 重命名 APK - mv build/app/outputs/flutter-apk/app-${{ env.FLAVOR }}-release.apk \ - build/output/starlock-sky-${{ env.BUILD_TYPE }}-${{ env.NEXT_VERSION_FULL }}.apk - # 重命名 AAB - mv build/app/outputs/bundle/skyRelease/app-sky-release.aab \ - build/output/starlock-sky-${{ env.BUILD_TYPE }}-${{ env.NEXT_VERSION_FULL }}.aab + - name: Upload AAB Artifact + uses: actions/upload-artifact@v4 + with: + name: starlock-sky-dev-${{ needs.determine-version.outputs.next_version_full }}.aab + path: build/app/outputs/bundle/skyRelease/app-sky-release.aab - - name: Build iOS (${{ env.FLAVOR }}) + # 并行 Job 3:iOS IPA + build-ios: + name: 🍎 Build iOS + needs: determine-version + runs-on: macos # 必须使用 macOS runner + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Setup Flutter + run: flutter pub get + + - name: Build iOS run: | flutter build ios \ --no-codesign \ - --flavor ${FLAVOR} \ - -t ${MAIN_FILE} \ - --build-number=${{ env.BUILD_NUMBER }} \ - --build-name=${{ env.NEXT_VERSION }} + --flavor sky \ + -t lib/main_sky_dev.dart \ + --build-number=${{ needs.determine-version.outputs.build_number }} \ + --build-name=${{ needs.determine-version.outputs.next_version }} - - name: Rename IPA - run: | - mkdir -p build/output - cp -r build/ios/ipa/*.ipa build/output/starlock-sky-${{ env.BUILD_TYPE }}-${{ env.NEXT_VERSION_FULL }}.ipa - - - name: List Outputs - run: ls -la build/output/ - - - name: Upload Artifacts + - name: Upload IPA Artifact uses: actions/upload-artifact@v4 with: - name: flutter-builds-${{ env.NEXT_VERSION_FULL }} - path: build/output/ + name: starlock-sky-dev-${{ needs.determine-version.outputs.next_version_full }}.ipa + path: build/ios/ipa/Runner.ipa + + # 最后一个 job:汇总并打 tag + publish: + name: 🏷️ Create Tag & Notify + needs: [build-apk, build-aab, build-ios] + runs-on: sky + if: success() + steps: + - name: Checkout Code + uses: actions/checkout@v4 - name: Create and Push New Tag run: | - NEW_TAG=${{ env.NEXT_VERSION_FULL }} + NEW_TAG=${{ needs.determine-version.outputs.next_version_full }} git config user.name "Gitea Runner" git config user.email "runner@gitea.local" git tag "$NEW_TAG" - git push origin "$NEW_TAG" || echo "Tag might already exist" \ No newline at end of file + git push origin "$NEW_TAG" || echo "Tag $NEW_TAG already exists" \ No newline at end of file From 2ab18a14251f436d242d19296d7886bbb259de44 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 23 Sep 2025 10:42:47 +0800 Subject: [PATCH 25/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 145 +++++++++++++++++++++++++++++++++------- 1 file changed, 120 insertions(+), 25 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 0dc156be..395c00d0 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -1,4 +1,4 @@ -name: Flutter Build - Sky +name: Flutter Build - Sky Develop on: push: @@ -23,20 +23,53 @@ jobs: - name: Determine Version id: version run: | - LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v1.0.0_sky") + # 获取上一次构建成功的tag(匹配vX.X.X_sky格式) + LAST_TAG=$(git describe --tags --match "v*.*.*_sky" --abbrev=0 2>/dev/null || echo "v1.0.0_sky") + echo "Last tag found: $LAST_TAG" + + # 提取基础版本号(去除_sky后缀) BASE_VERSION=$(echo "$LAST_TAG" | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+' | head -1) [ -z "$BASE_VERSION" ] && BASE_VERSION="v1.0.0" + echo "Base version: $BASE_VERSION" + # 解析版本号各部分 MAJOR=$(echo $BASE_VERSION | cut -d'.' -f1 | sed 's/v//') MINOR=$(echo $BASE_VERSION | cut -d'.' -f2) PATCH=$(echo $BASE_VERSION | cut -d'.' -f3) + echo "Current version: Major=$MAJOR, Minor=$MINOR, Patch=$PATCH" + # 计算不重复的commit消息数量 COMMIT_COUNT=$(git log --pretty=%B "${LAST_TAG}.." | grep -v '^$' | sort -u | wc -l | tr -d ' ') + echo "Unique commit messages count: $COMMIT_COUNT" + + # 计算新的patch版本,并处理进位 NEW_PATCH=$((PATCH + COMMIT_COUNT)) - NEXT_VERSION="v${MAJOR}.${MINOR}.${NEW_PATCH}" - NEXT_VERSION_FULL="${NEXT_VERSION}_sky_dev" + NEW_MINOR=$MINOR + NEW_MAJOR=$MAJOR + + # 处理第三位版本号进位(超过1000时进位到第二位) + if [ $NEW_PATCH -ge 1000 ]; then + NEW_MINOR=$((MINOR + NEW_PATCH / 1000)) + NEW_PATCH=$((NEW_PATCH % 1000)) + echo "Patch overflow detected, new Minor: $NEW_MINOR, new Patch: $NEW_PATCH" + fi + + # 处理第二位版本号进位(超过10时进位到第一位) + if [ $NEW_MINOR -ge 10 ]; then + NEW_MAJOR=$((MAJOR + NEW_MINOR / 10)) + NEW_MINOR=$((NEW_MINOR % 10)) + echo "Minor overflow detected, new Major: $NEW_MAJOR, new Minor: $NEW_MINOR" + fi + + # 生成新版本号 + NEXT_VERSION="v${NEW_MAJOR}.${NEW_MINOR}.${NEW_PATCH}" + NEXT_VERSION_FULL="${NEXT_VERSION}_sky_develop" # develop环境标识 BUILD_NUMBER=$NEW_PATCH + echo "Next version: $NEXT_VERSION" + echo "Next version full: $NEXT_VERSION_FULL" + echo "Build number: $BUILD_NUMBER" + echo "NEXT_VERSION=$NEXT_VERSION" >> $GITEA_ENV echo "NEXT_VERSION_FULL=$NEXT_VERSION_FULL" >> $GITEA_ENV echo "BUILD_NUMBER=$BUILD_NUMBER" >> $GITEA_ENV @@ -46,9 +79,9 @@ jobs: echo "::set-output name=next_version_full::$NEXT_VERSION_FULL" echo "::set-output name=build_number::$BUILD_NUMBER" - # 并行 Job 1:Android APK + # 并行 Job 1:Android APK (Develop环境) build-apk: - name: 📦 Build APK + name: 📦 Build APK (Develop) needs: determine-version runs-on: sky steps: @@ -58,24 +91,33 @@ jobs: - name: Setup Flutter run: flutter pub get - - name: Build APK + - name: Build APK (Develop环境) run: | flutter build apk \ --no-tree-shake-icons \ --flavor sky \ -t lib/main_sky_dev.dart \ --build-number=${{ needs.determine-version.outputs.build_number }} \ - --build-name=${{ needs.determine-version.outputs.next_version }} + --build-name=${{ needs.determine-version.outputs.next_version }} \ + --debug # Develop环境使用debug构建 + + - name: Rename APK with Version + run: | + # 重命名APK文件,添加版本号 + OLD_PATH="build/app/outputs/flutter-apk/app-sky_dev-debug.apk" + NEW_NAME="starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.apk" + cp "$OLD_PATH" "$NEW_NAME" + echo "Renamed APK to: $NEW_NAME" - name: Upload APK Artifact uses: actions/upload-artifact@v4 with: - name: starlock-sky-dev-${{ needs.determine-version.outputs.next_version_full }}.apk - path: build/app/outputs/flutter-apk/app-sky_dev-release.apk + name: ${{ needs.determine-version.outputs.next_version_full }}-apk + path: starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.apk - # 并行 Job 2:Android AAB + # 并行 Job 2:Android AAB (Develop环境) build-aab: - name: 📦 Build AAB + name: 📦 Build AAB (Develop) needs: determine-version runs-on: sky steps: @@ -85,24 +127,33 @@ jobs: - name: Setup Flutter run: flutter pub get - - name: Build App Bundle + - name: Build App Bundle (Develop环境) run: | flutter build appbundle \ --no-tree-shake-icons \ --flavor sky \ -t lib/main_sky_dev.dart \ --build-number=${{ needs.determine-version.outputs.build_number }} \ - --build-name=${{ needs.determine-version.outputs.next_version }} + --build-name=${{ needs.determine-version.outputs.next_version }} \ + --debug # Develop环境使用debug构建 + + - name: Rename AAB with Version + run: | + # 重命名AAB文件,添加版本号 + OLD_PATH="build/app/outputs/bundle/skyDebug/app-sky-debug.aab" + NEW_NAME="starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.aab" + cp "$OLD_PATH" "$NEW_NAME" + echo "Renamed AAB to: $NEW_NAME" - name: Upload AAB Artifact uses: actions/upload-artifact@v4 with: - name: starlock-sky-dev-${{ needs.determine-version.outputs.next_version_full }}.aab - path: build/app/outputs/bundle/skyRelease/app-sky-release.aab + name: ${{ needs.determine-version.outputs.next_version_full }}-aab + path: starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.aab - # 并行 Job 3:iOS IPA + # 并行 Job 3:iOS IPA (Develop环境) build-ios: - name: 🍎 Build iOS + name: 🍎 Build iOS (Develop) needs: determine-version runs-on: macos # 必须使用 macOS runner steps: @@ -112,22 +163,36 @@ jobs: - name: Setup Flutter run: flutter pub get - - name: Build iOS + - name: Build iOS (Develop环境) run: | flutter build ios \ --no-codesign \ --flavor sky \ -t lib/main_sky_dev.dart \ --build-number=${{ needs.determine-version.outputs.build_number }} \ - --build-name=${{ needs.determine-version.outputs.next_version }} + --build-name=${{ needs.determine-version.outputs.next_version }} \ + --debug # Develop环境使用debug构建 + + - name: Rename IPA with Version + run: | + # 重命名IPA文件,添加版本号 + OLD_PATH="build/ios/iphoneos/Runner.app" + NEW_NAME="starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.ipa" + # 对于iOS,需要先打包成IPA + xcodebuild -exportArchive -archivePath build/ios/archive/Runner.xcarchive \ + -exportOptionsPlist ExportOptions.plist \ + -exportPath build/ios/ipa \ + -allowProvisioningUpdates + cp "build/ios/ipa/Runner.ipa" "$NEW_NAME" + echo "Renamed IPA to: $NEW_NAME" - name: Upload IPA Artifact uses: actions/upload-artifact@v4 with: - name: starlock-sky-dev-${{ needs.determine-version.outputs.next_version_full }}.ipa - path: build/ios/ipa/Runner.ipa + name: ${{ needs.determine-version.outputs.next_version_full }}-ipa + path: starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.ipa - # 最后一个 job:汇总并打 tag + # 最后一个 job:汇总、打tag并通知 publish: name: 🏷️ Create Tag & Notify needs: [build-apk, build-aab, build-ios] @@ -136,11 +201,41 @@ jobs: steps: - name: Checkout Code uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Create and Push New Tag run: | NEW_TAG=${{ needs.determine-version.outputs.next_version_full }} git config user.name "Gitea Runner" git config user.email "runner@gitea.local" - git tag "$NEW_TAG" - git push origin "$NEW_TAG" || echo "Tag $NEW_TAG already exists" \ No newline at end of file + + # 检查tag是否已存在,如果不存在则创建并推送 + if ! git rev-parse "$NEW_TAG" >/dev/null 2>&1; then + git tag "$NEW_TAG" + git push origin "$NEW_TAG" + echo "✅ New tag created and pushed: $NEW_TAG" + else + echo "ℹ️ Tag $NEW_TAG already exists, skipping creation" + fi + + - name: Notify Build Success + run: | + echo "🚀 Build Successful!" + echo "📦 Generated artifacts:" + echo " - APK: starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.apk" + echo " - AAB: starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.aab" + echo " - IPA: starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.ipa" + echo "🏷️ New version tag: ${{ needs.determine-version.outputs.next_version_full }}" + echo "🔢 Version: ${{ needs.determine-version.outputs.next_version }}" + echo "📊 Build number: ${{ needs.determine-version.outputs.build_number }}" + + - name: Upload All Artifacts to Gitea + uses: actions/upload-artifact@v4 + with: + name: starlock-sky-develop-${{ needs.determine-version.outputs.next_version_full }} + path: | + starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.apk + starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.aab + starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.ipa + retention-days: 30 From d49359bdf7f2e921e0fce785016f449bfbd7cae3 Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 23 Sep 2025 10:43:51 +0800 Subject: [PATCH 26/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 395c00d0..75a6b1e8 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -155,7 +155,7 @@ jobs: build-ios: name: 🍎 Build iOS (Develop) needs: determine-version - runs-on: macos # 必须使用 macOS runner + runs-on: sky # 必须使用 macOS runner steps: - name: Checkout Code uses: actions/checkout@v4 From ac157e8b934ba657af7a5d91407932e98dd4b6ef Mon Sep 17 00:00:00 2001 From: liyi Date: Tue, 23 Sep 2025 11:07:09 +0800 Subject: [PATCH 27/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 75a6b1e8..384b6422 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -103,11 +103,21 @@ jobs: - name: Rename APK with Version run: | - # 重命名APK文件,添加版本号 - OLD_PATH="build/app/outputs/flutter-apk/app-sky_dev-debug.apk" + # ✅ 修正:文件名是 app-sky-debug.apk,不是 app-sky_dev-debug.apk + OLD_PATH="build/app/outputs/flutter-apk/app-sky-debug.apk" + NEW_NAME="starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.apk" + + # 检查文件是否存在 + if [ ! -f "$OLD_PATH" ]; then + echo "❌ Error: APK file not found at $OLD_PATH" + echo "Available files in directory:" + ls -la build/app/outputs/flutter-apk/ + exit 1 + fi + cp "$OLD_PATH" "$NEW_NAME" - echo "Renamed APK to: $NEW_NAME" + echo "✅ Renamed APK to: $NEW_NAME" - name: Upload APK Artifact uses: actions/upload-artifact@v4 From 398c45ade1fabe489e381d4dfa5b8925bc1b5d97 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 25 Sep 2025 09:12:47 +0800 Subject: [PATCH 28/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 281 +++++++++------------------------------- 1 file changed, 63 insertions(+), 218 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 384b6422..e4f27740 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -1,4 +1,4 @@ -name: Flutter Build - Sky Develop +name: Flutter CI - Basic Setup on: push: @@ -6,246 +6,91 @@ on: - develop_sky jobs: - # 第一个 job:只负责计算版本号(所有 job 依赖它) - determine-version: - name: 🧮 Determine Version + # 基础设置任务:检出代码、提取版本号、输出Flutter环境 + basic-setup: + name: 🔧 Basic Setup runs-on: sky - outputs: - next_version: ${{ steps.version.outputs.next_version }} - next_version_full: ${{ steps.version.outputs.next_version_full }} - build_number: ${{ steps.version.outputs.build_number }} steps: + # 1. 检出代码 - name: Checkout Code uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Determine Version + # 2. 提取版本号 + - name: Extract Version id: version run: | - # 获取上一次构建成功的tag(匹配vX.X.X_sky格式) + # 获取最新的tag(匹配vX.X.X_sky格式) LAST_TAG=$(git describe --tags --match "v*.*.*_sky" --abbrev=0 2>/dev/null || echo "v1.0.0_sky") - echo "Last tag found: $LAST_TAG" + echo "📌 Last tag found: $LAST_TAG" # 提取基础版本号(去除_sky后缀) BASE_VERSION=$(echo "$LAST_TAG" | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+' | head -1) [ -z "$BASE_VERSION" ] && BASE_VERSION="v1.0.0" - echo "Base version: $BASE_VERSION" + echo "📌 Base version: $BASE_VERSION" # 解析版本号各部分 MAJOR=$(echo $BASE_VERSION | cut -d'.' -f1 | sed 's/v//') MINOR=$(echo $BASE_VERSION | cut -d'.' -f2) PATCH=$(echo $BASE_VERSION | cut -d'.' -f3) - echo "Current version: Major=$MAJOR, Minor=$MINOR, Patch=$PATCH" + echo "📌 Version components: Major=$MAJOR, Minor=$MINOR, Patch=$PATCH" - # 计算不重复的commit消息数量 - COMMIT_COUNT=$(git log --pretty=%B "${LAST_TAG}.." | grep -v '^$' | sort -u | wc -l | tr -d ' ') - echo "Unique commit messages count: $COMMIT_COUNT" + # 输出版本信息 + echo "✅ Version extraction completed" + + # 3. 输出Flutter环境 + - name: Output Flutter Environment + run: | + echo "🚀 Flutter Environment Information:" + echo "================================" - # 计算新的patch版本,并处理进位 - NEW_PATCH=$((PATCH + COMMIT_COUNT)) - NEW_MINOR=$MINOR - NEW_MAJOR=$MAJOR - - # 处理第三位版本号进位(超过1000时进位到第二位) - if [ $NEW_PATCH -ge 1000 ]; then - NEW_MINOR=$((MINOR + NEW_PATCH / 1000)) - NEW_PATCH=$((NEW_PATCH % 1000)) - echo "Patch overflow detected, new Minor: $NEW_MINOR, new Patch: $NEW_PATCH" - fi - - # 处理第二位版本号进位(超过10时进位到第一位) - if [ $NEW_MINOR -ge 10 ]; then - NEW_MAJOR=$((MAJOR + NEW_MINOR / 10)) - NEW_MINOR=$((NEW_MINOR % 10)) - echo "Minor overflow detected, new Major: $NEW_MAJOR, new Minor: $NEW_MINOR" - fi - - # 生成新版本号 - NEXT_VERSION="v${NEW_MAJOR}.${NEW_MINOR}.${NEW_PATCH}" - NEXT_VERSION_FULL="${NEXT_VERSION}_sky_develop" # develop环境标识 - BUILD_NUMBER=$NEW_PATCH - - echo "Next version: $NEXT_VERSION" - echo "Next version full: $NEXT_VERSION_FULL" - echo "Build number: $BUILD_NUMBER" - - echo "NEXT_VERSION=$NEXT_VERSION" >> $GITEA_ENV - echo "NEXT_VERSION_FULL=$NEXT_VERSION_FULL" >> $GITEA_ENV - echo "BUILD_NUMBER=$BUILD_NUMBER" >> $GITEA_ENV - - # 输出给其他 job 使用 - echo "::set-output name=next_version::$NEXT_VERSION" - echo "::set-output name=next_version_full::$NEXT_VERSION_FULL" - echo "::set-output name=build_number::$BUILD_NUMBER" - - # 并行 Job 1:Android APK (Develop环境) - build-apk: - name: 📦 Build APK (Develop) - needs: determine-version - runs-on: sky - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Setup Flutter - run: flutter pub get - - - name: Build APK (Develop环境) - run: | - flutter build apk \ - --no-tree-shake-icons \ - --flavor sky \ - -t lib/main_sky_dev.dart \ - --build-number=${{ needs.determine-version.outputs.build_number }} \ - --build-name=${{ needs.determine-version.outputs.next_version }} \ - --debug # Develop环境使用debug构建 - - - name: Rename APK with Version - run: | - # ✅ 修正:文件名是 app-sky-debug.apk,不是 app-sky_dev-debug.apk - OLD_PATH="build/app/outputs/flutter-apk/app-sky-debug.apk" - - NEW_NAME="starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.apk" - - # 检查文件是否存在 - if [ ! -f "$OLD_PATH" ]; then - echo "❌ Error: APK file not found at $OLD_PATH" - echo "Available files in directory:" - ls -la build/app/outputs/flutter-apk/ - exit 1 - fi - - cp "$OLD_PATH" "$NEW_NAME" - echo "✅ Renamed APK to: $NEW_NAME" - - - name: Upload APK Artifact - uses: actions/upload-artifact@v4 - with: - name: ${{ needs.determine-version.outputs.next_version_full }}-apk - path: starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.apk - - # 并行 Job 2:Android AAB (Develop环境) - build-aab: - name: 📦 Build AAB (Develop) - needs: determine-version - runs-on: sky - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Setup Flutter - run: flutter pub get - - - name: Build App Bundle (Develop环境) - run: | - flutter build appbundle \ - --no-tree-shake-icons \ - --flavor sky \ - -t lib/main_sky_dev.dart \ - --build-number=${{ needs.determine-version.outputs.build_number }} \ - --build-name=${{ needs.determine-version.outputs.next_version }} \ - --debug # Develop环境使用debug构建 - - - name: Rename AAB with Version - run: | - # 重命名AAB文件,添加版本号 - OLD_PATH="build/app/outputs/bundle/skyDebug/app-sky-debug.aab" - NEW_NAME="starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.aab" - cp "$OLD_PATH" "$NEW_NAME" - echo "Renamed AAB to: $NEW_NAME" - - - name: Upload AAB Artifact - uses: actions/upload-artifact@v4 - with: - name: ${{ needs.determine-version.outputs.next_version_full }}-aab - path: starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.aab - - # 并行 Job 3:iOS IPA (Develop环境) - build-ios: - name: 🍎 Build iOS (Develop) - needs: determine-version - runs-on: sky # 必须使用 macOS runner - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - - name: Setup Flutter - run: flutter pub get - - - name: Build iOS (Develop环境) - run: | - flutter build ios \ - --no-codesign \ - --flavor sky \ - -t lib/main_sky_dev.dart \ - --build-number=${{ needs.determine-version.outputs.build_number }} \ - --build-name=${{ needs.determine-version.outputs.next_version }} \ - --debug # Develop环境使用debug构建 - - - name: Rename IPA with Version - run: | - # 重命名IPA文件,添加版本号 - OLD_PATH="build/ios/iphoneos/Runner.app" - NEW_NAME="starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.ipa" - # 对于iOS,需要先打包成IPA - xcodebuild -exportArchive -archivePath build/ios/archive/Runner.xcarchive \ - -exportOptionsPlist ExportOptions.plist \ - -exportPath build/ios/ipa \ - -allowProvisioningUpdates - cp "build/ios/ipa/Runner.ipa" "$NEW_NAME" - echo "Renamed IPA to: $NEW_NAME" - - - name: Upload IPA Artifact - uses: actions/upload-artifact@v4 - with: - name: ${{ needs.determine-version.outputs.next_version_full }}-ipa - path: starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.ipa - - # 最后一个 job:汇总、打tag并通知 - publish: - name: 🏷️ Create Tag & Notify - needs: [build-apk, build-aab, build-ios] - runs-on: sky - if: success() - steps: - - name: Checkout Code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Create and Push New Tag - run: | - NEW_TAG=${{ needs.determine-version.outputs.next_version_full }} - git config user.name "Gitea Runner" - git config user.email "runner@gitea.local" - - # 检查tag是否已存在,如果不存在则创建并推送 - if ! git rev-parse "$NEW_TAG" >/dev/null 2>&1; then - git tag "$NEW_TAG" - git push origin "$NEW_TAG" - echo "✅ New tag created and pushed: $NEW_TAG" + # 检查Flutter是否可用 + if command -v flutter &> /dev/null; then + echo "✅ Flutter is available" + + # 输出Flutter版本 + flutter --version + echo "" + + # 输出Flutter doctor信息 + echo "📋 Flutter Doctor Summary:" + flutter doctor -v | head -20 + echo "" + + # 输出当前项目信息 + echo "📁 Project Information:" + echo "Project directory: $(pwd)" + echo "Flutter project detected: $(ls -la | grep pubspec.yaml > /dev/null && echo "Yes" || echo "No")" + else - echo "ℹ️ Tag $NEW_TAG already exists, skipping creation" + echo "❌ Flutter is not available in this environment" fi + + echo "✅ Flutter environment check completed" - - name: Notify Build Success + # 4. 输出CI环境信息 + - name: Output CI Environment run: | - echo "🚀 Build Successful!" - echo "📦 Generated artifacts:" - echo " - APK: starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.apk" - echo " - AAB: starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.aab" - echo " - IPA: starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.ipa" - echo "🏷️ New version tag: ${{ needs.determine-version.outputs.next_version_full }}" - echo "🔢 Version: ${{ needs.determine-version.outputs.next_version }}" - echo "📊 Build number: ${{ needs.determine-version.outputs.build_number }}" + echo "🔧 CI Environment Information:" + echo "============================" + echo "Runner OS: $RUNNER_OS" + echo "Runner Architecture: $RUNNER_ARCH" + echo "Git Branch: $GITHUB_REF" + echo "Git SHA: $GITHUB_SHA" + echo "Workflow: $GITHUB_WORKFLOW" + echo "" + echo "✅ CI environment information output completed" - - name: Upload All Artifacts to Gitea - uses: actions/upload-artifact@v4 - with: - name: starlock-sky-develop-${{ needs.determine-version.outputs.next_version_full }} - path: | - starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.apk - starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.aab - starlock-sky-${{ needs.determine-version.outputs.next_version_full }}.ipa - retention-days: 30 + # 5. 任务完成通知 + - name: Task Completion + run: | + echo "🎉 Basic CI setup completed successfully!" + echo "" + echo "📋 Tasks executed:" + echo " ✅ Code checkout" + echo " ✅ Version extraction" + echo " ✅ Flutter environment output" + echo " ✅ CI environment output" + echo "" + echo "🔚 No further operations will be performed." From 9b69c65bf8d506ee5aa723e2eefa9de74e4db4ed Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 25 Sep 2025 09:22:12 +0800 Subject: [PATCH 29/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 59 ++++++++--------------------------------- 1 file changed, 11 insertions(+), 48 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index e4f27740..6d509deb 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -21,12 +21,19 @@ jobs: - name: Extract Version id: version run: | - # 获取最新的tag(匹配vX.X.X_sky格式) - LAST_TAG=$(git describe --tags --match "v*.*.*_sky" --abbrev=0 2>/dev/null || echo "v1.0.0_sky") - echo "📌 Last tag found: $LAST_TAG" + # 获取最新的tag(按版本号排序,匹配vX.X.X_sky格式) + LATEST_TAG=$(git tag --list "v*.*.*_sky" --sort=-version:refname | head -1) + + # 如果没有找到tag,使用默认值 + if [ -z "$LATEST_TAG" ]; then + LATEST_TAG="v1.0.0_sky" + echo "📌 No tags found, using default: $LATEST_TAG" + else + echo "📌 Latest tag found: $LATEST_TAG" + fi # 提取基础版本号(去除_sky后缀) - BASE_VERSION=$(echo "$LAST_TAG" | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+' | head -1) + BASE_VERSION=$(echo "$LATEST_TAG" | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+' | head -1) [ -z "$BASE_VERSION" ] && BASE_VERSION="v1.0.0" echo "📌 Base version: $BASE_VERSION" @@ -38,50 +45,6 @@ jobs: # 输出版本信息 echo "✅ Version extraction completed" - - # 3. 输出Flutter环境 - - name: Output Flutter Environment - run: | - echo "🚀 Flutter Environment Information:" - echo "================================" - - # 检查Flutter是否可用 - if command -v flutter &> /dev/null; then - echo "✅ Flutter is available" - - # 输出Flutter版本 - flutter --version - echo "" - - # 输出Flutter doctor信息 - echo "📋 Flutter Doctor Summary:" - flutter doctor -v | head -20 - echo "" - - # 输出当前项目信息 - echo "📁 Project Information:" - echo "Project directory: $(pwd)" - echo "Flutter project detected: $(ls -la | grep pubspec.yaml > /dev/null && echo "Yes" || echo "No")" - - else - echo "❌ Flutter is not available in this environment" - fi - - echo "✅ Flutter environment check completed" - - # 4. 输出CI环境信息 - - name: Output CI Environment - run: | - echo "🔧 CI Environment Information:" - echo "============================" - echo "Runner OS: $RUNNER_OS" - echo "Runner Architecture: $RUNNER_ARCH" - echo "Git Branch: $GITHUB_REF" - echo "Git SHA: $GITHUB_SHA" - echo "Workflow: $GITHUB_WORKFLOW" - echo "" - echo "✅ CI environment information output completed" - # 5. 任务完成通知 - name: Task Completion run: | From 9c14338c533f38794d0e5c45410580f99fa1b98d Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 25 Sep 2025 09:32:03 +0800 Subject: [PATCH 30/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci=EF=BC=88?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E4=B8=8B=E4=B8=80=E4=BD=8D=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 48 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 6d509deb..f2df98ee 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -43,6 +43,54 @@ jobs: PATCH=$(echo $BASE_VERSION | cut -d'.' -f3) echo "📌 Version components: Major=$MAJOR, Minor=$MINOR, Patch=$PATCH" + # 计算下一个版本号 + echo "📊 Calculating next version..." + + # 获取当前提交与最新tag之间的所有提交消息 + COMMIT_MESSAGES=$(git log --oneline --format=%s $LATEST_TAG..HEAD 2>/dev/null || echo "") + + # 统计需要递增的提交次数(过滤重复的提交消息) + INCREMENT_COUNT=0 + if [ -n "$COMMIT_MESSAGES" ]; then + # 使用awk过滤重复的提交消息并计数 + UNIQUE_MESSAGES=$(echo "$COMMIT_MESSAGES" | awk '!seen[$0]++') + INCREMENT_COUNT=$(echo "$UNIQUE_MESSAGES" | wc -l) + echo "📝 Found $INCREMENT_COUNT unique commit(s) since last tag" + else + echo "📝 No new commits since last tag" + fi + + # 计算新的版本号 + NEW_PATCH=$((PATCH + INCREMENT_COUNT)) + NEW_MINOR=$MINOR + NEW_MAJOR=$MAJOR + + # 处理版本号进位逻辑 + if [ $NEW_PATCH -ge 1000 ]; then + NEW_MINOR=$((NEW_MINOR + NEW_PATCH / 1000)) + NEW_PATCH=$((NEW_PATCH % 1000)) + echo "🔄 Patch version overflow, incrementing minor version" + fi + + if [ $NEW_MINOR -ge 10 ]; then + NEW_MAJOR=$((NEW_MAJOR + NEW_MINOR / 10)) + NEW_MINOR=$((NEW_MINOR % 10)) + echo "🔄 Minor version overflow, incrementing major version" + fi + + # 生成下一个版本号 + NEXT_VERSION="v${NEW_MAJOR}.${NEW_MINOR}.${NEW_PATCH}" + NEXT_TAG="${NEXT_VERSION}_sky" + + echo "🚀 Next version: $NEXT_VERSION" + echo "🏷️ Next tag: $NEXT_TAG" + echo "📈 Increment count: $INCREMENT_COUNT" + + # 输出到Github Actions环境变量 + echo "NEXT_VERSION=$NEXT_VERSION" >> $GITHUB_OUTPUT + echo "NEXT_TAG=$NEXT_TAG" >> $GITHUB_OUTPUT + echo "INCREMENT_COUNT=$INCREMENT_COUNT" >> $GITHUB_OUTPUT + # 输出版本信息 echo "✅ Version extraction completed" # 5. 任务完成通知 From fc4429d828619da847f32408ecb67d8162b85b7d Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 25 Sep 2025 09:41:33 +0800 Subject: [PATCH 31/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index f2df98ee..2cb73c15 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -6,7 +6,7 @@ on: - develop_sky jobs: - # 基础设置任务:检出代码、提取版本号、输出Flutter环境 + # 基础设置任务:检出代码、提取版本号 basic-setup: name: 🔧 Basic Setup runs-on: sky @@ -86,10 +86,10 @@ jobs: echo "🏷️ Next tag: $NEXT_TAG" echo "📈 Increment count: $INCREMENT_COUNT" - # 输出到Github Actions环境变量 - echo "NEXT_VERSION=$NEXT_VERSION" >> $GITHUB_OUTPUT - echo "NEXT_TAG=$NEXT_TAG" >> $GITHUB_OUTPUT - echo "INCREMENT_COUNT=$INCREMENT_COUNT" >> $GITHUB_OUTPUT + # 输出到Gitea Actions环境变量 + echo "NEXT_VERSION=$NEXT_VERSION" >> $GITHUB_ENV + echo "NEXT_TAG=$NEXT_TAG" >> $GITHUB_ENV + echo "INCREMENT_COUNT=$INCREMENT_COUNT" >> $GITHUB_ENV # 输出版本信息 echo "✅ Version extraction completed" From 3eee6d663adc10f658ba929f4a3a2dc9c9cdff57 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 25 Sep 2025 09:43:46 +0800 Subject: [PATCH 32/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci=EF=BC=88?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9E=84=E5=BB=BA=E5=88=B6=E5=93=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 118 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 2cb73c15..d0b2107f 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -101,7 +101,119 @@ jobs: echo "📋 Tasks executed:" echo " ✅ Code checkout" echo " ✅ Version extraction" - echo " ✅ Flutter environment output" - echo " ✅ CI environment output" echo "" - echo "🔚 No further operations will be performed." + echo "🚀 Next steps: Building Flutter artifacts..." + + # 构建Flutter制品任务 + build-artifacts: + name: 🏗️ Build Flutter Artifacts + runs-on: sky + needs: basic-setup + steps: + # 1. 检出代码 + - name: Checkout Code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + # 2. 设置Flutter环境 + - name: Setup Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: '3.x' + channel: 'stable' + + # 3. 获取版本信息 + - name: Get Version Info + id: version-info + run: | + echo "📊 Using version from basic-setup job" + echo "NEXT_VERSION=${{ env.NEXT_VERSION }}" + echo "NEXT_TAG=${{ env.NEXT_TAG }}" + + # 4. 构建APK文件 + - name: Build APK + run: | + echo "🏗️ Building APK artifact..." + + # 格式化文件名:sky-star-lock-develop-1-4.609.apk + APK_FILENAME="sky-star-lock-develop-${{ env.NEXT_VERSION }}.apk" + APK_FILENAME=$(echo "$APK_FILENAME" | sed 's/v//g' | sed 's/\./-/g') + APK_FILENAME="sky-star-lock-develop-$APK_FILENAME.apk" + + echo "📁 APK filename: $APK_FILENAME" + + # 构建APK + flutter build apk --release --flavor sky + + # 重命名APK文件 + mv build/app/outputs/flutter-apk/app-sky-release.apk "$APK_FILENAME" + + echo "✅ APK build completed: $APK_FILENAME" + + # 5. 构建AAB文件 + - name: Build AAB + run: | + echo "🏗️ Building AAB artifact..." + + # 格式化文件名:sky-star-lock-develop-1-4.609.aab + AAB_FILENAME="sky-star-lock-develop-${{ env.NEXT_VERSION }}.aab" + AAB_FILENAME=$(echo "$AAB_FILENAME" | sed 's/v//g' | sed 's/\./-/g') + AAB_FILENAME="sky-star-lock-develop-$AAB_FILENAME.aab" + + echo "📁 AAB filename: $AAB_FILENAME" + + # 构建AAB + flutter build appbundle --release --flavor sky + + # 重命名AAB文件 + mv build/app/outputs/bundle/skyRelease/app-sky-release.aab "$AAB_FILENAME" + + echo "✅ AAB build completed: $AAB_FILENAME" + + # 6. 构建iOS IPA文件(如果支持iOS构建) + - name: Build iOS IPA + if: runner.os == 'macos' + run: | + echo "🏗️ Building iOS IPA artifact..." + + # 格式化文件名:sky-star-lock-develop-1-4.609.ipa + IPA_FILENAME="sky-star-lock-develop-${{ env.NEXT_VERSION }}.ipa" + IPA_FILENAME=$(echo "$IPA_FILENAME" | sed 's/v//g' | sed 's/\./-/g') + IPA_FILENAME="sky-star-lock-develop-$IPA_FILENAME.ipa" + + echo "📁 IPA filename: $IPA_FILENAME" + + # 构建iOS IPA + flutter build ipa --release --flavor sky + + # 重命名IPA文件 + mv build/ios/ipa/*.ipa "$IPA_FILENAME" + + echo "✅ iOS IPA build completed: $IPA_FILENAME" + + # 7. 上传制品 + - name: Upload Artifacts + uses: actions/upload-artifact@v4 + with: + name: flutter-artifacts-develop + path: | + sky-star-lock-develop-*.apk + sky-star-lock-develop-*.aab + sky-star-lock-develop-*.ipa + retention-days: 30 + + # 8. 构建完成通知 + - name: Build Completion + run: | + echo "🎉 Flutter artifacts build completed successfully!" + echo "" + echo "📦 Artifacts generated:" + echo " ✅ APK: sky-star-lock-develop-*.apk" + echo " ✅ AAB: sky-star-lock-develop-*.aab" + if [ "${{ runner.os }}" == "macos" ]; then + echo " ✅ IPA: sky-star-lock-develop-*.ipa" + fi + echo "" + echo "🏷️ Version: ${{ env.NEXT_VERSION }}" + echo "📁 Files available in artifacts section" From 7aef630e1b1ada8d149c7e986e51226bf4b47fce Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 25 Sep 2025 09:54:04 +0800 Subject: [PATCH 33/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci=EF=BC=88?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9E=84=E5=BB=BA=E5=88=B6=E5=93=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 42 +++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index d0b2107f..4f47814c 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -15,7 +15,7 @@ jobs: - name: Checkout Code uses: actions/checkout@v4 with: - fetch-depth: 0 + fetch-depth: 1 # 2. 提取版本号 - name: Extract Version @@ -110,26 +110,28 @@ jobs: runs-on: sky needs: basic-setup steps: - # 1. 检出代码 - - name: Checkout Code - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - # 2. 设置Flutter环境 - - name: Setup Flutter - uses: subosito/flutter-action@v2 - with: - flutter-version: '3.x' - channel: 'stable' - - # 3. 获取版本信息 - - name: Get Version Info - id: version-info + # 1. 使用第一个job的检出结果 + - name: Use Checked Out Code run: | - echo "📊 Using version from basic-setup job" - echo "NEXT_VERSION=${{ env.NEXT_VERSION }}" - echo "NEXT_TAG=${{ env.NEXT_TAG }}" + echo "📁 Using code already checked out by basic-setup job" + echo "📊 Current directory: $(pwd)" + ls -la + echo "✅ Ready to build artifacts" + + # 2. 检查Flutter环境 + - name: Check Flutter Environment + run: | + echo "🔍 Checking Flutter environment..." + flutter --version + echo "✅ Flutter environment is ready" + + # 3. 获取版本信息 + - name: Get Version Info + id: version-info + run: | + echo "📊 Using version from basic-setup job" + echo "NEXT_VERSION=${{ env.NEXT_VERSION }}" + echo "NEXT_TAG=${{ env.NEXT_TAG }}" # 4. 构建APK文件 - name: Build APK From 736854c959c03c24d39c3eea51198f0148094f85 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 25 Sep 2025 09:55:10 +0800 Subject: [PATCH 34/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci=EF=BC=88?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9E=84=E5=BB=BA=E5=88=B6=E5=93=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 4f47814c..58e9430a 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -133,6 +133,7 @@ jobs: echo "NEXT_VERSION=${{ env.NEXT_VERSION }}" echo "NEXT_TAG=${{ env.NEXT_TAG }}" + # 4. 构建APK文件 - name: Build APK run: | From 47b5e7b06e747b7a90c8c69259dbd3fe2696799c Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 25 Sep 2025 09:55:37 +0800 Subject: [PATCH 35/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci=EF=BC=88?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9E=84=E5=BB=BA=E5=88=B6=E5=93=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 58e9430a..91f165be 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -15,7 +15,7 @@ jobs: - name: Checkout Code uses: actions/checkout@v4 with: - fetch-depth: 1 + fetch-depth: 0 # 2. 提取版本号 - name: Extract Version From 68b244a527c2b4b5623f3da972cf4a2883ff96e2 Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 25 Sep 2025 09:56:28 +0800 Subject: [PATCH 36/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 91f165be..ca42fe8e 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -110,20 +110,18 @@ jobs: runs-on: sky needs: basic-setup steps: - # 1. 使用第一个job的检出结果 - - name: Use Checked Out Code - run: | - echo "📁 Using code already checked out by basic-setup job" - echo "📊 Current directory: $(pwd)" - ls -la - echo "✅ Ready to build artifacts" + # 1. 检出代码 + - name: Checkout Code + uses: actions/checkout@v4 + with: + fetch-depth: 0 # 2. 检查Flutter环境 - - name: Check Flutter Environment - run: | - echo "🔍 Checking Flutter environment..." - flutter --version - echo "✅ Flutter environment is ready" + - name: Check Flutter Environment + run: | + echo "🔍 Checking Flutter environment..." + flutter --version + echo "✅ Flutter environment is ready" # 3. 获取版本信息 - name: Get Version Info @@ -133,7 +131,6 @@ jobs: echo "NEXT_VERSION=${{ env.NEXT_VERSION }}" echo "NEXT_TAG=${{ env.NEXT_TAG }}" - # 4. 构建APK文件 - name: Build APK run: | From 670e6e8b262af45e4cc6b6aa23115f4c9a4748ad Mon Sep 17 00:00:00 2001 From: liyi Date: Thu, 25 Sep 2025 10:16:02 +0800 Subject: [PATCH 37/37] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 67 +++++++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index ca42fe8e..ed74d7a5 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -3,7 +3,10 @@ name: Flutter CI - Basic Setup on: push: branches: - - develop_sky + - master_sky + pull_request: + branches: + - master_sky jobs: # 基础设置任务:检出代码、提取版本号 @@ -136,15 +139,19 @@ jobs: run: | echo "🏗️ Building APK artifact..." - # 格式化文件名:sky-star-lock-develop-1-4.609.apk - APK_FILENAME="sky-star-lock-develop-${{ env.NEXT_VERSION }}.apk" - APK_FILENAME=$(echo "$APK_FILENAME" | sed 's/v//g' | sed 's/\./-/g') - APK_FILENAME="sky-star-lock-develop-$APK_FILENAME.apk" + # 生成当前时间作为build-number(格式:YYYYMMDDHH) + BUILD_NUMBER=$(date +%Y%m%d%H) + echo "📅 Build number: $BUILD_NUMBER" + # 格式化版本号用于文件名 + VERSION_FOR_FILENAME=$(echo "${{ env.NEXT_VERSION }}" | sed 's/v//g' | sed 's/\./-/g') + + # 设置APK文件名 + APK_FILENAME="sky-star-lock-release-$VERSION_FOR_FILENAME.apk" echo "📁 APK filename: $APK_FILENAME" - # 构建APK - flutter build apk --release --flavor sky + # 构建APK,使用新的构建参数 + flutter build apk --no-tree-shake-icons --release --flavor sky -t lib/main_sky_full.dart --build-number=$BUILD_NUMBER --build-name="sky-star-lock-release-$VERSION_FOR_FILENAME.apk" # 重命名APK文件 mv build/app/outputs/flutter-apk/app-sky-release.apk "$APK_FILENAME" @@ -156,15 +163,19 @@ jobs: run: | echo "🏗️ Building AAB artifact..." - # 格式化文件名:sky-star-lock-develop-1-4.609.aab - AAB_FILENAME="sky-star-lock-develop-${{ env.NEXT_VERSION }}.aab" - AAB_FILENAME=$(echo "$AAB_FILENAME" | sed 's/v//g' | sed 's/\./-/g') - AAB_FILENAME="sky-star-lock-develop-$AAB_FILENAME.aab" + # 生成当前时间作为build-number(格式:YYYYMMDDHH) + BUILD_NUMBER=$(date +%Y%m%d%H) + echo "📅 Build number: $BUILD_NUMBER" + # 格式化版本号用于文件名 + VERSION_FOR_FILENAME=$(echo "${{ env.NEXT_VERSION }}" | sed 's/v//g' | sed 's/\./-/g') + + # 设置AAB文件名 + AAB_FILENAME="sky-star-lock-release-$VERSION_FOR_FILENAME.aab" echo "📁 AAB filename: $AAB_FILENAME" - # 构建AAB - flutter build appbundle --release --flavor sky + # 构建AAB,使用新的构建参数 + flutter build appbundle --no-tree-shake-icons --release --flavor sky -t lib/main_sky_full.dart --build-number=$BUILD_NUMBER --build-name="sky-star-lock-release-$VERSION_FOR_FILENAME.aab" # 重命名AAB文件 mv build/app/outputs/bundle/skyRelease/app-sky-release.aab "$AAB_FILENAME" @@ -177,15 +188,19 @@ jobs: run: | echo "🏗️ Building iOS IPA artifact..." - # 格式化文件名:sky-star-lock-develop-1-4.609.ipa - IPA_FILENAME="sky-star-lock-develop-${{ env.NEXT_VERSION }}.ipa" - IPA_FILENAME=$(echo "$IPA_FILENAME" | sed 's/v//g' | sed 's/\./-/g') - IPA_FILENAME="sky-star-lock-develop-$IPA_FILENAME.ipa" + # 生成当前时间作为build-number(格式:YYYYMMDDHH) + BUILD_NUMBER=$(date +%Y%m%d%H) + echo "📅 Build number: $BUILD_NUMBER" + # 格式化版本号用于文件名 + VERSION_FOR_FILENAME=$(echo "${{ env.NEXT_VERSION }}" | sed 's/v//g' | sed 's/\./-/g') + + # 设置IPA文件名 + IPA_FILENAME="sky-star-lock-release-$VERSION_FOR_FILENAME.ipa" echo "📁 IPA filename: $IPA_FILENAME" - # 构建iOS IPA - flutter build ipa --release --flavor sky + # 构建iOS IPA,使用新的构建参数 + flutter build ipa --no-tree-shake-icons --release --flavor sky -t lib/main_sky_full.dart --build-number=$BUILD_NUMBER --build-name="sky-star-lock-release-$VERSION_FOR_FILENAME.ipa" # 重命名IPA文件 mv build/ios/ipa/*.ipa "$IPA_FILENAME" @@ -196,11 +211,11 @@ jobs: - name: Upload Artifacts uses: actions/upload-artifact@v4 with: - name: flutter-artifacts-develop + name: flutter-artifacts-release path: | - sky-star-lock-develop-*.apk - sky-star-lock-develop-*.aab - sky-star-lock-develop-*.ipa + sky-star-lock-release-*.apk + sky-star-lock-release-*.aab + sky-star-lock-release-*.ipa retention-days: 30 # 8. 构建完成通知 @@ -209,10 +224,10 @@ jobs: echo "🎉 Flutter artifacts build completed successfully!" echo "" echo "📦 Artifacts generated:" - echo " ✅ APK: sky-star-lock-develop-*.apk" - echo " ✅ AAB: sky-star-lock-develop-*.aab" + echo " ✅ APK: sky-star-lock-release-*.apk" + echo " ✅ AAB: sky-star-lock-release-*.aab" if [ "${{ runner.os }}" == "macos" ]; then - echo " ✅ IPA: sky-star-lock-develop-*.ipa" + echo " ✅ IPA: sky-star-lock-release-*.ipa" fi echo "" echo "🏷️ Version: ${{ env.NEXT_VERSION }}"