diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 5bc305cb..3c582b99 100755 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -31,7 +31,7 @@ - + diff --git a/ios/Podfile.lock b/ios/Podfile.lock index a137bc25..f3d382c6 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -213,6 +213,12 @@ PODS: - JPush (= 5.3.0) - just_audio (0.0.1): - Flutter + - JVerification (3.2.4): + - JCore (>= 2.1.6) + - jverify (0.0.1): + - Flutter + - JCore (>= 4.6.2) + - JVerification (= 3.2.4) - nanopb (3.30910.0): - nanopb/decode (= 3.30910.0) - nanopb/encode (= 3.30910.0) @@ -290,6 +296,7 @@ DEPENDENCIES: - JPush - jpush_flutter (from `.symlinks/plugins/jpush_flutter/ios`) - just_audio (from `.symlinks/plugins/just_audio/ios`) + - jverify (from `.symlinks/plugins/jverify/ios`) - network_info_plus (from `.symlinks/plugins/network_info_plus/ios`) - open_filex (from `.symlinks/plugins/open_filex/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) @@ -331,6 +338,7 @@ SPEC REPOS: - ios-voice-processor - JCore - JPush + - JVerification - nanopb - PromisesObjC - SDWebImage @@ -397,6 +405,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/jpush_flutter/ios" just_audio: :path: ".symlinks/plugins/just_audio/ios" + jverify: + :path: ".symlinks/plugins/jverify/ios" network_info_plus: :path: ".symlinks/plugins/network_info_plus/ios" open_filex: @@ -462,7 +472,7 @@ SPEC CHECKSUMS: flutter_pcm_sound: de0572ca4f99091cc2abfcc31601b8a4ddd33c0e flutter_voice_processor: 2b89b93d69b02227ae3fd58589ee0bcfa3ca2a82 fluttertoast: e9a18c7be5413da53898f660530c56f35edfba9c - fluwx: c18fd6c16b03a2187cd07d6e48e32a7801962849 + fluwx: daa284756ce53442b3d0417ceeda66e981906811 google_maps_flutter_ios: f135b968a67c05679e0a53538e900b5c174b0d99 GoogleAppMeasurement: 6e49ffac7d3f2c3ded9cc663f912a13b67bbd0de GoogleMaps: 20d7b12be49a14287f797e88e0e31bc4156aaeb4 @@ -474,6 +484,8 @@ SPEC CHECKSUMS: JPush: b71f497a3c1b825c7843fd97f290b05d5cd75f2e jpush_flutter: c87be254790933c0363684169ef9d3d279a5adc5 just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa + JVerification: 0774807f44dd788c78d50303a14e133735807856 + jverify: 337ea43ac1e16f9484f4195abe787d1b6241163c nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 network_info_plus: 6d0c3eb8367b8164fa3fb0c19875e3f59d49697f open_filex: 6e26e659846ec990262224a12ef1c528bb4edbe4 @@ -498,4 +510,3 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 728f9c851a19709391c77c54ed3556e484b54db6 COCOAPODS: 1.14.3 - diff --git a/lan/lan_ar.json b/lan/lan_ar.json index 51882dae..dbf36900 100644 --- a/lan/lan_ar.json +++ b/lan/lan_ar.json @@ -1120,5 +1120,6 @@ "跟随系统": "اتبع النظام", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "بعد إعادة الضبط ، سيتم حذف بصمات القفل. هل أنت متأكد أنك تريد إعادة ضبطه ؟", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "بعد إعادة الضبط ، سيتم حذف جهاز التحكم عن بعد للقفل. هل تريد إعادة ضبطه ؟", - "版本说明": "تعليمات الإصدار" + "版本说明": "تعليمات الإصدار", + "一键登录": "تسجيل الدخول بنقرة واحدة" } \ No newline at end of file diff --git a/lan/lan_bg.json b/lan/lan_bg.json index 62e1410b..e6ba5228 100644 --- a/lan/lan_bg.json +++ b/lan/lan_bg.json @@ -1120,5 +1120,6 @@ "跟随系统": "Следете система", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "След нулиране, пръстовите отпечатъци на заключването ще бъдат изтрити. Сигурен ли сте, че искате да го нулирате?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "След нулиране, дистанционното управление на ключалката ще бъде изтрито. Искате ли да го нулирате?", - "版本说明": "Обяснение на версията" + "版本说明": "Обяснение на версията", + "一键登录": "Вход с едно кликване" } \ No newline at end of file diff --git a/lan/lan_bn.json b/lan/lan_bn.json index 7c730be4..abf78946 100644 --- a/lan/lan_bn.json +++ b/lan/lan_bn.json @@ -1120,5 +1120,6 @@ "跟随系统": "এক্ফক্লোসিস্টেম", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "ব্যান্ডোটারট্রাসেট, thelock'sferprinতা?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "ব্যান্ডোটারপ্রাসেট, নিয়ন্ত্রণের নিয়ন্ত্রণ। ডোডো ডাইভান্টটুরে?", - "版本说明": "ভার্সনপরিচিতি" + "版本说明": "ভার্সনপরিচিতি", + "一键登录": "এক-সিক্লিক্লোগিন" } \ No newline at end of file diff --git a/lan/lan_cs.json b/lan/lan_cs.json index 504867c1..ccdffef9 100644 --- a/lan/lan_cs.json +++ b/lan/lan_cs.json @@ -1120,5 +1120,6 @@ "跟随系统": "Sledovat systém", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Po resetování budou otisky prstů zámku odstraněny. Opravdu ho chcete obnovit?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Po resetu bude dálkové ovládání zámku odstraněno. Chcete ho obnovit?", - "版本说明": "Verze" + "版本说明": "Verze", + "一键登录": "Přihlášení s jedním kliknutím" } \ No newline at end of file diff --git a/lan/lan_da.json b/lan/lan_da.json index df10a266..3fa32f8c 100644 --- a/lan/lan_da.json +++ b/lan/lan_da.json @@ -1120,5 +1120,6 @@ "跟随系统": "Følg systemet", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Efter nulstilling vil låsens fingeraftryk blive slettet. Er du sikker på at du vil nulstille den?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Efter nulstilling, fjernbetjeningen af låsen vil blive slettet. Vil du nulstille den?", - "版本说明": "Versionsbeskrivelse" + "版本说明": "Versionsbeskrivelse", + "一键登录": "Login med et enkelt klik" } \ No newline at end of file diff --git a/lan/lan_de.json b/lan/lan_de.json index 32b6dcd6..adeb27e5 100644 --- a/lan/lan_de.json +++ b/lan/lan_de.json @@ -1120,5 +1120,6 @@ "跟随系统": "System folgen", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Nach dem Zurücksetzen werden die Finger abdrücke des Schlosses gelöscht. Sind Sie sicher, dass Sie es zurücksetzen wollen?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Nach dem Zurücksetzen wird die Fernbedienung des Schlosses gelöscht. Willst du es zurücksetzen?", - "版本说明": "Versionsbeschreibung" + "版本说明": "Versionsbeschreibung", + "一键登录": "Ein-Klick-Login" } \ No newline at end of file diff --git a/lan/lan_el.json b/lan/lan_el.json index dadf971d..2ff371f0 100644 --- a/lan/lan_el.json +++ b/lan/lan_el.json @@ -1120,5 +1120,6 @@ "跟随系统": "Ακολουθήστε το σύστημα", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Μετά την επαναφορά, τα αποτυπώματα της κλειδαριάς θα διαγραφούν. Είστε σίγουροι ότι θέλετε να το επαναφέρετε;", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Μετά την επαναφορά, το τηλεχειριστήριο της κλειδαριάς θα διαγραφεί. Θέλεις να το επαναφέρεις;", - "版本说明": "Περιγραφή έκδοσης" + "版本说明": "Περιγραφή έκδοσης", + "一键登录": "Σύνδεση ενός κλικ" } \ No newline at end of file diff --git a/lan/lan_en.json b/lan/lan_en.json index eb01a32a..da13b366 100644 --- a/lan/lan_en.json +++ b/lan/lan_en.json @@ -1121,5 +1121,6 @@ "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "After reset, the lock's fingerprints will be deleted. Are you sure you want to reset it?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "After reset, the remote control of the lock will be deleted. Do you want to reset it?", "版本说明": "Version description", - "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "After the gateway is powered on, press and hold the reset button for 5 seconds. Click Next when the blue indicator light flashes" + "网关通电后,长按重置按钮5秒,蓝色指示灯闪烁时点击下一步": "After the gateway is powered on, press and hold the reset button for 5 seconds. Click Next when the blue indicator light flashes", + "一键登录": "One-click login" } diff --git a/lan/lan_es.json b/lan/lan_es.json index f2d40436..3cf4cf48 100644 --- a/lan/lan_es.json +++ b/lan/lan_es.json @@ -1120,5 +1120,6 @@ "跟随系统": "Seguir sistema", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Después de restablecer, se eliminarán las huellas dactilares del bloqueo. ¿Está seguro de que desea restablecerlo?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Después del reinicio, se eliminará el control remoto de la cerradura. ¿Quieres resetearlo?", - "版本说明": "Instrucciones de versión" + "版本说明": "Instrucciones de versión", + "一键登录": "Inicio de sesión con un solo clic" } \ No newline at end of file diff --git a/lan/lan_et.json b/lan/lan_et.json index 3b680872..3b9ec20c 100644 --- a/lan/lan_et.json +++ b/lan/lan_et.json @@ -1120,5 +1120,6 @@ "跟随系统": "Süsteemi jälgimine", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Pärast lähtestamist kustutatakse luku sõrmejäljed. Kas tõesti soovid see lähtestada?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Pärast lähtestamist kustutatakse luku kaugjuhtimine. Kas sa tahad seda lähtestada?", - "版本说明": "Versiooniteave" + "版本说明": "Versiooniteave", + "一键登录": "Üheklõpsu sisselogimine" } \ No newline at end of file diff --git a/lan/lan_fi.json b/lan/lan_fi.json index 0bc1d06e..423b0063 100644 --- a/lan/lan_fi.json +++ b/lan/lan_fi.json @@ -1120,5 +1120,6 @@ "跟随系统": "Seuraa järjestelmää", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Lukon sormenjäljet poistetaan. Haluatko varmasti nollataa sen?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Nollauksen jälkeen lukon kaukosäädin poistetaan. Haluatko palauttaa sen?", - "版本说明": "Versio" + "版本说明": "Versio", + "一键登录": "Yhden napsautuksen kirjautuminen" } \ No newline at end of file diff --git a/lan/lan_fr.json b/lan/lan_fr.json index f2c17fcc..6c0e37b2 100644 --- a/lan/lan_fr.json +++ b/lan/lan_fr.json @@ -1120,5 +1120,6 @@ "跟随系统": "Suivre le système", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Après réinitialisation, les empreintes digitales de la serrure seront supprimées. Êtes-vous sûr de vouloir le réinitialiser?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Après réinitialisation, la télécommande du verrou sera supprimée. Voulez-vous le réinitialiser?", - "版本说明": "Explication de la version" + "版本说明": "Explication de la version", + "一键登录": "Connexion en un clic" } \ No newline at end of file diff --git a/lan/lan_he.json b/lan/lan_he.json index b5ce2fe3..3cd26f89 100644 --- a/lan/lan_he.json +++ b/lan/lan_he.json @@ -1120,5 +1120,6 @@ "跟随系统": "מערכת מעקב", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "לאחר איפוס, טביעות האצבעות של המנעול יימחקו. אתה בטוח שברצונך לאפס את זה?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "לאחר איפוס, השליטה מרחוק של המנעול יימחק. אתה רוצה לאפס את זה?", - "版本说明": "המידע על גרסה" + "版本说明": "המידע על גרסה", + "一键登录": "התחברות בלחיצה אחת" } \ No newline at end of file diff --git a/lan/lan_hk.json b/lan/lan_hk.json index c61800ba..ed7e097e 100644 --- a/lan/lan_hk.json +++ b/lan/lan_hk.json @@ -1120,5 +1120,6 @@ "跟随系统": "跟隨系統", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "重置之後,鎖嘅指紋將被刪除。 你確定要重置它啊?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "重置之後,鎖嘅遙控器將被刪除。 是否要重置它?", - "版本说明": "版本說明" + "版本说明": "版本說明", + "一键登录": "一键登录" } \ No newline at end of file diff --git a/lan/lan_hr.json b/lan/lan_hr.json index 3eede61c..180f7b98 100644 --- a/lan/lan_hr.json +++ b/lan/lan_hr.json @@ -1120,5 +1120,6 @@ "跟随系统": "Prati sistem:", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Nakon resetovanja, otisci brave će biti izbrisani. Jeste li sigurni da ga želite resetirati?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Nakon resetovanja, daljinski upravljač brave će biti izbrisan. Hoæeš da ga resetuješ?", - "版本说明": "Informacije o verziji" + "版本说明": "Informacije o verziji", + "一键登录": "Prijavljivanje jednog klika" } \ No newline at end of file diff --git a/lan/lan_hu.json b/lan/lan_hu.json index f0a2c104..71b13b85 100644 --- a/lan/lan_hu.json +++ b/lan/lan_hu.json @@ -1120,5 +1120,6 @@ "跟随系统": "Follow system", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "A reset után a zár ujjlenyomatai törlődnek. Biztos vagy benne, hogy vissza szeretné állítani?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "A reset után a zár távirányítója törlődik. Szeretné visszaállítani?", - "版本说明": "Versió leírás" + "版本说明": "Versió leírás", + "一键登录": "Egykattintásos bejelentkezés" } \ No newline at end of file diff --git a/lan/lan_id.json b/lan/lan_id.json index 735d0d50..7604e091 100644 --- a/lan/lan_id.json +++ b/lan/lan_id.json @@ -1120,5 +1120,6 @@ "跟随系统": "Sistem mengikuti", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Setelah mengulang, sidik jari kunci akan dihapus. Yakin ingin meresetnya?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Setelah reset, remote control kunci akan dihapus. Ingin mengatur ulang?", - "版本说明": "Catatan versi" + "版本说明": "Catatan versi", + "一键登录": "Masuk satu klik" } \ No newline at end of file diff --git a/lan/lan_it.json b/lan/lan_it.json index 91b0f6cf..68d93fb7 100644 --- a/lan/lan_it.json +++ b/lan/lan_it.json @@ -1120,5 +1120,6 @@ "跟随系统": "Seguire il sistema", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Dopo il reset, le impronte digitali del lucchetto verranno cancellate. Sei sicuro di volerlo resettare?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Dopo il reset, il telecomando del lucchetto verrà eliminato. Vuoi resettarlo?", - "版本说明": "Versione" + "版本说明": "Versione", + "一键登录": "Accesso con un clic" } \ No newline at end of file diff --git a/lan/lan_ja.json b/lan/lan_ja.json index 77e5ddd2..9dfb40de 100644 --- a/lan/lan_ja.json +++ b/lan/lan_ja.json @@ -1120,5 +1120,6 @@ "跟随系统": "システムに従う", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "リセット後、ロックの指紋は削除されます。リセットしてもよろしいですか。", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "リセット後、ロックのリモコンが削除されます。リセットしますか?", - "版本说明": "バージョン説明" + "版本说明": "バージョン説明", + "一键登录": "ワンクリックログイン" } \ No newline at end of file diff --git a/lan/lan_keys.json b/lan/lan_keys.json index d4247e2f..2b4c4bb1 100755 --- a/lan/lan_keys.json +++ b/lan/lan_keys.json @@ -1121,5 +1121,6 @@ "跟随系统": "跟随系统", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "重置后,该锁的指纹都将被删除哦,确认要重置吗?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "重置后,该锁的遥控都将被删除哦,确认要重置吗?", - "版本说明": "版本说明" + "版本说明": "版本说明", + "一键登录": "一键登录" } diff --git a/lan/lan_kk.json b/lan/lan_kk.json index 6bafdaca..bddeb6ce 100644 --- a/lan/lan_kk.json +++ b/lan/lan_kk.json @@ -1120,5 +1120,6 @@ "跟随系统": "Жүйені қолдану", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Қайта ысырып тастау Шынымен ысырып тастауды қалайсыз ба?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Қайта ысырып ысырып тасымалдауын өшіріледі. Оны ысырып тастауды қалайсыз ба?", - "版本说明": "Версиятын көрсету" + "版本说明": "Версиятын көрсету", + "一键登录": "Бір шертті кіру" } \ No newline at end of file diff --git a/lan/lan_ko.json b/lan/lan_ko.json index ecaeda0f..af8a531c 100644 --- a/lan/lan_ko.json +++ b/lan/lan_ko.json @@ -1120,5 +1120,6 @@ "跟随系统": "시스템을 따르십시오", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "재설정 후 잠금 장치의 지문이 삭제됩니다. 당신은 그것을 재설정 하시겠습니까?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "재설정 후 잠금 장치의 리모컨이 삭제됩니다. 당신은 그것을 재설정 하시겠습니까?", - "版本说明": "버전 설명" + "版本说明": "버전 설명", + "一键登录": "원 클릭 로그인" } \ No newline at end of file diff --git a/lan/lan_lt.json b/lan/lan_lt.json index fec5cf96..95763916 100644 --- a/lan/lan_lt.json +++ b/lan/lan_lt.json @@ -1120,5 +1120,6 @@ "跟随系统": "Sekti sistema", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Po reset užrakto pirštų atspaudai bus ištrinti. Ar tikrai norite jį atkurti?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Po reset, nuotolinis valdymo pultas užraktas bus ištrintas. Ar norite jį atkurti?", - "版本说明": "Versijos aprašymas" + "版本说明": "Versijos aprašymas", + "一键登录": "Vieno paspaudimo prisijungimas" } \ No newline at end of file diff --git a/lan/lan_ms.json b/lan/lan_ms.json index f084c7bb..c7c5f5d4 100644 --- a/lan/lan_ms.json +++ b/lan/lan_ms.json @@ -1120,5 +1120,6 @@ "跟随系统": "Ikut system", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Selepas menetapkan semula, cap jari kunci akan dipadamkan. Adakah anda pasti anda mahu menetapkan semula?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Selepas menetapkan semula, kawalan jauh kunci akan dipadamkan. Adakah anda mahu menetapkan semula?", - "版本说明": "Penerangan versi" + "版本说明": "Penerangan versi", + "一键登录": "Log masuk satu klik" } \ No newline at end of file diff --git a/lan/lan_nl.json b/lan/lan_nl.json index 3bed21f6..9e1cf0f8 100644 --- a/lan/lan_nl.json +++ b/lan/lan_nl.json @@ -1120,5 +1120,6 @@ "跟随系统": "Systeem volgen", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Na het resetten worden de vingerafdrukken van het slot verwijderd. Weet je zeker dat je het wilt resetten?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Na het resetten wordt de afstandsbediening van het slot verwijderd. Wilt u het resetten?", - "版本说明": "Versieomschrijving" + "版本说明": "Versieomschrijving", + "跟随系统": "Systeem volgen", } \ No newline at end of file diff --git a/lan/lan_pl.json b/lan/lan_pl.json index fe406a81..d3d3cce4 100644 --- a/lan/lan_pl.json +++ b/lan/lan_pl.json @@ -1120,5 +1120,6 @@ "跟随系统": "Śledź system", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Po zresetowaniu odciski palców zamka zostaną usunięte. Czy na pewno chcesz go zresetować?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Po zresetowaniu zdalne sterowanie zamkiem zostanie usunięte. Czy chcesz go zresetować?", - "版本说明": "Wersja" + "版本说明": "Wersja", + "一键登录": "Login jednym kliknięciem" } \ No newline at end of file diff --git a/lan/lan_pt.json b/lan/lan_pt.json index bcdb2ed2..7ab9de8b 100644 --- a/lan/lan_pt.json +++ b/lan/lan_pt.json @@ -1120,5 +1120,6 @@ "跟随系统": "Siga o sistema", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Após a redefinição, as impressões digitais do bloqueio serão apagadas. Tens a certeza que queres redefini-lo?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Após a reinicialização, o controle remoto do bloqueio será excluído. Você quer redefini-lo?", - "版本说明": "Descrição da versão" + "版本说明": "Descrição da versão", + "一键登录": "Login com um clique" } \ No newline at end of file diff --git a/lan/lan_ro.json b/lan/lan_ro.json index 7c6da3e2..c5769acb 100644 --- a/lan/lan_ro.json +++ b/lan/lan_ro.json @@ -1120,5 +1120,6 @@ "跟随系统": "Urmează sistemul:", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "După resetare, amprentele încuietorii vor fi şterse. Sigur doriți să-l resetați?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "După resetare, telecomanda de blocare va fi ştersă. Vrei să-l resetezi?", - "版本说明": "Descrierea versiunii" + "版本说明": "Descrierea versiunii", + "一键登录": "Autentificare cu un singur clicName" } \ No newline at end of file diff --git a/lan/lan_ru.json b/lan/lan_ru.json index 8001445e..807f2594 100644 --- a/lan/lan_ru.json +++ b/lan/lan_ru.json @@ -1120,5 +1120,6 @@ "跟随系统": "Следуйте системе", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "После сброса отпечатки пальцев замка будут удалены. Вы уверены, что хотите его перезагрузить?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "После сброса пульт дистанционного управления замком будет удален. А вы хотите его сбросить?", - "版本说明": "Объяснение версии" + "版本说明": "Объяснение версии", + "一键登录": "Вход в один клик" } \ No newline at end of file diff --git a/lan/lan_sk.json b/lan/lan_sk.json index e6c0b02f..aa3e342d 100644 --- a/lan/lan_sk.json +++ b/lan/lan_sk.json @@ -1120,5 +1120,6 @@ "跟随系统": "Sledovať systém", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Po resetovaní budú prstové odtlačky zámku vymazané. Ste si istí, že chcete obnoviť?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Po resetovaní bude diaľkové ovládanie zámku vymazané. Chcete ho obnoviť?", - "版本说明": "Popis verzie" + "版本说明": "Popis verzie", + "一键登录": "Prihlásenie jedným kliknutím" } \ No newline at end of file diff --git a/lan/lan_sr_cyrl.json b/lan/lan_sr_cyrl.json index bdfb900b..18bf31eb 100644 --- a/lan/lan_sr_cyrl.json +++ b/lan/lan_sr_cyrl.json @@ -1120,5 +1120,6 @@ "跟随系统": "Пратите систем", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Након ресетовања, отисци прстију браве ће бити избрисани. Да ли сте сигурни да желите да га ресетујете?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Након ресетовања, даљински управљач браве ће бити избрисан. Да ли желите да га ресетујете?", - "版本说明": "Опис верзије" + "版本说明": "Опис верзије", + "一键登录": "Пријава једним кликом" } \ No newline at end of file diff --git a/lan/lan_sv.json b/lan/lan_sv.json index 99de674a..201f17df 100644 --- a/lan/lan_sv.json +++ b/lan/lan_sv.json @@ -1120,5 +1120,6 @@ "跟随系统": "Följ system", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Efter återställd, kommer låsets fingeravtryck tas bort. Är du säker på att du vill återställa den?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Efter återställd, fjärrkontrollen på låset tas bort. Vill du återställa den?", - "版本说明": "Versionsbeskrivning" + "版本说明": "Versionsbeskrivning", + "一键登录": "Ett klick inloggning" } \ No newline at end of file diff --git a/lan/lan_th.json b/lan/lan_th.json index 62fc6a47..4e9a6c4c 100644 --- a/lan/lan_th.json +++ b/lan/lan_th.json @@ -1120,5 +1120,6 @@ "跟随系统": "ระบบติดตามผล", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "หลังจากรีเซ็ตแล้วลายนิ้วมือของล็อคจะถูกลบออกคุณแน่ใจว่าอยากจะรีเซ็ต?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "หลังจากรีเซ็ตแล้วรีโมทคอนโทรลของล็อคจะถูกลบออกคุณต้องการรีเซ็ตไหม", - "版本说明": "คำอธิบายรุ่น" + "版本说明": "คำอธิบายรุ่น", + "一键登录": "เข้าสู่ระบบด้วยคลิกเดียว" } \ No newline at end of file diff --git a/lan/lan_tr.json b/lan/lan_tr.json index 8bf1e675..6341609f 100644 --- a/lan/lan_tr.json +++ b/lan/lan_tr.json @@ -1120,5 +1120,6 @@ "跟随系统": "Sistemi takip et", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Sıfırlamadan sonra, kilidin parmak izleri silinecektir. Sıfırlamak istediğine emin misin?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Sıfırladıktan sonra, kilidin uzaktan kumandası silinecektir. Sıfırlamak ister misin?", - "版本说明": "Sürüm açıklaması" + "版本说明": "Sürüm açıklaması", + "一键登录": "Tek tıklama giriş" } \ No newline at end of file diff --git a/lan/lan_tw.json b/lan/lan_tw.json index 3c0cf448..26eb951c 100644 --- a/lan/lan_tw.json +++ b/lan/lan_tw.json @@ -1120,5 +1120,6 @@ "跟随系统": "跟蹤系統", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "重置後,鎖的指紋將被刪除。 是否確實要重置它?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "重置後,鎖的遙控器將被刪除。 是否要重置它?", - "版本说明": "版本說明" + "版本说明": "版本說明", + "一键登录": "一鍵登錄" } \ No newline at end of file diff --git a/lan/lan_uk.json b/lan/lan_uk.json index bbbe0c19..f48ef8a6 100644 --- a/lan/lan_uk.json +++ b/lan/lan_uk.json @@ -1120,5 +1120,6 @@ "跟随系统": "Система стеження за", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Після скидання відбитки пальців замка будуть видалені. Ви впевнені, що хочете скинути налаштування?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Після скидання пульт дистанційного керування замком буде видалено. Хочете його скинути?", - "版本说明": "Опис версії" + "版本说明": "Опис версії", + "一键登录": "Вхід в один клік" } \ No newline at end of file diff --git a/lan/lan_vi.json b/lan/lan_vi.json index 3d23aa5b..9be34b34 100644 --- a/lan/lan_vi.json +++ b/lan/lan_vi.json @@ -1120,5 +1120,6 @@ "跟随系统": "Hệ thống theo dõi", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "Sau khi đặt lại, dấu vân tay của khóa sẽ bị xóa. Bạn có chắc chắn muốn thiết lập lại nó?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "Sau khi đặt lại, điều khiển từ xa của khóa sẽ bị xóa. Bạn có muốn đặt lại không?", - "版本说明": "Thông tin phiên bản" + "版本说明": "Thông tin phiên bản", + "一键登录": "Đăng nhập bằng một cú nhấp chuột" } \ No newline at end of file diff --git a/lan/lan_zh.json b/lan/lan_zh.json index d665bb14..848858f9 100755 --- a/lan/lan_zh.json +++ b/lan/lan_zh.json @@ -1121,5 +1121,6 @@ "跟随系统": "跟随系统", "重置后,该锁的指纹都将被删除哦,确认要重置吗?": "重置后,该锁的指纹都将被删除哦,确认要重置吗?", "重置后,该锁的遥控都将被删除哦,确认要重置吗?": "重置后,该锁的遥控都将被删除哦,确认要重置吗?", - "版本说明": "版本说明" + "版本说明": "版本说明", + "一键登录": "一键登录" } diff --git a/lib/login/login/starLock_login_logic.dart b/lib/login/login/starLock_login_logic.dart index 2bfdddf6..f04c6674 100755 --- a/lib/login/login/starLock_login_logic.dart +++ b/lib/login/login/starLock_login_logic.dart @@ -1,6 +1,9 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:star_lock/apm/apm_helper.dart'; +import 'package:jverify/jverify.dart'; import 'package:star_lock/appRouters.dart'; import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/blue/blue_manage.dart'; @@ -14,6 +17,7 @@ import '../../mine/mine/starLockMine_logic.dart'; import '../../network/api_repository.dart'; import '../../tools/dateTool.dart'; import '../../tools/eventBusEventManage.dart'; +import '../../tools/jverify_one_click_login.dart'; import '../../tools/showTipView.dart'; import '../../tools/storage.dart'; import '../register/entity/checkIP_entity.dart'; @@ -73,6 +77,43 @@ class StarLockLoginLogic extends BaseGetXController { } } + Future oneClickLoginAction() async { + await JverifyOneClickLoginManage().loginAuth((e) async { + final int? code = e.code; + final String? content = e.message; + // final String operator = map['operator']; + AppLog.log('1111code:$code content:$content'); + if (code == 6000) { + final LoginEntity entity = await ApiRepository.to.oneClickLogin( + loginType: '3', + loginToken: content ?? '', + deviceInfo: state.deviceInfoMap); + if (entity.errorCode!.codeIsSuccessful) { + ApmHelper.instance.trackEvent('login_result', { + 'account': state.emailOrPhone.value, + 'date': DateTool().getNowDateWithType(1), + 'login_res': '成功', + }); + + Storage.saveLoginData(entity.data); + Storage.setBool(saveIsVip, entity.data!.isVip == 1); + eventBus.fire(MineInfoChangeRefreshUI()); + if (Get.isRegistered()) { + Get.find().getStarLockInfo(isUnShowLoading: true); + } + Get.offNamedUntil(Routers.starLockMain, (Route route) => false); + BlueManage().scanDevices.clear(); //清除设备缓存 + } else { + ApmHelper.instance.trackEvent('login_result', { + 'account': state.emailOrPhone.value, + 'date': DateTool().getNowDateWithType(1), + 'login_res': '${entity.errorCode}--${entity.errorMsg}', + }); + } + } + }); + } + Future checkIpAction() async { final CheckIPEntity entity = await ApiRepository.to.checkIpAction(ip: ''); if (entity.errorCode!.codeIsSuccessful) { @@ -110,6 +151,16 @@ class StarLockLoginLogic extends BaseGetXController { state.canNext.value = state.pwdIsOK && state.isEmailOrPhone; } + @override + Future onInit() async { + super.onInit(); + + JverifyOneClickLoginManage(); + oneClickLoginAction(); + state.isCheckVerifyEnable.value = + await JverifyOneClickLoginManage().checkVerifyEnable(); + } + @override void onClose() { state.onClose(); diff --git a/lib/login/login/starLock_login_page.dart b/lib/login/login/starLock_login_page.dart index 143ffb90..b9344e57 100755 --- a/lib/login/login/starLock_login_page.dart +++ b/lib/login/login/starLock_login_page.dart @@ -1,3 +1,4 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -12,6 +13,7 @@ import '../../appRouters.dart'; import '../../app_settings/app_colors.dart'; import '../../common/XSConstantMacro/XSConstantMacro.dart'; import '../../tools/commonItem.dart'; +import '../../tools/jverify_one_click_login.dart'; import '../../tools/submitBtn.dart'; import '../../tools/tf_loginInput.dart'; import '../../tools/titleAppBar.dart'; @@ -234,6 +236,24 @@ class _StarLockLoginPageState extends State { } } : null)), + // SizedBox(height: 20.w), + // Obx(() => Visibility( + // visible: state.isCheckVerifyEnable.value, + // child: SubmitBtn( + // btnName: '一键登录', + // fontSize: 28.sp, + // borderRadius: 20.w, + // padding: EdgeInsets.only(top: 25.w, bottom: 25.w), + // // isDisabled: state.canNext.value, + // onClick: () { + // if (state.agree.value == false) { + // logic.showToast('请先同意用户协议及隐私政策'.tr); + // return; + // } else { + // logic.oneClickLoginAction(); + // } + // }), + // )), SizedBox(height: 50.w), Row( mainAxisAlignment: MainAxisAlignment.center, @@ -258,24 +278,23 @@ class _StarLockLoginPageState extends State { child: SizedBox( width: 10.sp, )), - if (F.isLite) - Container() - else - GestureDetector( - child: SizedBox( - // width: 150.w, - height: 50.h, - // color: Colors.red, - child: Center( - child: Text('演示模式'.tr, - style: TextStyle( - fontSize: 22.sp, color: AppColors.mainColor)), + Obx(() => Visibility( + visible: state.isCheckVerifyEnable.value, + child: GestureDetector( + child: SizedBox( + // width: 150.w, + height: 50.h, + // color: Colors.red, + child: Center( + child: Text('一键登录'.tr, + style: TextStyle( + fontSize: 22.sp, + color: AppColors.mainColor)), + ), + ), + onTap: logic.oneClickLoginAction, ), - ), - onTap: () { - Get.toNamed(Routers.demoModeLockDetailPage); - }, - ) + )) ], ), ], diff --git a/lib/login/login/starLock_login_state.dart b/lib/login/login/starLock_login_state.dart index 41bc0fef..ec224880 100755 --- a/lib/login/login/starLock_login_state.dart +++ b/lib/login/login/starLock_login_state.dart @@ -45,6 +45,8 @@ class StarLockLoginState { 'deviceType': 0 }.obs; + RxBool isCheckVerifyEnable = false.obs; + void onClose() { // emailOrPhoneController.dispose(); // pwdController.dispose(); diff --git a/lib/login/login/starLock_login_xhj_page.dart b/lib/login/login/starLock_login_xhj_page.dart index 8138db92..b0810366 100755 --- a/lib/login/login/starLock_login_xhj_page.dart +++ b/lib/login/login/starLock_login_xhj_page.dart @@ -1,3 +1,4 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -186,14 +187,12 @@ class _StarLockLoginPageState extends State { onPressed: () async { final dynamic data = await Get.toNamed(Routers.starLockRegisterPage); - if (data != null) { - state.emailOrPhoneController.text = - data['phoneOrEmailStr']; - logic.checkNext(state.emailOrPhoneController); - state.pwdController.text = data['pwd']; - logic.checkNext(state.pwdController); - setState(() {}); - } + state.emailOrPhoneController.text = + data['phoneOrEmailStr']; + logic.checkNext(state.emailOrPhoneController); + state.pwdController.text = data['pwd']; + logic.checkNext(state.pwdController); + setState(() {}); }, style: ElevatedButton.styleFrom( backgroundColor: AppColors.mainColor), @@ -229,25 +228,25 @@ class _StarLockLoginPageState extends State { child: SizedBox( width: 10.sp, )), - if (F.isLite) - Container() - else - GestureDetector( - child: SizedBox( - // width: 150.w, - height: 50.h, - // color: Colors.red, - child: Center( - child: Text('演示模式'.tr, - style: TextStyle( - fontSize: 22.sp, - color: AppColors.mainColor)), + Obx(() => Visibility( + visible: state.isCheckVerifyEnable.value, + child: GestureDetector( + child: SizedBox( + // width: 150.w, + height: 50.h, + // color: Colors.red, + child: Center( + child: Text('一键登录'.tr, + style: TextStyle( + fontSize: 22.sp, + color: AppColors.mainColor)), + ), + ), + onTap: () async { + logic.oneClickLoginAction(); + }, ), - ), - onTap: () { - Get.toNamed(Routers.demoModeLockDetailPage); - }, - ) + )) ], ), ], diff --git a/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart b/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart index 4eb5137a..052ac7e8 100755 --- a/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart +++ b/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:get/get.dart'; import 'package:star_lock/apm/apm_helper.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_entity.dart'; import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_state.dart'; @@ -68,34 +69,38 @@ class DoorLockLogLogic extends BaseGetXController { final List uploadList = []; for (int i = 0; i < getList.length; i++) { final List indexList = getList[i]; - // AppLog.log("indexList:$indexList"); - final Map indexMap = {}; - indexMap['type'] = indexList[0].toString(); + try { + // AppLog.log("indexList:$indexList"); + final Map indexMap = {}; + indexMap['type'] = indexList[0].toString(); - final int userNo = (indexList[1] * 256) + indexList[2]; - indexMap['user'] = userNo.toString(); - // AppLog.log('userNouserNouserNouserNo:$userNo'); + final int userNo = (indexList[1] * 256) + indexList[2]; + indexMap['user'] = userNo.toString(); + // AppLog.log('userNouserNouserNouserNo:$userNo'); - final List passwordData = indexList.sublist(7, 17); - final String password = utf8String(passwordData); - indexMap['password'] = password.toString(); - // AppLog.log('passwordpasswordpassword:$password'); + final List passwordData = indexList.sublist(7, 17); + final String password = utf8String(passwordData); + indexMap['password'] = password.toString(); + // AppLog.log('passwordpasswordpassword:$password'); - indexMap['success'] = '1'; + indexMap['success'] = '1'; - final int time = (0xff & indexList[3]) << 24 | - (0xff & indexList[4]) << 16 | - (0xff & indexList[5]) << 8 | - (0xFF & indexList[6]); - final int operateDate = time * 1000; - final int serverTime = state.currentDate; - if (DateTime.fromMillisecondsSinceEpoch(operateDate).isAfter( - DateTime.fromMillisecondsSinceEpoch(serverTime * 1000))) { - // AppLog.log('operateDate:$operateDate state.currentDate:${state.currentDate}'); - continue; + final int time = (0xff & indexList[3]) << 24 | + (0xff & indexList[4]) << 16 | + (0xff & indexList[5]) << 8 | + (0xFF & indexList[6]); + final int operateDate = time * 1000; + final int serverTime = state.currentDate; + if (DateTime.fromMillisecondsSinceEpoch(operateDate).isAfter( + DateTime.fromMillisecondsSinceEpoch(serverTime * 1000))) { + // AppLog.log('operateDate:$operateDate state.currentDate:${state.currentDate}'); + continue; + } + indexMap['date'] = '$operateDate'; + uploadList.add(indexMap); + } catch (e) { + AppLog.log('操作记录:$indexList,解析失败,跳过该跳记录,进行下一条记录解析。'); } - indexMap['date'] = '$operateDate'; - uploadList.add(indexMap); } if (dataLength == state.logCountPage) { state.ifHaveNext = true; @@ -246,6 +251,7 @@ class DoorLockLogLogic extends BaseGetXController { /// 刷新门锁日志列表 StreamSubscription? _getDoorLockLogListRefreshUIEvent; + void _getDoorLockLogListRefreshUIAction() { _getDoorLockLogListRefreshUIEvent = eventBus .on() diff --git a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart index 5cef5acf..9a9bb1e3 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart @@ -296,38 +296,43 @@ class LockDetailLogic extends BaseGetXController { final List uploadList = []; for (int i = 0; i < getList.length; i++) { final List indexList = getList[i]; - AppLog.log('indexList:$indexList'); - final Map indexMap = {}; - indexMap['type'] = indexList[0].toString(); + try { + AppLog.log('indexList:$indexList'); + final Map indexMap = {}; + indexMap['type'] = indexList[0].toString(); - final int userNo = (indexList[1] * 256) + indexList[2]; - indexMap['user'] = userNo.toString(); - // AppLog.log('userNouserNouserNouserNo:$userNo'); + final int userNo = (indexList[1] * 256) + indexList[2]; + indexMap['user'] = userNo.toString(); + // AppLog.log('userNouserNouserNouserNo:$userNo'); - final List passwordData = indexList.sublist(7, 17); - final String password = utf8String(passwordData); - indexMap['password'] = password.toString(); - // AppLog.log('passwordpasswordpassword:$password'); + final List passwordData = indexList.sublist(7, 17); + final String password = utf8String(passwordData); + indexMap['password'] = password.toString(); + // AppLog.log('passwordpasswordpassword:$password'); - indexMap['success'] = '1'; + indexMap['success'] = '1'; - final int time = (0xff & indexList[3]) << 24 | - (0xff & indexList[4]) << 16 | - (0xff & indexList[5]) << 8 | - (0xFF & indexList[6]); - int operateDate = time * 1000; - if (DateTime.fromMillisecondsSinceEpoch(operateDate).isAfter( - DateTime.fromMillisecondsSinceEpoch(getUTCNetTime() * 1000))) { - continue; - } + final int time = (0xff & indexList[3]) << 24 | + (0xff & indexList[4]) << 16 | + (0xff & indexList[5]) << 8 | + (0xFF & indexList[6]); + int operateDate = time * 1000; + if (DateTime.fromMillisecondsSinceEpoch(operateDate).isAfter( + DateTime.fromMillisecondsSinceEpoch( + getUTCNetTime() * 1000))) { + continue; + } - indexMap['date'] = '$operateDate'; - uploadList.add(indexMap); + indexMap['date'] = '$operateDate'; + uploadList.add(indexMap); - if (i == getList.length - 1) { - //设置最后的时间戳 + if (i == getList.length - 1) { + //设置最后的时间戳 - state.operateDate = operateDate; + state.operateDate = operateDate; + } + } catch (e) { + AppLog.log('操作记录:$indexList,解析失败,跳过该跳记录,进行下一条记录解析。'); } } lockRecordUploadData(uploadList); diff --git a/lib/main_local.dart b/lib/main_local.dart index 0fe387f7..9e30d007 100755 --- a/lib/main_local.dart +++ b/lib/main_local.dart @@ -4,7 +4,7 @@ import 'flavors.dart'; import 'main.dart' as runner; Future main() async { - F.appFlavor = Flavor.pre; + F.appFlavor = Flavor.xhj; // AppLog.log('local调用了main函数'); await runner.main(); } diff --git a/lib/network/api.dart b/lib/network/api.dart index 09ec5b51..0cd68027 100755 --- a/lib/network/api.dart +++ b/lib/network/api.dart @@ -5,6 +5,7 @@ abstract class Api { final String getSliderVerifyImgUrl = '/user/getSliderVerifyImg'; final String checkImgUrl = '/user/isSliderValid'; final String loginUrl = '/user/login'; + final String oneClickLoginUrl = '/user/quickLogin'; // 一键登录 final String resetPasswordURL = '/user/resetPassword'; //重置密码 final String getCountryRegionURL = '/system/listCountry'; //获取国家或地区 final String electronicKeyListURL = '/key/listUser'; //电子钥匙列表 diff --git a/lib/network/api_provider.dart b/lib/network/api_provider.dart index aa72dd07..07141ae1 100755 --- a/lib/network/api_provider.dart +++ b/lib/network/api_provider.dart @@ -80,6 +80,17 @@ class ApiProvider extends BaseProvider { 'deviceInfo': deviceInfo, })); + Future oneClickLogin( + String loginType, String loginToken, Map deviceInfo) => + post( + oneClickLoginUrl.toUrl, + jsonEncode({ + 'loginType': loginType, + 'platId': '2', + 'loginToken': loginToken, + 'deviceInfo': deviceInfo, + })); + Future resetPassword( String countryCode, String account, diff --git a/lib/network/api_repository.dart b/lib/network/api_repository.dart index 53d9b263..8f0796e0 100755 --- a/lib/network/api_repository.dart +++ b/lib/network/api_repository.dart @@ -145,6 +145,16 @@ class ApiRepository { return LoginEntity.fromJson(res.body); } + //登录 + Future oneClickLogin( + {required String loginType, + required String loginToken, + required Map deviceInfo}) async { + final res = + await apiProvider.oneClickLogin(loginType, loginToken, deviceInfo); + return LoginEntity.fromJson(res.body); + } + //重置密码 Future resetPassword( String countryCode, diff --git a/lib/tools/jverify_one_click_login.dart b/lib/tools/jverify_one_click_login.dart new file mode 100644 index 00000000..94993d6d --- /dev/null +++ b/lib/tools/jverify_one_click_login.dart @@ -0,0 +1,272 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:jverify/jverify.dart'; +import 'package:star_lock/app_settings/app_colors.dart'; + +import '../app_settings/app_settings.dart'; +import '../common/XSConstantMacro/XSConstantMacro.dart'; +import '../flavors.dart'; + +class JverifyOneClickLoginManage { + factory JverifyOneClickLoginManage() => shareManager()!; + + JverifyOneClickLoginManage._init() { + _initSDK(); + } + + static JverifyOneClickLoginManage? _manager; + + static JverifyOneClickLoginManage? shareManager() { + _manager ??= JverifyOneClickLoginManage._init(); + return _manager; + } + + JverifyOneClickLoginManage? get manager => shareManager(); + Jverify jverify = Jverify(); + + /// 统一 key + String f_result_key = 'result'; + + /// 错误码 + String f_code_key = 'code'; + + /// 回调的提示信息,统一返回 flutter 为 message + String f_msg_key = 'message'; + + /// 运营商信息 + String f_opr_key = 'operator'; + + Future _initSDK() async { + try { + await initPlatformState(); + + isInitSuccess(); + + getToken(); + + preLogin(); + } catch (e) { + AppLog.log('SDK 初始化错误: $e'); + } + } + + Future initPlatformState() async { + // 初始化 SDK 之前添加监听 + jverify.addSDKSetupCallBackListener((JVSDKSetupEvent event) { + print('receive sdk setup call back event :${event.toMap()}'); + }); + + jverify.setDebugMode(true); // 打开调试模式 + jverify.setCollectionAuth(true); + String appKey; + if (F.isSKY) { + appKey = '7ff37d174c1a568a89e98dad'; + AppLog.log('appKey:7ff37d174c1a568a89e98dad'); + } else { + appKey = '251fc8074820d122b6de58d2'; + AppLog.log('appKey:251fc8074820d122b6de58d2'); + } + jverify.setup( + appKey: appKey, //"你自己应用的 AppKey", + channel: 'devloper'); + + /// 授权页面点击时间监听 + jverify.addAuthPageEventListener((JVAuthPageEvent event) { + print('receive auth page event :${event.toMap()}'); + }); + } + + /// sdk 初始化是否完成 + void isInitSuccess() { + jverify.isInitSuccess().then((map) { + final bool result = map[f_result_key]; + AppLog.log('sdk 初始化结果:$map'); + if (result) { + AppLog.log('sdk 初始化成功'); + } else { + AppLog.log('sdk 初始化失败'); + } + }); + } + + /// 判断当前网络环境是否可以发起认证 + Future checkVerifyEnable() async { + final Map map = await jverify.checkVerifyEnable(); + final bool result = map[f_result_key]; + return result; + // state.jverify.checkVerifyEnable().then((map) { + // final bool result = map[f_result_key]; + // if (result) { + // AppLog.log('当前网络环境【支持认证】!'); + // } else { + // AppLog.log('当前网络环境【不支持认证】!'); + // } + // return result; + // }); + } + + void getToken() { + jverify.checkVerifyEnable().then((map) { + final bool result = map[f_result_key]; + if (result) { + jverify.getToken().then((map) { + final int code = map[f_code_key]; + final String token = map[f_msg_key]; + final String operator = map[f_opr_key]; + AppLog.log('getToken code:$code token:$token operator:$operator'); + }); + } else { + AppLog.log('[2016],msg = 当前网络环境不支持认证'); + } + }); + } + + /// 登录预取号 + void preLogin() { + jverify.checkVerifyEnable().then((map) { + final bool result = map[f_result_key]; + if (result) { + jverify.preLogin().then((map) { + AppLog.log('预取号接口回调:${map.toString()}'); + final int code = map[f_code_key]; + final String message = map[f_msg_key]; + }); + } else { + AppLog.log('[2016],msg = 当前网络环境不支持认证'); + } + }); + } + + /// SDK 请求授权一键登录 + Future loginAuth( + Function(JVListenerEvent jvListenerEvent) action) async { + Map map = await jverify.checkVerifyEnable(); + final bool result = map[f_result_key]; + print('checkVerifyEnable $map'); + //需要使用sms的时候不检查result + // if (result) { + // return await jverify.loginAuth(true); + // } + // return null; + + if (result) { + bool isiOS = Platform.isIOS; + + /// 自定义授权的 UI 界面,以下设置的图片必须添加到资源文件里, + /// android项目将图片存放至drawable文件夹下,可使用图片选择器的文件名,例如:btn_login.xml,入参为"btn_login"。 + /// ios项目存放在 Assets.xcassets。 + JVUIConfig uiConfig = JVUIConfig(); + // uiConfig.authBGGifPath = "main_gif"; + // uiConfig.authBGVideoPath="main_vi"; + // uiConfig.authBGVideoPath = 'http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4'; + uiConfig.authBackgroundImage = 'images/icon_left_grey.png'; + + // uiConfig.navHidden = !isiOS; + uiConfig.navColor = AppColors.mainColor.value; + uiConfig.navText = '一键登录'.tr; + uiConfig.navTextColor = Colors.white.value; + uiConfig.navReturnImgPath = 'return_bg'; //图片必须存在 + + uiConfig.logoWidth = 100; + uiConfig.logoHeight = 100; + //uiConfig.logoOffsetX = isiOS ? 0 : null;//(screenWidth/2 - uiConfig.logoWidth/2).toInt(); + uiConfig.logoOffsetY = 100; + uiConfig.logoVerticalLayoutItem = JVIOSLayoutItem.ItemSuper; + uiConfig.logoHidden = false; + uiConfig.logoImgPath = 'logo'; + + uiConfig.numberFieldWidth = 200; + uiConfig.numberFieldHeight = 40; + //uiConfig.numFieldOffsetX = isiOS ? 0 : null;//(screenWidth/2 - uiConfig.numberFieldWidth/2).toInt(); + uiConfig.numFieldOffsetY = isiOS ? 120 : 220; + uiConfig.numberVerticalLayoutItem = JVIOSLayoutItem.ItemLogo; + uiConfig.numberColor = AppColors.mainColor.value; + uiConfig.numberSize = 18; + + uiConfig.sloganOffsetY = isiOS ? 120 : 260; + uiConfig.sloganVerticalLayoutItem = JVIOSLayoutItem.ItemNumber; + uiConfig.sloganTextColor = Colors.black.value; + uiConfig.sloganTextSize = 15; +// uiConfig.slogan + //uiConfig.sloganHidden = 0; + + uiConfig.logBtnOffsetX = 20; + uiConfig.logBtnWidth = double.parse('${1.sw - 20 * 2}').toInt(); + uiConfig.logBtnHeight = 50; + //uiConfig.logBtnOffsetX = isiOS ? 0 : null;//(screenWidth/2 - uiConfig.logBtnWidth/2).toInt(); + uiConfig.logBtnOffsetY = isiOS ? 120 : 330; + uiConfig.logBtnVerticalLayoutItem = JVIOSLayoutItem.ItemNumber; + uiConfig.logBtnText = '一键登录'.tr; + uiConfig.logBtnTextColor = Colors.white.value; + uiConfig.logBtnTextSize = 16; + uiConfig.logBtnBackgroundPath = ''; + // uiConfig.logBtnTextBold = true; + // uiConfig.loginBtnNormalImage = 'login_btn_normal'; //图片必须存在 + // uiConfig.loginBtnPressedImage = 'login_btn_press'; //图片必须存在 + // uiConfig.loginBtnUnableImage = 'login_btn_unable'; //图片必须存在 + + uiConfig.privacyHintToast = + true; //only android 设置隐私条款不选中时点击登录按钮默认显示toast。 + + uiConfig.privacyState = false; //设置默认勾选 + uiConfig.privacyCheckboxSize = 20; + uiConfig.checkedImgPath = 'check_image'; //图片必须存在 + uiConfig.uncheckedImgPath = 'uncheck_image'; //图片必须存在 + uiConfig.privacyCheckboxInCenter = true; + uiConfig.privacyCheckboxHidden = false; + uiConfig.isAlertPrivacyVc = true; + + //uiConfig.privacyOffsetX = isiOS ? (20 + uiConfig.privacyCheckboxSize) : null; + uiConfig.privacyOffsetY = 30; // 距离底部距离 + uiConfig.privacyOffsetX = 15; // 距离底部距离 + uiConfig.privacyVerticalLayoutItem = JVIOSLayoutItem.ItemSuper; + uiConfig.clauseName = '协议1'; + uiConfig.clauseUrl = 'http://www.baidu.com'; + uiConfig.clauseBaseColor = Colors.black.value; + uiConfig.clauseNameTwo = '协议二'; + uiConfig.clauseUrlTwo = 'http://www.hao123.com'; + uiConfig.clauseColor = AppColors.mainColor.value; + uiConfig.privacyText = ['我已阅读并同意'.tr]; + uiConfig.privacyTextSize = 13; + uiConfig.privacyItem = [ + JVPrivacy('用户协议'.tr, XSConstantMacro.userAgreementURL, + beforeName: '', afterName: '', separator: ''), + JVPrivacy('隐私政策'.tr, XSConstantMacro.privacyPolicyURL, separator: '') + ]; + uiConfig.textVerAlignment = 1; + //uiConfig.privacyWithBookTitleMark = true; + //uiConfig.privacyTextCenterGravity = false; + uiConfig.authStatusBarStyle = JVIOSBarStyle.StatusBarStyleDarkContent; + uiConfig.privacyStatusBarStyle = JVIOSBarStyle.StatusBarStyleDefault; + uiConfig.modelTransitionStyle = JVIOSUIModalTransitionStyle.CrossDissolve; + + uiConfig.statusBarColorWithNav = true; + // uiConfig.virtualButtonTransparent = true; + + uiConfig.privacyStatusBarColorWithNav = true; + uiConfig.privacyVirtualButtonTransparent = true; + + uiConfig.needStartAnim = true; + uiConfig.needCloseAnim = true; + uiConfig.enterAnim = 'activity_slide_enter_bottom'; + uiConfig.exitAnim = 'activity_slide_exit_bottom'; + + uiConfig.privacyNavColor = AppColors.mainColor.value; + uiConfig.privacyNavTitleTextColor = Colors.white.value; + uiConfig.privacyNavTitleTextSize = 16; + + /// 调用接口设置 UI + jverify.setCustomAuthorizationView(true, uiConfig, + landscapeConfig: uiConfig); + jverify.loginAuthSyncApi2( + autoDismiss: true, + loginAuthcallback: (event) { + action(event); + // AppLog.log('获取到 loginAuthSyncApi 接口返回数据,code=${event.code},message = ${event.message},operator = ${event.operator}'); + }); + } + } +} diff --git a/lib/widget/permission/permission_dialog.dart b/lib/widget/permission/permission_dialog.dart index 150f3867..a68aaa7d 100755 --- a/lib/widget/permission/permission_dialog.dart +++ b/lib/widget/permission/permission_dialog.dart @@ -1,3 +1,4 @@ +import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:permission_handler/permission_handler.dart'; @@ -109,8 +110,9 @@ class PermissionDialog { if (Get.context == null) { return false; } + final AndroidDeviceInfo androidInfo = await DeviceInfoPlugin().androidInfo; final bool isAndroid33 = - AppPlatform.isAndroid && AppPlatform.getSdkIntValue() >= 33; + AppPlatform.isAndroid && androidInfo.version.sdkInt >= 33; //通用的局部函数 List requestPermission() { @@ -197,8 +199,9 @@ class PermissionDialog { if (Get.context == null) { return false; } + final AndroidDeviceInfo androidInfo = await DeviceInfoPlugin().androidInfo; final bool isAndroid33 = - AppPlatform.isAndroid && AppPlatform.getSdkIntValue() >= 33; + AppPlatform.isAndroid && androidInfo.version.sdkInt >= 33; //通用的局部函数 List requestPermission() { diff --git a/pubspec.lock b/pubspec.lock index a31c6a96..49aad6b2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -996,6 +996,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.4.13" + jverify: + dependency: "direct main" + description: + name: jverify + sha256: "26d1667d8c71403b77a2620a8c618625f8b4bfc950dac285b8f35ebc5e60fa5a" + url: "https://pub.dev" + source: hosted + version: "3.0.0" leak_tracker: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 8462e77b..d408e99c 100755 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -249,6 +249,7 @@ dependencies: flutter_bugly: ^1.0.2 open_filex: ^4.4.0 + jverify: 3.0.0 # umeng_common_sdk: 1.2.8 #