mirror of
https://github.com/hiddify/hiddify-app.git
synced 2026-05-04 11:22:28 +00:00
update release files
This commit is contained in:
@@ -15,7 +15,7 @@ body:
|
||||
id: confirm-search
|
||||
attributes:
|
||||
label: Search first
|
||||
description: Please search [existing issues](https://github.com/hiddify/hiddify-next/issues) before reporting.
|
||||
description: Please search [existing issues](https://github.com/hiddify/hiddify-app/issues) before reporting.
|
||||
options:
|
||||
- label: I searched and no similar issues were found
|
||||
required: true
|
||||
|
||||
+13
-13
@@ -25,29 +25,29 @@
|
||||
<tbody align=left>
|
||||
<tr>
|
||||
<td>Android</td><td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-Android-universal.apk"><img src="https://img.shields.io/badge/APK-Universal-044d29.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-Android-arm64.apk"><img src="https://img.shields.io/badge/APK-ARMv8-168039.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-Android-arm7.apk"><img src="https://img.shields.io/badge/APK-ARMv7-45bf55.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-Android-x86_64.apk"><img src="https://img.shields.io/badge/APK-x64-96ed89.svg?logo=android"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/download/RELEASE_TAG/Hiddify-Android-universal.apk"><img src="https://img.shields.io/badge/APK-Universal-044d29.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/download/RELEASE_TAG/Hiddify-Android-arm64.apk"><img src="https://img.shields.io/badge/APK-ARMv8-168039.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/download/RELEASE_TAG/Hiddify-Android-arm7.apk"><img src="https://img.shields.io/badge/APK-ARMv7-45bf55.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/download/RELEASE_TAG/Hiddify-Android-x86_64.apk"><img src="https://img.shields.io/badge/APK-x64-96ed89.svg?logo=android"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Windows</td><td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-Windows-Setup-x64.Msix"><img src="https://img.shields.io/badge/OfficialSetup-x64-0078d7.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-Windows-Setup-x64.exe"><img src="https://img.shields.io/badge/Setup-x64-2d7d9a.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-Windows-Portable-x64.zip"><img src="https://img.shields.io/badge/Portable-x64-67b7d1.svg?logo=windows"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/download/RELEASE_TAG/Hiddify-Windows-Setup-x64.Msix"><img src="https://img.shields.io/badge/OfficialSetup-x64-0078d7.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/download/RELEASE_TAG/Hiddify-Windows-Setup-x64.exe"><img src="https://img.shields.io/badge/Setup-x64-2d7d9a.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/download/RELEASE_TAG/Hiddify-Windows-Portable-x64.zip"><img src="https://img.shields.io/badge/Portable-x64-67b7d1.svg?logo=windows"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>macOS (v10.15+)</td>
|
||||
<td><a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-MacOS.dmg"><img src="https://img.shields.io/badge/DMG-Universal-ea005e.svg?logo=apple"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-MacOS-Installer.pkg"><img src="https://img.shields.io/badge/PKG-Universal-bc544b.svg?logo=apple" /></a></a></td>
|
||||
<td><a href="https://github.com/hiddify/hiddify-app/releases/download/RELEASE_TAG/Hiddify-MacOS.dmg"><img src="https://img.shields.io/badge/DMG-Universal-ea005e.svg?logo=apple"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/download/RELEASE_TAG/Hiddify-MacOS-Installer.pkg"><img src="https://img.shields.io/badge/PKG-Universal-bc544b.svg?logo=apple" /></a></a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Linux</td>
|
||||
<td><a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-Linux-x64.AppImage"><img src="https://img.shields.io/badge/AppImage-x64-f84e29.svg?logo=linux"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-Debian-x64.deb"><img src="https://img.shields.io/badge/DebPackage-x64-FF9966.svg?logo=debian"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-rpm-x64.rpm"><img src="https://img.shields.io/badge/RpmPackage-x64-F1B42F.svg?logo=redhat"> </a></td>
|
||||
<td><a href="https://github.com/hiddify/hiddify-app/releases/download/RELEASE_TAG/Hiddify-Linux-x64.AppImage"><img src="https://img.shields.io/badge/AppImage-x64-f84e29.svg?logo=linux"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/download/RELEASE_TAG/Hiddify-Debian-x64.deb"><img src="https://img.shields.io/badge/DebPackage-x64-FF9966.svg?logo=debian"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/download/RELEASE_TAG/Hiddify-rpm-x64.rpm"><img src="https://img.shields.io/badge/RpmPackage-x64-F1B42F.svg?logo=redhat"> </a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -57,6 +57,6 @@
|
||||
|
||||
<div dir="ltr">
|
||||
|
||||
**List of all changes:** [ChangeLog](https://github.com/hiddify/hiddify-next/blob/main/HISTORY.md)
|
||||
**List of all changes:** [ChangeLog](https://github.com/hiddify/hiddify-app/blob/main/HISTORY.md)
|
||||
|
||||
</div>
|
||||
|
||||
@@ -106,6 +106,7 @@ jobs:
|
||||
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
|
||||
echo "${{secrets.APPLE_MOBILE_PROVISIONING_PROFILES_TARGZ_BASE64}}"|base64 --decode | tar xz -C ~/Library/MobileDevice/Provisioning\ Profiles
|
||||
ls ~/Library/MobileDevice/Provisioning\ Profiles
|
||||
security find-identity -v -p codesigning
|
||||
# ls ~/Library/MobileDevice/Provisioning\ Profiles
|
||||
# echo "${{secrets.NEW_APPLE_MOBILE_PROVISIONING_PROFILES_TARXZ_BASE64}}"|base64 --decode | tar xJ -C ~/Library/MobileDevice/Provisioning\ Profiles
|
||||
# # echo "${{secrets.NEW_APPLE_MOBILE_PROVISIONING_PROFILES_TARGZ_BASE64_2}}"|base64 --decode | tar xz -C ~/Library/MobileDevice/Provisioning\ Profiles
|
||||
@@ -333,7 +334,7 @@ jobs:
|
||||
- name: Create or Update Draft Release
|
||||
uses: softprops/action-gh-release@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GITHUB_TOKEN: ${{ secrets.TOKEN_FOR_HIDDIFY_APP_REPO }}
|
||||
GITHUB_REPOSITORY: hiddify/hiddify-app
|
||||
with:
|
||||
files: ./out/*
|
||||
|
||||
+4
-4
@@ -2,7 +2,7 @@
|
||||
|
||||
Every contribution to HiddifyApp is welcome, whether it is reporting a bug, submitting a fix, proposing new features, or just asking a question. To make contributing to HiddifyApp as easy as possible, you will find more details for the development flow in this documentation. [Basic tutorial on how to contribute to HiddifyApp](https://hiddify.com/app/How-to-contribute-to-this-project/)
|
||||
|
||||
Please note, we have a [Code of Conduct](https://github.com/hiddify/hiddify-next/blob/main/CODE_OF_CONDUCT.md), please follow it in all your interactions with the project.
|
||||
Please note, we have a [Code of Conduct](https://github.com/hiddify/hiddify-app/blob/main/CODE_OF_CONDUCT.md), please follow it in all your interactions with the project.
|
||||
|
||||
- [Feedback, Issues and Questions](#feedback-issues-and-questions)
|
||||
- [Adding new Features](#adding-new-features)
|
||||
@@ -18,8 +18,8 @@ Please note, we have a [Code of Conduct](https://github.com/hiddify/hiddify-next
|
||||
|
||||
If you encounter any issue, or you have an idea to improve, please:
|
||||
|
||||
- Search through [existing open and closed GitHub Issues](https://github.com/hiddify/hiddify-next/issues) for the answer first. If you find a relevant topic, please comment on the issue.
|
||||
- If none of the issues are relevant, please add a new [issue](https://github.com/hiddify/hiddify-next/issues/new/choose) following the templates and provide as much relevant information as possible.
|
||||
- Search through [existing open and closed GitHub Issues](https://github.com/hiddify/hiddify-app/issues) for the answer first. If you find a relevant topic, please comment on the issue.
|
||||
- If none of the issues are relevant, please add a new [issue](https://github.com/hiddify/hiddify-app/issues/new/choose) following the templates and provide as much relevant information as possible.
|
||||
|
||||
## Adding new Features
|
||||
|
||||
@@ -93,7 +93,7 @@ flutter run --device-id=35492ae2
|
||||
|
||||
## Release
|
||||
|
||||
We use [flutter_distributor](https://github.com/leanflutter/flutter_distributor) for packaging. [GitHub action](https://github.com/hiddify/hiddify-next/blob/main/.github/workflows/build.yml) is triggered on every release tag and will create a new GitHub release.
|
||||
We use [flutter_distributor](https://github.com/leanflutter/flutter_distributor) for packaging. [GitHub action](https://github.com/hiddify/hiddify-app/blob/main/.github/workflows/build.yml) is triggered on every release tag and will create a new GitHub release.
|
||||
After setting up the environment, use the following make commands to build the release version:
|
||||
|
||||
- `make windows-release`
|
||||
|
||||
@@ -5,16 +5,16 @@
|
||||
</div>
|
||||
<br>
|
||||
|
||||
<p align="center"><img src="https://github.com/hiddify/hiddify-next/assets/125398461/d821cfe0-b4c4-441f-be4e-eb9209f59542" /></p>
|
||||
<p align="center"><img src="https://github.com/hiddify/hiddify-app/assets/125398461/d821cfe0-b4c4-441f-be4e-eb9209f59542" /></p>
|
||||
<br>
|
||||
|
||||
<div align="center">
|
||||
|
||||
<!--
|
||||

|
||||

|
||||
-->
|
||||
|
||||
[](https://play.google.com/store/apps/details?id=app.hiddify.com) [](https://github.com/hiddify/hiddify-next/releases/)[](https://github.com/hiddify/hiddify-next/releases/)[](https://github.com/hiddify/hiddify-next/releases/)[](https://github.com/hiddify/hiddify-next/)
|
||||
[](https://play.google.com/store/apps/details?id=app.hiddify.com) [](https://github.com/hiddify/hiddify-app/releases/)[](https://github.com/hiddify/hiddify-app/releases/)[](https://github.com/hiddify/hiddify-app/releases/)[](https://github.com/hiddify/hiddify-app/)
|
||||
[](https://www.youtube.com/@hiddify)[](https://telegram.dog/hiddify)[](https://telegram.dog/hiddify_board/5)
|
||||
|
||||
</div>
|
||||
@@ -27,7 +27,7 @@
|
||||
<p dir="ltr" style="font-size: 16px">A multi-platform proxy client based on <a href="https://github.com/SagerNet/sing-box">Sing-box</a> universal proxy tool-chain. Hiddify offers a wide range of capabilities, like automatic node selection, TUN mode, remote profiles etc. Hiddify is ad-free and open-source. With support for a wide range of protocols, it provides a secure and private way for accessing free internet.</p>
|
||||
|
||||
<div align=center>
|
||||
<img width=90% alt="English Demo" src="https://github.com/hiddify/hiddify-next/assets/125398461/ffe5346d-3404-470f-b5e0-4364e23743d2">
|
||||
<img width=90% alt="English Demo" src="https://github.com/hiddify/hiddify-app/assets/125398461/ffe5346d-3404-470f-b5e0-4364e23743d2">
|
||||
|
||||
</div>
|
||||
|
||||
@@ -59,8 +59,8 @@ Vless, Vmess, Reality, TUIC, Hysteria, Wireguard, SSH etc.
|
||||
📱 Available on official stores
|
||||
|
||||
## 🛍️ Get It On Stores
|
||||
<a href="https://play.google.com/store/apps/details?id=app.hiddify.com"><img height=50px src="https://github.com/hiddify/hiddify-next/blob/main/docs/google-play-badge.png"></a>
|
||||
<a href="https://apps.microsoft.com/detail/Hiddify/9pdfnl3qv2s5?mode=mini" target="_blank"><img height=50px src="https://github.com/hiddify/hiddify-next/assets/125398461/620750bb-4459-41b5-9f86-ba82119345b8" /></a>
|
||||
<a href="https://play.google.com/store/apps/details?id=app.hiddify.com"><img height=50px src="https://github.com/hiddify/hiddify-app/blob/main/docs/google-play-badge.png"></a>
|
||||
<a href="https://apps.microsoft.com/detail/Hiddify/9pdfnl3qv2s5?mode=mini" target="_blank"><img height=50px src="https://github.com/hiddify/hiddify-app/assets/125398461/620750bb-4459-41b5-9f86-ba82119345b8" /></a>
|
||||
|
||||
|
||||
## 📥 Direct Download
|
||||
@@ -77,39 +77,39 @@ Vless, Vmess, Reality, TUIC, Hysteria, Wireguard, SSH etc.
|
||||
<tr>
|
||||
<td>iOS</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-iOS.ipa"><img src="https://img.shields.io/badge/IPA-Universal-c0c0c0.svg?logo=ios"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-iOS.ipa"><img src="https://img.shields.io/badge/IPA-Universal-c0c0c0.svg?logo=ios"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Android</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-universal.apk"><img src="https://img.shields.io/badge/APK-Universal-044d29.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-arm64.apk"><img src="https://img.shields.io/badge/APK-ARMv8-168039.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-arm7.apk"><img src="https://img.shields.io/badge/APK-ARMv7-45bf55.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-x86_64.apk"><img src="https://img.shields.io/badge/APK-x64-96ed89.svg?logo=android"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-universal.apk"><img src="https://img.shields.io/badge/APK-Universal-044d29.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-arm64.apk"><img src="https://img.shields.io/badge/APK-ARMv8-168039.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-arm7.apk"><img src="https://img.shields.io/badge/APK-ARMv7-45bf55.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-x86_64.apk"><img src="https://img.shields.io/badge/APK-x64-96ed89.svg?logo=android"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Windows</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Setup-x64.Msix"><img src="https://img.shields.io/badge/OfficialSetup-x64-0078d7.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Setup-x64.exe"><img src="https://img.shields.io/badge/Setup-x64-2d7d9a.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Portable-x64.zip"><img src="https://img.shields.io/badge/Portable-x64-67b7d1.svg?logo=windows"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Windows-Setup-x64.Msix"><img src="https://img.shields.io/badge/OfficialSetup-x64-0078d7.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Windows-Setup-x64.exe"><img src="https://img.shields.io/badge/Setup-x64-2d7d9a.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Windows-Portable-x64.zip"><img src="https://img.shields.io/badge/Portable-x64-67b7d1.svg?logo=windows"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>macOS</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-MacOS.dmg"><img src="https://img.shields.io/badge/DMG-Universal-ea005e.svg?logo=apple"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-MacOS-Installer.pkg"><img src="https://img.shields.io/badge/PKG-Universal-bc544b.svg?logo=apple" /></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-MacOS.dmg"><img src="https://img.shields.io/badge/DMG-Universal-ea005e.svg?logo=apple"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-MacOS-Installer.pkg"><img src="https://img.shields.io/badge/PKG-Universal-bc544b.svg?logo=apple" /></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Linux</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Linux-x64.AppImage"><img src="https://img.shields.io/badge/AppImage-x64-f84e29.svg?logo=linux"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Debian-x64.deb"><img src="https://img.shields.io/badge/DebPackage-x64-FF9966.svg?logo=debian"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-rpm-x64.rpm"><img src="https://img.shields.io/badge/RpmPackage-x64-F1B42F.svg?logo=redhat"> </a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Linux-x64.AppImage"><img src="https://img.shields.io/badge/AppImage-x64-f84e29.svg?logo=linux"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Debian-x64.deb"><img src="https://img.shields.io/badge/DebPackage-x64-FF9966.svg?logo=debian"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-rpm-x64.rpm"><img src="https://img.shields.io/badge/RpmPackage-x64-F1B42F.svg?logo=redhat"> </a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@@ -124,7 +124,7 @@ Vless, Vmess, Reality, TUIC, Hysteria, Wireguard, SSH etc.
|
||||
|
||||
<div align="center">
|
||||
|
||||
[](https://hiddify.com/app/)
|
||||
[](https://hiddify.com/app/)
|
||||
|
||||
|
||||
</div>
|
||||
@@ -184,7 +184,7 @@ Hiddify is a community driven project. If you're interested in contributing, ple
|
||||
</p>
|
||||
|
||||
<p align=center>
|
||||
<a href="https://github.com/hiddify/hiddify-next/graphs/contributors">
|
||||
<a href="https://github.com/hiddify/hiddify-app/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=hiddify/hiddify-next" />
|
||||
</a>
|
||||
</p>
|
||||
|
||||
+21
-21
@@ -6,16 +6,16 @@
|
||||
</div>
|
||||
<br>
|
||||
|
||||
<p align="center"><img src="https://github.com/hiddify/hiddify-next/assets/125398461/d821cfe0-b4c4-441f-be4e-eb9209f59542" /></p>
|
||||
<p align="center"><img src="https://github.com/hiddify/hiddify-app/assets/125398461/d821cfe0-b4c4-441f-be4e-eb9209f59542" /></p>
|
||||
<br>
|
||||
|
||||
<div align="center">
|
||||
|
||||
<!--
|
||||

|
||||

|
||||
-->
|
||||
|
||||
[](https://play.google.com/store/apps/details?id=app.hiddify.com) [](https://github.com/hiddify/hiddify-next/releases/)[](https://github.com/hiddify/hiddify-next/releases/)[](https://github.com/hiddify/hiddify-next/releases/)[](https://github.com/hiddify/hiddify-next/)
|
||||
[](https://play.google.com/store/apps/details?id=app.hiddify.com) [](https://github.com/hiddify/hiddify-app/releases/)[](https://github.com/hiddify/hiddify-app/releases/)[](https://github.com/hiddify/hiddify-app/releases/)[](https://github.com/hiddify/hiddify-app/)
|
||||
[](https://www.youtube.com/@hiddify)[](https://telegram.dog/hiddify)[](https://telegram.dog/hiddify_board/5)
|
||||
|
||||
</div>
|
||||
@@ -27,7 +27,7 @@
|
||||
<p dir="ltr" style="font-size: 16px">Um cliente de proxy multiplataforma baseado na ferramenta de proxy universal <a href="https://github.com/SagerNet/sing-box">Sing-box</a>. O Hiddify oferece uma ampla gama de recursos, como seleção automática de nós, modo TUN, perfis remotos, etc. O Hiddify é livre de anúncios e de código aberto. Com suporte para uma ampla variedade de protocolos, ele oferece uma maneira segura e privada de acessar a internet gratuitamente.</p>
|
||||
|
||||
<div align=center>
|
||||
<img width=90% alt="English Demo" src="https://github.com/hiddify/hiddify-next/assets/125398461/ffe5346d-3404-470f-b5e0-4364e23743d2">
|
||||
<img width=90% alt="English Demo" src="https://github.com/hiddify/hiddify-app/assets/125398461/ffe5346d-3404-470f-b5e0-4364e23743d2">
|
||||
|
||||
</div>
|
||||
|
||||
@@ -59,8 +59,8 @@ Vless, Vmess, Reality, TUIC, Hysteria, Wireguard, SSH, etc.
|
||||
📱 Disponível nas lojas oficiais
|
||||
|
||||
## 🛍️ Obtenha nas lojas
|
||||
<a href="https://play.google.com/store/apps/details?id=app.hiddify.com"><img height=50px src="https://github.com/hiddify/hiddify-next/blob/main/docs/google-play-badge.png"></a>
|
||||
<a href="https://apps.microsoft.com/detail/Hiddify/9pdfnl3qv2s5?mode=mini" target="_blank"><img height=50px src="https://github.com/hiddify/hiddify-next/assets/125398461/620750bb-4459-41b5-9f86-ba82119345b8" /></a>
|
||||
<a href="https://play.google.com/store/apps/details?id=app.hiddify.com"><img height=50px src="https://github.com/hiddify/hiddify-app/blob/main/docs/google-play-badge.png"></a>
|
||||
<a href="https://apps.microsoft.com/detail/Hiddify/9pdfnl3qv2s5?mode=mini" target="_blank"><img height=50px src="https://github.com/hiddify/hiddify-app/assets/125398461/620750bb-4459-41b5-9f86-ba82119345b8" /></a>
|
||||
|
||||
|
||||
## 📥 Download direto
|
||||
@@ -77,38 +77,38 @@ Vless, Vmess, Reality, TUIC, Hysteria, Wireguard, SSH, etc.
|
||||
<tr>
|
||||
<td>iOS</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-iOS.ipa"><img src="https://img.shields.io/badge/IPA-Universal-c0c0c0.svg?logo=ios"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-iOS.ipa"><img src="https://img.shields.io/badge/IPA-Universal-c0c0c0.svg?logo=ios"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Android</td><td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-universal.apk"><img src="https://img.shields.io/badge/APK-Universal-044d29.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-arm64.apk"><img src="https://img.shields.io/badge/APK-ARMv8-168039.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-arm7.apk"><img src="https://img.shields.io/badge/APK-ARMv7-45bf55.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-x86_64.apk"><img src="https://img.shields.io/badge/APK-x64-96ed89.svg?logo=android"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-universal.apk"><img src="https://img.shields.io/badge/APK-Universal-044d29.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-arm64.apk"><img src="https://img.shields.io/badge/APK-ARMv8-168039.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-arm7.apk"><img src="https://img.shields.io/badge/APK-ARMv7-45bf55.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-x86_64.apk"><img src="https://img.shields.io/badge/APK-x64-96ed89.svg?logo=android"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Windows</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Setup-x64.Msix"><img src="https://img.shields.io/badge/OfficialSetup-x64-0078d7.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Setup-x64.exe"><img src="https://img.shields.io/badge/Setup-x64-2d7d9a.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Portable-x64.zip"><img src="https://img.shields.io/badge/Portable-x64-67b7d1.svg?logo=windows"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Windows-Setup-x64.Msix"><img src="https://img.shields.io/badge/OfficialSetup-x64-0078d7.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Windows-Setup-x64.exe"><img src="https://img.shields.io/badge/Setup-x64-2d7d9a.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Windows-Portable-x64.zip"><img src="https://img.shields.io/badge/Portable-x64-67b7d1.svg?logo=windows"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>macOS</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-MacOS.dmg"><img src="https://img.shields.io/badge/DMG-Universal-ea005e.svg?logo=apple"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-MacOS-Installer.pkg"><img src="https://img.shields.io/badge/PKG-Universal-bc544b.svg?logo=apple" /></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-MacOS.dmg"><img src="https://img.shields.io/badge/DMG-Universal-ea005e.svg?logo=apple"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-MacOS-Installer.pkg"><img src="https://img.shields.io/badge/PKG-Universal-bc544b.svg?logo=apple" /></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Linux</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Linux-x64.AppImage"><img src="https://img.shields.io/badge/AppImage-x64-f84e29.svg?logo=linux"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Debian-x64.deb"><img src="https://img.shields.io/badge/DebPackage-x64-FF9966.svg?logo=debian"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-rpm-x64.rpm"><img src="https://img.shields.io/badge/RpmPackage-x64-F1B42F.svg?logo=redhat"> </a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Linux-x64.AppImage"><img src="https://img.shields.io/badge/AppImage-x64-f84e29.svg?logo=linux"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Debian-x64.deb"><img src="https://img.shields.io/badge/DebPackage-x64-FF9966.svg?logo=debian"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-rpm-x64.rpm"><img src="https://img.shields.io/badge/RpmPackage-x64-F1B42F.svg?logo=redhat"> </a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@@ -123,7 +123,7 @@ Vless, Vmess, Reality, TUIC, Hysteria, Wireguard, SSH, etc.
|
||||
|
||||
<div align="center">
|
||||
|
||||
[](https://hiddify.com/app/)
|
||||
[](https://hiddify.com/app/)
|
||||
|
||||
|
||||
</div>
|
||||
@@ -183,7 +183,7 @@ Agradecemos a todas as pessoas que estão participando deste projeto. Algumas pe
|
||||
</p>
|
||||
|
||||
<p align=center>
|
||||
<a href="https://github.com/hiddify/hiddify-next/graphs/contributors">
|
||||
<a href="https://github.com/hiddify/hiddify-app/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=hiddify/hiddify-next" />
|
||||
</a>
|
||||
</p>
|
||||
|
||||
+20
-20
@@ -4,12 +4,12 @@
|
||||
</div>
|
||||
<br>
|
||||
|
||||
<p align="center"><img src="https://github.com/hiddify/hiddify-next/assets/125398461/d821cfe0-b4c4-441f-be4e-eb9209f59542" /></p>
|
||||
<p align="center"><img src="https://github.com/hiddify/hiddify-app/assets/125398461/d821cfe0-b4c4-441f-be4e-eb9209f59542" /></p>
|
||||
<br>
|
||||
|
||||
<div align="center">
|
||||
|
||||
[](https://play.google.com/store/apps/details?id=app.hiddify.com) [](https://github.com/hiddify/hiddify-next/releases/)[](https://github.com/hiddify/hiddify-next/releases/)[](https://github.com/hiddify/hiddify-next/releases/)[](https://github.com/hiddify/hiddify-next/)
|
||||
[](https://play.google.com/store/apps/details?id=app.hiddify.com) [](https://github.com/hiddify/hiddify-app/releases/)[](https://github.com/hiddify/hiddify-app/releases/)[](https://github.com/hiddify/hiddify-app/releases/)[](https://github.com/hiddify/hiddify-app/)
|
||||
[](https://www.youtube.com/@hiddify)[](https://telegram.dog/hiddify)[](https://telegram.dog/hiddify_board/5)
|
||||
|
||||
</div>
|
||||
@@ -22,7 +22,7 @@
|
||||
<p dir="ltr" style="font-size: 16px">一款基于 <a href="https://github.com/SagerNet/sing-box">Sing-box</a> 通用代理工具的跨平台代理客户端。Hiddify 提供了较全面的代理功能,例如自动选择节点、TUN 模式、使用远程配置文件等。Hiddify 无广告,并且代码开源。它为大家自由访问互联网提供了一个支持多种协议的、安全且私密的工具。</p>
|
||||
|
||||
<div align=center>
|
||||
<img width=90% alt="English Demo" src="https://github.com/hiddify/hiddify-next/assets/125398461/ffe5346d-3404-470f-b5e0-4364e23743d2">
|
||||
<img width=90% alt="English Demo" src="https://github.com/hiddify/hiddify-app/assets/125398461/ffe5346d-3404-470f-b5e0-4364e23743d2">
|
||||
</div>
|
||||
|
||||
|
||||
@@ -53,8 +53,8 @@
|
||||
📱 官方商店有售
|
||||
|
||||
## 🛍️ 在商店购买
|
||||
<a href="https://play.google.com/store/apps/details?id=app.hiddify.com"><img height=50px src="https://github.com/hiddify/hiddify-next/blob/main/docs/google-play-badge.png"></a>
|
||||
<a href="https://apps.microsoft.com/detail/Hiddify/9pdfnl3qv2s5?mode=mini" target="_blank"><img height=50px src="https://github.com/hiddify/hiddify-next/assets/125398461/620750bb-4459-41b5-9f86-ba82119345b8" /></a>
|
||||
<a href="https://play.google.com/store/apps/details?id=app.hiddify.com"><img height=50px src="https://github.com/hiddify/hiddify-app/blob/main/docs/google-play-badge.png"></a>
|
||||
<a href="https://apps.microsoft.com/detail/Hiddify/9pdfnl3qv2s5?mode=mini" target="_blank"><img height=50px src="https://github.com/hiddify/hiddify-app/assets/125398461/620750bb-4459-41b5-9f86-ba82119345b8" /></a>
|
||||
|
||||
|
||||
## 📥 直接下载
|
||||
@@ -71,39 +71,39 @@
|
||||
<tr>
|
||||
<td>iOS</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-iOS.ipa"><img src="https://img.shields.io/badge/IPA-Universal-c0c0c0.svg?logo=ios"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-iOS.ipa"><img src="https://img.shields.io/badge/IPA-Universal-c0c0c0.svg?logo=ios"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Android</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-universal.apk"><img src="https://img.shields.io/badge/APK-Universal-044d29.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-arm64.apk"><img src="https://img.shields.io/badge/APK-ARMv8-168039.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-arm7.apk"><img src="https://img.shields.io/badge/APK-ARMv7-45bf55.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-x86_64.apk"><img src="https://img.shields.io/badge/APK-x64-96ed89.svg?logo=android"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-universal.apk"><img src="https://img.shields.io/badge/APK-Universal-044d29.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-arm64.apk"><img src="https://img.shields.io/badge/APK-ARMv8-168039.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-arm7.apk"><img src="https://img.shields.io/badge/APK-ARMv7-45bf55.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-x86_64.apk"><img src="https://img.shields.io/badge/APK-x64-96ed89.svg?logo=android"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Windows</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Setup-x64.Msix"><img src="https://img.shields.io/badge/OfficialSetup-x64-0078d7.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Setup-x64.exe"><img src="https://img.shields.io/badge/Setup-x64-2d7d9a.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Portable-x64.zip"><img src="https://img.shields.io/badge/Portable-x64-67b7d1.svg?logo=windows"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Windows-Setup-x64.Msix"><img src="https://img.shields.io/badge/OfficialSetup-x64-0078d7.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Windows-Setup-x64.exe"><img src="https://img.shields.io/badge/Setup-x64-2d7d9a.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Windows-Portable-x64.zip"><img src="https://img.shields.io/badge/Portable-x64-67b7d1.svg?logo=windows"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>macOS</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-MacOS.dmg"><img src="https://img.shields.io/badge/DMG-Universal-ea005e.svg?logo=apple"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-MacOS-Installer.pkg"><img src="https://img.shields.io/badge/PKG-Universal-bc544b.svg?logo=apple" /></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-MacOS.dmg"><img src="https://img.shields.io/badge/DMG-Universal-ea005e.svg?logo=apple"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-MacOS-Installer.pkg"><img src="https://img.shields.io/badge/PKG-Universal-bc544b.svg?logo=apple" /></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Linux</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Linux-x64.AppImage"><img src="https://img.shields.io/badge/AppImage-x64-f84e29.svg?logo=linux"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Debian-x64.deb"><img src="https://img.shields.io/badge/DebPackage-x64-FF9966.svg?logo=debian"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-rpm-x64.rpm"><img src="https://img.shields.io/badge/RpmPackage-x64-F1B42F.svg?logo=redhat"> </a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Linux-x64.AppImage"><img src="https://img.shields.io/badge/AppImage-x64-f84e29.svg?logo=linux"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Debian-x64.deb"><img src="https://img.shields.io/badge/DebPackage-x64-FF9966.svg?logo=debian"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-rpm-x64.rpm"><img src="https://img.shields.io/badge/RpmPackage-x64-F1B42F.svg?logo=redhat"> </a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@@ -118,7 +118,7 @@
|
||||
|
||||
<div align=center>
|
||||
|
||||
[](https://hiddify.com/app/)
|
||||
[](https://hiddify.com/app/)
|
||||
|
||||
</div>
|
||||
|
||||
@@ -179,7 +179,7 @@ Hiddify 是一个由社区驱动的项目。如果您有兴趣为本项目做出
|
||||
|
||||
|
||||
<p align=center>
|
||||
<a href="https://github.com/hiddify/hiddify-next/graphs/contributors">
|
||||
<a href="https://github.com/hiddify/hiddify-app/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=hiddify/hiddify-next" />
|
||||
</a>
|
||||
</p>
|
||||
|
||||
+21
-21
@@ -5,12 +5,12 @@
|
||||
</div>
|
||||
<br>
|
||||
|
||||
<p align="center"><img src="https://github.com/hiddify/hiddify-next/assets/125398461/d821cfe0-b4c4-441f-be4e-eb9209f59542" /></p>
|
||||
<p align="center"><img src="https://github.com/hiddify/hiddify-app/assets/125398461/d821cfe0-b4c4-441f-be4e-eb9209f59542" /></p>
|
||||
<br>
|
||||
|
||||
<div align="center">
|
||||
|
||||
[](https://play.google.com/store/apps/details?id=app.hiddify.com) [](https://github.com/hiddify/hiddify-next/releases/)[](https://github.com/hiddify/hiddify-next/releases/)[](https://github.com/hiddify/hiddify-next/releases/)[](https://github.com/hiddify/hiddify-next/)
|
||||
[](https://play.google.com/store/apps/details?id=app.hiddify.com) [](https://github.com/hiddify/hiddify-app/releases/)[](https://github.com/hiddify/hiddify-app/releases/)[](https://github.com/hiddify/hiddify-app/releases/)[](https://github.com/hiddify/hiddify-app/)
|
||||
[](https://www.youtube.com/@hiddify)[](https://telegram.dog/hiddify)[](https://telegram.dog/hiddify_board/5)
|
||||
|
||||
</div>
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
|
||||
<div align=center>
|
||||
<img width=90% alt="Farsi Demo" src="https://github.com/hiddify/hiddify-next/assets/125398461/cfdc4b0e-0a26-42f5-90ef-1d8587d2afd2">
|
||||
<img width=90% alt="Farsi Demo" src="https://github.com/hiddify/hiddify-app/assets/125398461/cfdc4b0e-0a26-42f5-90ef-1d8587d2afd2">
|
||||
|
||||
</div>
|
||||
|
||||
@@ -62,8 +62,8 @@ Vless, Vmess, Reality, TUIC, Hysteria, Wireguard, SSH, etc.
|
||||
## 🛍️ دریافت از استورها
|
||||
<div dir=rtl align=right>
|
||||
|
||||
<a href="https://play.google.com/store/apps/details?id=app.hiddify.com"><img height=50px src="https://github.com/hiddify/hiddify-next/blob/main/docs/google-play-badge.png"></a>
|
||||
<a href="https://apps.microsoft.com/detail/Hiddify/9pdfnl3qv2s5?mode=mini" target="_blank"><img height=50px src="https://github.com/hiddify/hiddify-next/assets/125398461/620750bb-4459-41b5-9f86-ba82119345b8" /></a>
|
||||
<a href="https://play.google.com/store/apps/details?id=app.hiddify.com"><img height=50px src="https://github.com/hiddify/hiddify-app/blob/main/docs/google-play-badge.png"></a>
|
||||
<a href="https://apps.microsoft.com/detail/Hiddify/9pdfnl3qv2s5?mode=mini" target="_blank"><img height=50px src="https://github.com/hiddify/hiddify-app/assets/125398461/620750bb-4459-41b5-9f86-ba82119345b8" /></a>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -81,38 +81,38 @@ Vless, Vmess, Reality, TUIC, Hysteria, Wireguard, SSH, etc.
|
||||
<tr>
|
||||
<td>iOS</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-iOS.ipa"><img src="https://img.shields.io/badge/IPA-Universal-c0c0c0.svg?logo=ios"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-iOS.ipa"><img src="https://img.shields.io/badge/IPA-Universal-c0c0c0.svg?logo=ios"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>اندروید</td><td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-universal.apk"><img src="https://img.shields.io/badge/APK-Universal-044d29.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-arm64.apk"><img src="https://img.shields.io/badge/APK-ARMv8-168039.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-arm7.apk"><img src="https://img.shields.io/badge/APK-ARMv7-45bf55.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-x86_64.apk"><img src="https://img.shields.io/badge/APK-x64-96ed89.svg?logo=android"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-universal.apk"><img src="https://img.shields.io/badge/APK-Universal-044d29.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-arm64.apk"><img src="https://img.shields.io/badge/APK-ARMv8-168039.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-arm7.apk"><img src="https://img.shields.io/badge/APK-ARMv7-45bf55.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-x86_64.apk"><img src="https://img.shields.io/badge/APK-x64-96ed89.svg?logo=android"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>ویندوز</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Setup-x64.Msix"><img src="https://img.shields.io/badge/OfficialSetup-x64-0078d7.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Setup-x64.exe"><img src="https://img.shields.io/badge/Setup-x64-2d7d9a.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Portable-x64.zip"><img src="https://img.shields.io/badge/Portable-x64-67b7d1.svg?logo=windows"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Windows-Setup-x64.Msix"><img src="https://img.shields.io/badge/OfficialSetup-x64-0078d7.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Windows-Setup-x64.exe"><img src="https://img.shields.io/badge/Setup-x64-2d7d9a.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Windows-Portable-x64.zip"><img src="https://img.shields.io/badge/Portable-x64-67b7d1.svg?logo=windows"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>مک</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-MacOS.dmg"><img src="https://img.shields.io/badge/DMG-Universal-ea005e.svg?logo=apple"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-MacOS-Installer.pkg"><img src="https://img.shields.io/badge/PKG-Universal-bc544b.svg?logo=apple" /></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-MacOS.dmg"><img src="https://img.shields.io/badge/DMG-Universal-ea005e.svg?logo=apple"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-MacOS-Installer.pkg"><img src="https://img.shields.io/badge/PKG-Universal-bc544b.svg?logo=apple" /></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>لینوکس</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Linux-x64.AppImage"><img src="https://img.shields.io/badge/AppImage-x64-f84e29.svg?logo=linux"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Debian-x64.deb"><img src="https://img.shields.io/badge/DebPackage-x64-FF9966.svg?logo=debian"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-rpm-x64.rpm"><img src="https://img.shields.io/badge/RpmPackage-x64-F1B42F.svg?logo=redhat"> </a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Linux-x64.AppImage"><img src="https://img.shields.io/badge/AppImage-x64-f84e29.svg?logo=linux"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Debian-x64.deb"><img src="https://img.shields.io/badge/DebPackage-x64-FF9966.svg?logo=debian"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-rpm-x64.rpm"><img src="https://img.shields.io/badge/RpmPackage-x64-F1B42F.svg?logo=redhat"> </a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@@ -123,7 +123,7 @@ Vless, Vmess, Reality, TUIC, Hysteria, Wireguard, SSH, etc.
|
||||
|
||||
<div align="center">
|
||||
|
||||
[](https://hiddify.com/fa/app/)
|
||||
[](https://hiddify.com/fa/app/)
|
||||
|
||||
</div>
|
||||
|
||||
@@ -132,7 +132,7 @@ Vless, Vmess, Reality, TUIC, Hysteria, Wireguard, SSH, etc.
|
||||
## 🌎 ترجمهها
|
||||
<div align=center>
|
||||
|
||||

|
||||

|
||||
</div>
|
||||
|
||||
با ویرایش دستی فایلهای JSON در assets/translations/ یا با استفاده از [ویرایشگر آنلاین Inlang](https://inlang.com/editor/github.com/hiddify/hiddify-next)، زبانهای موجود را بهبود بدهید و یا زبانهای جدید اضافه کنید.
|
||||
@@ -183,7 +183,7 @@ Vless, Vmess, Reality, TUIC, Hysteria, Wireguard, SSH, etc.
|
||||
</p>
|
||||
|
||||
<p align=center>
|
||||
<a href="https://github.com/hiddify/hiddify-next/graphs/contributors">
|
||||
<a href="https://github.com/hiddify/hiddify-app/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=hiddify/hiddify-next" />
|
||||
</a>
|
||||
</p>
|
||||
|
||||
+21
-21
@@ -6,16 +6,16 @@
|
||||
</div>
|
||||
<br>
|
||||
|
||||
<p align="center"><img src="https://github.com/hiddify/hiddify-next/assets/125398461/d821cfe0-b4c4-441f-be4e-eb9209f59542" /></p>
|
||||
<p align="center"><img src="https://github.com/hiddify/hiddify-app/assets/125398461/d821cfe0-b4c4-441f-be4e-eb9209f59542" /></p>
|
||||
<br>
|
||||
|
||||
<div align="center">
|
||||
|
||||
<!--
|
||||

|
||||

|
||||
-->
|
||||
|
||||
[](https://play.google.com/store/apps/details?id=app.hiddify.com) [](https://github.com/hiddify/hiddify-next/releases/)[](https://github.com/hiddify/hiddify-next/releases/)[](https://github.com/hiddify/hiddify-next/releases/)[](https://github.com/hiddify/hiddify-next/)
|
||||
[](https://play.google.com/store/apps/details?id=app.hiddify.com) [](https://github.com/hiddify/hiddify-app/releases/)[](https://github.com/hiddify/hiddify-app/releases/)[](https://github.com/hiddify/hiddify-app/releases/)[](https://github.com/hiddify/hiddify-app/)
|
||||
[](https://www.youtube.com/@hiddify)[](https://telegram.dog/hiddify)[](https://telegram.dog/hiddify_board/5)
|
||||
|
||||
</div>
|
||||
@@ -28,7 +28,7 @@
|
||||
<p dir="ltr" style="font-size: 16px"><a href="https://github.com/SagerNet/sing-box">Sing-box</a> ユニバーサルプロキシツールチェーンに基づくマルチプラットフォームプロキシクライアントです。Hiddify は、自動ノード選択、TUN モード、リモートプロファイルなど、幅広い機能を提供します。Hiddify は無料でオープンソースです。幅広いプロトコルをサポートし、無料インターネットにアクセスするための安全でプライベートな方法を提供します。</p>
|
||||
|
||||
<div align=center>
|
||||
<img width=90% alt="English Demo" src="https://github.com/hiddify/hiddify-next/assets/125398461/ffe5346d-3404-470f-b5e0-4364e23743d2">
|
||||
<img width=90% alt="English Demo" src="https://github.com/hiddify/hiddify-app/assets/125398461/ffe5346d-3404-470f-b5e0-4364e23743d2">
|
||||
|
||||
</div>
|
||||
|
||||
@@ -60,8 +60,8 @@ Vless、Vmess、Reality、TUIC、Hysteria、Wireguard、SSH など。
|
||||
📱公式ストアで購入可能
|
||||
|
||||
## 🛍️ 店舗で入手
|
||||
<a href="https://play.google.com/store/apps/details?id=app.hiddify.com"><img height=50px src="https://github.com/hiddify/hiddify-next/blob/main/docs/google-play-badge.png"></a>
|
||||
<a href="https://apps.microsoft.com/detail/Hiddify/9pdfnl3qv2s5?mode=mini" target="_blank"><img height=50px src="https://github.com/hiddify/hiddify-next/assets/125398461/620750bb-4459-41b5-9f86-ba82119345b8" /></a>
|
||||
<a href="https://play.google.com/store/apps/details?id=app.hiddify.com"><img height=50px src="https://github.com/hiddify/hiddify-app/blob/main/docs/google-play-badge.png"></a>
|
||||
<a href="https://apps.microsoft.com/detail/Hiddify/9pdfnl3qv2s5?mode=mini" target="_blank"><img height=50px src="https://github.com/hiddify/hiddify-app/assets/125398461/620750bb-4459-41b5-9f86-ba82119345b8" /></a>
|
||||
|
||||
|
||||
## 📥 直接ダウンロード
|
||||
@@ -78,39 +78,39 @@ Vless、Vmess、Reality、TUIC、Hysteria、Wireguard、SSH など。
|
||||
<tr>
|
||||
<td>iOS</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-iOS.ipa"><img src="https://img.shields.io/badge/IPA-Universal-c0c0c0.svg?logo=ios"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-iOS.ipa"><img src="https://img.shields.io/badge/IPA-Universal-c0c0c0.svg?logo=ios"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Android</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-universal.apk"><img src="https://img.shields.io/badge/APK-Universal-044d29.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-arm64.apk"><img src="https://img.shields.io/badge/APK-ARMv8-168039.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-arm7.apk"><img src="https://img.shields.io/badge/APK-ARMv7-45bf55.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-x86_64.apk"><img src="https://img.shields.io/badge/APK-x64-96ed89.svg?logo=android"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-universal.apk"><img src="https://img.shields.io/badge/APK-Universal-044d29.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-arm64.apk"><img src="https://img.shields.io/badge/APK-ARMv8-168039.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-arm7.apk"><img src="https://img.shields.io/badge/APK-ARMv7-45bf55.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-x86_64.apk"><img src="https://img.shields.io/badge/APK-x64-96ed89.svg?logo=android"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Windows</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Setup-x64.Msix"><img src="https://img.shields.io/badge/OfficialSetup-x64-0078d7.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Setup-x64.exe"><img src="https://img.shields.io/badge/Setup-x64-2d7d9a.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Portable-x64.zip"><img src="https://img.shields.io/badge/Portable-x64-67b7d1.svg?logo=windows"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Windows-Setup-x64.Msix"><img src="https://img.shields.io/badge/OfficialSetup-x64-0078d7.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Windows-Setup-x64.exe"><img src="https://img.shields.io/badge/Setup-x64-2d7d9a.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Windows-Portable-x64.zip"><img src="https://img.shields.io/badge/Portable-x64-67b7d1.svg?logo=windows"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>macOS</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-MacOS.dmg"><img src="https://img.shields.io/badge/DMG-Universal-ea005e.svg?logo=apple"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-MacOS-Installer.pkg"><img src="https://img.shields.io/badge/PKG-Universal-bc544b.svg?logo=apple" /></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-MacOS.dmg"><img src="https://img.shields.io/badge/DMG-Universal-ea005e.svg?logo=apple"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-MacOS-Installer.pkg"><img src="https://img.shields.io/badge/PKG-Universal-bc544b.svg?logo=apple" /></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Linux</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Linux-x64.AppImage"><img src="https://img.shields.io/badge/AppImage-x64-f84e29.svg?logo=linux"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Debian-x64.deb"><img src="https://img.shields.io/badge/DebPackage-x64-FF9966.svg?logo=debian"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-rpm-x64.rpm"><img src="https://img.shields.io/badge/RpmPackage-x64-F1B42F.svg?logo=redhat"> </a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Linux-x64.AppImage"><img src="https://img.shields.io/badge/AppImage-x64-f84e29.svg?logo=linux"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Debian-x64.deb"><img src="https://img.shields.io/badge/DebPackage-x64-FF9966.svg?logo=debian"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-rpm-x64.rpm"><img src="https://img.shields.io/badge/RpmPackage-x64-F1B42F.svg?logo=redhat"> </a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@@ -125,7 +125,7 @@ Vless、Vmess、Reality、TUIC、Hysteria、Wireguard、SSH など。
|
||||
|
||||
<div align="center">
|
||||
|
||||
[](https://hiddify.com/app/)
|
||||
[](https://hiddify.com/app/)
|
||||
|
||||
|
||||
</div>
|
||||
@@ -185,7 +185,7 @@ Hiddify はコミュニティドリブンのプロジェクトです。コント
|
||||
</p>
|
||||
|
||||
<p align=center>
|
||||
<a href="https://github.com/hiddify/hiddify-next/graphs/contributors">
|
||||
<a href="https://github.com/hiddify/hiddify-app/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=hiddify/hiddify-next" />
|
||||
</a>
|
||||
</p>
|
||||
|
||||
+20
-20
@@ -6,12 +6,12 @@
|
||||
</div>
|
||||
<br>
|
||||
|
||||
<p align="center"><img src="https://github.com/hiddify/hiddify-next/assets/125398461/d821cfe0-b4c4-441f-be4e-eb9209f59542" /></p>
|
||||
<p align="center"><img src="https://github.com/hiddify/hiddify-app/assets/125398461/d821cfe0-b4c4-441f-be4e-eb9209f59542" /></p>
|
||||
<br>
|
||||
|
||||
<div align="center">
|
||||
|
||||
[](https://play.google.com/store/apps/details?id=app.hiddify.com) [](https://github.com/hiddify/hiddify-next/releases/)[](https://github.com/hiddify/hiddify-next/releases/)[](https://github.com/hiddify/hiddify-next/releases/)[](https://github.com/hiddify/hiddify-next/)
|
||||
[](https://play.google.com/store/apps/details?id=app.hiddify.com) [](https://github.com/hiddify/hiddify-app/releases/)[](https://github.com/hiddify/hiddify-app/releases/)[](https://github.com/hiddify/hiddify-app/releases/)[](https://github.com/hiddify/hiddify-app/)
|
||||
[](https://www.youtube.com/@hiddify)[](https://telegram.dog/hiddify)[](https://telegram.dog/hiddify_board/5)
|
||||
|
||||
</div>
|
||||
@@ -20,7 +20,7 @@
|
||||
Кроссплатформенный прокси-клиент на основе ядра [Sing-box](https://github.com/SagerNet/sing-box). Hiddify предлагает широкий спектр возможностей, таких как автоматический выбор узла, режим TUN, удалённые конфигурации (подписки). Приложение с открытым исходным кодом, без рекламы. Поддерживая широкий спектр протоколов, мы обеспечиваем безопасный и конфиденциальный доступ к свободному интернету.
|
||||
|
||||
<div align=center>
|
||||
<img width=90% alt="English Demo" src="https://github.com/hiddify/hiddify-next/assets/125398461/1b592bf9-b19f-4592-b02d-a3fa6216d257">
|
||||
<img width=90% alt="English Demo" src="https://github.com/hiddify/hiddify-app/assets/125398461/1b592bf9-b19f-4592-b02d-a3fa6216d257">
|
||||
</div>
|
||||
|
||||
## 🚀 Основные особенности
|
||||
@@ -49,8 +49,8 @@
|
||||
📱Доступно в официальных магазинах.
|
||||
|
||||
## 🛍️ Приобретите в магазинах
|
||||
<a href="https://play.google.com/store/apps/details?id=app.hiddify.com"><img height=50px src="https://github.com/hiddify/hiddify-next/blob/main/docs/google-play-badge.png"></a>
|
||||
<a href="https://apps.microsoft.com/detail/Hiddify/9pdfnl3qv2s5?mode=mini" target="_blank"><img height=50px src="https://github.com/hiddify/hiddify-next/assets/125398461/620750bb-4459-41b5-9f86-ba82119345b8" /></a>
|
||||
<a href="https://play.google.com/store/apps/details?id=app.hiddify.com"><img height=50px src="https://github.com/hiddify/hiddify-app/blob/main/docs/google-play-badge.png"></a>
|
||||
<a href="https://apps.microsoft.com/detail/Hiddify/9pdfnl3qv2s5?mode=mini" target="_blank"><img height=50px src="https://github.com/hiddify/hiddify-app/assets/125398461/620750bb-4459-41b5-9f86-ba82119345b8" /></a>
|
||||
|
||||
|
||||
## 📥 Прямая загрузка
|
||||
@@ -66,39 +66,39 @@
|
||||
<tr>
|
||||
<td>iOS</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-iOS.ipa"><img src="https://img.shields.io/badge/IPA-Universal-c0c0c0.svg?logo=ios"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-iOS.ipa"><img src="https://img.shields.io/badge/IPA-Universal-c0c0c0.svg?logo=ios"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Android</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-universal.apk"><img src="https://img.shields.io/badge/APK-Universal-044d29.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-arm64.apk"><img src="https://img.shields.io/badge/APK-ARMv8-168039.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-arm7.apk"><img src="https://img.shields.io/badge/APK-ARMv7-45bf55.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Android-x86_64.apk"><img src="https://img.shields.io/badge/APK-x64-96ed89.svg?logo=android"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-universal.apk"><img src="https://img.shields.io/badge/APK-Universal-044d29.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-arm64.apk"><img src="https://img.shields.io/badge/APK-ARMv8-168039.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-arm7.apk"><img src="https://img.shields.io/badge/APK-ARMv7-45bf55.svg?logo=android"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Android-x86_64.apk"><img src="https://img.shields.io/badge/APK-x64-96ed89.svg?logo=android"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Windows</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Setup-x64.Msix"><img src="https://img.shields.io/badge/OfficialSetup-x64-0078d7.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Setup-x64.exe"><img src="https://img.shields.io/badge/Setup-x64-2d7d9a.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Windows-Portable-x64.zip"><img src="https://img.shields.io/badge/Portable-x64-67b7d1.svg?logo=windows"></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Windows-Setup-x64.Msix"><img src="https://img.shields.io/badge/OfficialSetup-x64-0078d7.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Windows-Setup-x64.exe"><img src="https://img.shields.io/badge/Setup-x64-2d7d9a.svg?logo=windows"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Windows-Portable-x64.zip"><img src="https://img.shields.io/badge/Portable-x64-67b7d1.svg?logo=windows"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>MacOS</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-MacOS.dmg"><img src="https://img.shields.io/badge/DMG-Universal-ea005e.svg?logo=apple"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-MacOS-Installer.pkg"><img src="https://img.shields.io/badge/PKG-Universal-bc544b.svg?logo=apple" /></a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-MacOS.dmg"><img src="https://img.shields.io/badge/DMG-Universal-ea005e.svg?logo=apple"></a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-MacOS-Installer.pkg"><img src="https://img.shields.io/badge/PKG-Universal-bc544b.svg?logo=apple" /></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Linux</td>
|
||||
<td>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Linux-x64.AppImage"><img src="https://img.shields.io/badge/AppImage-x64-f84e29.svg?logo=linux"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-Debian-x64.deb"><img src="https://img.shields.io/badge/DebPackage-x64-FF9966.svg?logo=debian"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-next/releases/latest/download/Hiddify-rpm-x64.rpm"><img src="https://img.shields.io/badge/RpmPackage-x64-F1B42F.svg?logo=redhat"> </a>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Linux-x64.AppImage"><img src="https://img.shields.io/badge/AppImage-x64-f84e29.svg?logo=linux"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-Debian-x64.deb"><img src="https://img.shields.io/badge/DebPackage-x64-FF9966.svg?logo=debian"> </a><br>
|
||||
<a href="https://github.com/hiddify/hiddify-app/releases/latest/download/Hiddify-rpm-x64.rpm"><img src="https://img.shields.io/badge/RpmPackage-x64-F1B42F.svg?logo=redhat"> </a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@@ -110,7 +110,7 @@
|
||||
|
||||
<div align="center" width="100%">
|
||||
|
||||
[](https://hiddify.com/app/)
|
||||
[](https://hiddify.com/app/)
|
||||
|
||||
</div>
|
||||
|
||||
@@ -170,7 +170,7 @@ Hiddify - это проект, развиваемый сообществом. Е
|
||||
</p>
|
||||
|
||||
<p align=center>
|
||||
<a href="https://github.com/hiddify/hiddify-next/graphs/contributors">
|
||||
<a href="https://github.com/hiddify/hiddify-app/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=hiddify/hiddify-next" />
|
||||
</a>
|
||||
</p>
|
||||
|
||||
@@ -254,14 +254,14 @@ class BoxService(
|
||||
fileDescriptor = null
|
||||
}
|
||||
// commandServer?.setService(null)
|
||||
// boxService?.apply {
|
||||
// runCatching {
|
||||
// close()
|
||||
// }.onFailure {
|
||||
// writeLog("service: error when closing: $it")
|
||||
// }
|
||||
// Seq.destroyRef(refnum)
|
||||
// }
|
||||
boxService?.apply {
|
||||
runCatching {
|
||||
close()
|
||||
}.onFailure {
|
||||
writeLog("service: error when closing: $it")
|
||||
}
|
||||
Seq.destroyRef(refnum)
|
||||
}
|
||||
Mobile.close(4L)
|
||||
// boxService = null
|
||||
Libbox.registerLocalDNSTransport(null)
|
||||
|
||||
+10
-3
@@ -13,21 +13,28 @@
|
||||
<title>Version 0.13.6</title>
|
||||
<pubDate>Sun, 7 Jan 2024 22:00:00 +0000</pubDate>
|
||||
<enclosure
|
||||
url="https://github.com/hiddify/hiddify-next/releases/download/v0.13.6/hiddify-windows-x64-setup.zip"
|
||||
url="hhttps://apps.apple.com/us/app/hiddify-proxy-vpn/id6596777532"
|
||||
sparkle:version="0.13.6" sparkle:os="ios" />
|
||||
</item>
|
||||
<item>
|
||||
<title>Version 0.13.6</title>
|
||||
<pubDate>Sun, 7 Jan 2024 22:00:00 +0000</pubDate>
|
||||
<enclosure
|
||||
url="https://github.com/hiddify/hiddify-app/releases/download/v0.13.6/hiddify-windows-x64-setup.zip"
|
||||
sparkle:version="0.13.6" sparkle:os="windows" />
|
||||
</item>
|
||||
<item>
|
||||
<title>Version 0.13.6</title>
|
||||
<pubDate>Sun, 7 Jan 2024 22:00:00 +0000</pubDate>
|
||||
<enclosure
|
||||
url="https://github.com/hiddify/hiddify-next/releases/download/v0.13.6/hiddify-macos-universal.zip"
|
||||
url="https://github.com/hiddify/hiddify-app/releases/download/v0.13.6/hiddify-macos-universal.zip"
|
||||
sparkle:version="0.13.6" sparkle:os="macos" />
|
||||
</item>
|
||||
<item>
|
||||
<title>Version 0.13.6</title>
|
||||
<pubDate>Sun, 7 Jan 2024 22:00:00 +0000</pubDate>
|
||||
<enclosure
|
||||
url="https://github.com/hiddify/hiddify-next/releases/download/v0.13.6/hiddify-linux-x64.zip"
|
||||
url="https://github.com/hiddify/hiddify-app/releases/download/v0.13.6/hiddify-linux-x64.zip"
|
||||
sparkle:version="0.13.6" sparkle:os="linux" />
|
||||
</item>
|
||||
</channel>
|
||||
|
||||
+18
-18
@@ -61,13 +61,13 @@ PODS:
|
||||
- GoogleToolboxForMac/Defines (= 4.2.1)
|
||||
- "GoogleToolboxForMac/NSData+zlib (4.2.1)":
|
||||
- GoogleToolboxForMac/Defines (= 4.2.1)
|
||||
- GoogleUtilities/Environment (8.0.2):
|
||||
- GoogleUtilities/Environment (8.1.0):
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Logger (8.0.2):
|
||||
- GoogleUtilities/Logger (8.1.0):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/Privacy
|
||||
- GoogleUtilities/Privacy (8.0.2)
|
||||
- GoogleUtilities/UserDefaults (8.0.2):
|
||||
- GoogleUtilities/Privacy (8.1.0)
|
||||
- GoogleUtilities/UserDefaults (8.1.0):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Privacy
|
||||
- GTMSessionFetcher/Core (3.5.0)
|
||||
@@ -110,9 +110,9 @@ PODS:
|
||||
- pointer_interceptor_ios (0.0.1):
|
||||
- Flutter
|
||||
- PromisesObjC (2.4.0)
|
||||
- SDWebImage (5.21.0):
|
||||
- SDWebImage/Core (= 5.21.0)
|
||||
- SDWebImage/Core (5.21.0)
|
||||
- SDWebImage (5.21.3):
|
||||
- SDWebImage/Core (= 5.21.3)
|
||||
- SDWebImage/Core (5.21.3)
|
||||
- Sentry/HybridSDK (8.46.0)
|
||||
- sentry_flutter (8.14.0):
|
||||
- Flutter
|
||||
@@ -123,16 +123,16 @@ PODS:
|
||||
- shared_preferences_foundation (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- sqlite3 (3.49.1):
|
||||
- sqlite3/common (= 3.49.1)
|
||||
- sqlite3/common (3.49.1)
|
||||
- sqlite3/dbstatvtab (3.49.1):
|
||||
- sqlite3 (3.49.2):
|
||||
- sqlite3/common (= 3.49.2)
|
||||
- sqlite3/common (3.49.2)
|
||||
- sqlite3/dbstatvtab (3.49.2):
|
||||
- sqlite3/common
|
||||
- sqlite3/fts5 (3.49.1):
|
||||
- sqlite3/fts5 (3.49.2):
|
||||
- sqlite3/common
|
||||
- sqlite3/perf-threadsafe (3.49.1):
|
||||
- sqlite3/perf-threadsafe (3.49.2):
|
||||
- sqlite3/common
|
||||
- sqlite3/rtree (3.49.1):
|
||||
- sqlite3/rtree (3.49.2):
|
||||
- sqlite3/common
|
||||
- sqlite3_flutter_libs (0.0.1):
|
||||
- Flutter
|
||||
@@ -240,14 +240,14 @@ SPEC CHECKSUMS:
|
||||
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
|
||||
EasyPermissionX: ff4c438f6ee80488f873b4cb921e32d982523067
|
||||
file_picker: b159e0c068aef54932bb15dc9fd1571818edaf49
|
||||
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
|
||||
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
|
||||
flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069
|
||||
flutter_native_splash: df59bb2e1421aa0282cb2e95618af4dcb0c56c29
|
||||
flutter_timezone: ac3da59ac941ff1c98a2e1f0293420e020120282
|
||||
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
||||
GoogleMLKit: eff9e23ec1d90ea4157a1ee2e32a4f610c5b3318
|
||||
GoogleToolboxForMac: d1a2cbf009c453f4d6ded37c105e2f67a32206d8
|
||||
GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d
|
||||
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
|
||||
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
|
||||
in_app_review: a31b5257259646ea78e0e35fc914979b0031d011
|
||||
MLImage: 0ad1c5f50edd027672d8b26b0fee78a8b4a0fc56
|
||||
@@ -262,12 +262,12 @@ SPEC CHECKSUMS:
|
||||
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
|
||||
pointer_interceptor_ios: 508241697ff0947f853c061945a8b822463947c1
|
||||
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
|
||||
SDWebImage: f84b0feeb08d2d11e6a9b843cb06d75ebf5b8868
|
||||
SDWebImage: 16309af6d214ba3f77a7c6f6fdda888cb313a50a
|
||||
Sentry: da60d980b197a46db0b35ea12cb8f39af48d8854
|
||||
sentry_flutter: 187f9b6b06f00f36b4930ec7ea9f34c254095d15
|
||||
share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f
|
||||
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
|
||||
sqlite3: fc1400008a9b3525f5914ed715a5d1af0b8f4983
|
||||
sqlite3: 3c950dc86011117c307eb0b28c4a7bb449dce9f1
|
||||
sqlite3_flutter_libs: cc304edcb8e1d8c595d1b08c7aeb46a47691d9db
|
||||
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
|
||||
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
@@ -54,11 +55,13 @@
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
enableGPUValidationMode = "1"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
|
||||
+30
-90
@@ -30,10 +30,7 @@ import 'package:hiddify/utils/utils.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:sentry_flutter/sentry_flutter.dart';
|
||||
|
||||
Future<void> lazyBootstrap(
|
||||
WidgetsBinding widgetsBinding,
|
||||
Environment env,
|
||||
) async {
|
||||
Future<void> lazyBootstrap(WidgetsBinding widgetsBinding, Environment env) async {
|
||||
if (!kIsWeb) {
|
||||
FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
|
||||
}
|
||||
@@ -43,48 +40,28 @@ Future<void> lazyBootstrap(
|
||||
|
||||
final stopWatch = Stopwatch()..start();
|
||||
|
||||
final container = ProviderContainer(
|
||||
overrides: [
|
||||
environmentProvider.overrideWithValue(env),
|
||||
],
|
||||
);
|
||||
final container = ProviderContainer(overrides: [environmentProvider.overrideWithValue(env)]);
|
||||
|
||||
await _init(
|
||||
"directories",
|
||||
() => container.read(appDirectoriesProvider.future),
|
||||
);
|
||||
await _init("directories", () => container.read(appDirectoriesProvider.future));
|
||||
LoggerController.init(container.read(logPathResolverProvider).appFile().path);
|
||||
|
||||
final appInfo = await _init(
|
||||
"app info",
|
||||
() => container.read(appInfoProvider.future),
|
||||
);
|
||||
await _init(
|
||||
"preferences",
|
||||
() => container.read(sharedPreferencesProvider.future),
|
||||
);
|
||||
final appInfo = await _init("app info", () => container.read(appInfoProvider.future));
|
||||
await _init("preferences", () => container.read(sharedPreferencesProvider.future));
|
||||
|
||||
final enableAnalytics = await container.read(analyticsControllerProvider.future);
|
||||
if (enableAnalytics) {
|
||||
await _init(
|
||||
"analytics",
|
||||
() => container.read(analyticsControllerProvider.notifier).enableAnalytics(),
|
||||
);
|
||||
await _init("analytics", () => container.read(analyticsControllerProvider.notifier).enableAnalytics());
|
||||
}
|
||||
|
||||
await _init(
|
||||
"preferences migration",
|
||||
() async {
|
||||
try {
|
||||
await PreferencesMigration(
|
||||
sharedPreferences: container.read(sharedPreferencesProvider).requireValue,
|
||||
).migrate();
|
||||
} catch (e, stackTrace) {
|
||||
Logger.bootstrap.error("preferences migration failed", e, stackTrace);
|
||||
if (env == Environment.dev) rethrow;
|
||||
Logger.bootstrap.info("clearing preferences");
|
||||
await container.read(sharedPreferencesProvider).requireValue.clear();
|
||||
}
|
||||
await _init("preferences migration", () async {
|
||||
try {
|
||||
await PreferencesMigration(sharedPreferences: container.read(sharedPreferencesProvider).requireValue).migrate();
|
||||
} catch (e, stackTrace) {
|
||||
Logger.bootstrap.error("preferences migration failed", e, stackTrace);
|
||||
if (env == Environment.dev) rethrow;
|
||||
Logger.bootstrap.info("clearing preferences");
|
||||
await container.read(sharedPreferencesProvider).requireValue.clear();
|
||||
}
|
||||
});
|
||||
|
||||
await _init("db migration from v1 to v2", () async {
|
||||
@@ -107,10 +84,7 @@ Future<void> lazyBootstrap(
|
||||
final debug = container.read(debugModeNotifierProvider) || kDebugMode;
|
||||
|
||||
if (PlatformUtils.isDesktop) {
|
||||
await _init(
|
||||
"window controller",
|
||||
() => container.read(windowNotifierProvider.future),
|
||||
);
|
||||
await _init("window controller", () => container.read(windowNotifierProvider.future));
|
||||
|
||||
final silentStart = container.read(Preferences.silentStart);
|
||||
Logger.bootstrap.debug("silent start [${silentStart ? "Enabled" : "Disabled"}]");
|
||||
@@ -119,38 +93,19 @@ Future<void> lazyBootstrap(
|
||||
} else {
|
||||
Logger.bootstrap.debug("silent start, remain hidden accessible via tray");
|
||||
}
|
||||
await _init(
|
||||
"auto start service",
|
||||
() => container.read(autoStartNotifierProvider.future),
|
||||
);
|
||||
await _init("auto start service", () => container.read(autoStartNotifierProvider.future));
|
||||
}
|
||||
await _init(
|
||||
"logs repository",
|
||||
() => container.read(logRepositoryProvider.future),
|
||||
);
|
||||
await _init("logs repository", () => container.read(logRepositoryProvider.future));
|
||||
await _init("logger controller", () => LoggerController.postInit(debug));
|
||||
|
||||
Logger.bootstrap.info(appInfo.format());
|
||||
|
||||
await _init(
|
||||
"profile repository",
|
||||
() => container.read(profileRepositoryProvider.future),
|
||||
);
|
||||
await _init("profile repository", () => container.read(profileRepositoryProvider.future));
|
||||
|
||||
await _init(
|
||||
"translations",
|
||||
() => container.read(translationsProvider.future),
|
||||
);
|
||||
await _init("translations", () => container.read(translationsProvider.future));
|
||||
|
||||
await _safeInit(
|
||||
"active profile",
|
||||
() => container.read(activeProfileProvider.future),
|
||||
timeout: 1000,
|
||||
);
|
||||
await _init(
|
||||
"sing-box",
|
||||
() => container.read(hiddifyCoreServiceProvider).init(ref: container),
|
||||
);
|
||||
await _safeInit("active profile", () => container.read(activeProfileProvider.future), timeout: 1000);
|
||||
await _init("hiddify-core", () => container.read(hiddifyCoreServiceProvider).init(ref: container));
|
||||
if (!kIsWeb) {
|
||||
// await _safeInit(
|
||||
// "deep link service",
|
||||
@@ -167,12 +122,9 @@ Future<void> lazyBootstrap(
|
||||
// }
|
||||
|
||||
if (Platform.isAndroid) {
|
||||
await _safeInit(
|
||||
"android display mode",
|
||||
() async {
|
||||
await FlutterDisplayMode.setHighRefreshRate();
|
||||
},
|
||||
);
|
||||
await _safeInit("android display mode", () async {
|
||||
await FlutterDisplayMode.setHighRefreshRate();
|
||||
});
|
||||
}
|
||||
}
|
||||
Logger.bootstrap.info("bootstrap took [${stopWatch.elapsedMilliseconds}ms]");
|
||||
@@ -181,26 +133,18 @@ Future<void> lazyBootstrap(
|
||||
runApp(
|
||||
ProviderScope(
|
||||
parent: container,
|
||||
observers: [
|
||||
RiverpodObserver(),
|
||||
],
|
||||
child: SentryUserInteractionWidget(
|
||||
child: const App(),
|
||||
),
|
||||
observers: [RiverpodObserver()],
|
||||
child: SentryUserInteractionWidget(child: const App()),
|
||||
),
|
||||
);
|
||||
|
||||
if (!kIsWeb) {
|
||||
FlutterNativeSplash.remove();
|
||||
}
|
||||
SentryFlutter.setAppStartEnd(DateTime.now().toUtc());
|
||||
// SentryFlutter.setAppStartEnd(DateTime.now().toUtc());
|
||||
}
|
||||
|
||||
Future<T> _init<T>(
|
||||
String name,
|
||||
Future<T> Function() initializer, {
|
||||
int? timeout,
|
||||
}) async {
|
||||
Future<T> _init<T>(String name, Future<T> Function() initializer, {int? timeout}) async {
|
||||
final stopWatch = Stopwatch()..start();
|
||||
Logger.bootstrap.info("initializing [$name]");
|
||||
Future<T> func() => timeout != null ? initializer().timeout(Duration(milliseconds: timeout)) : initializer();
|
||||
@@ -216,11 +160,7 @@ Future<T> _init<T>(
|
||||
}
|
||||
}
|
||||
|
||||
Future<T?> _safeInit<T>(
|
||||
String name,
|
||||
Future<T> Function() initializer, {
|
||||
int? timeout,
|
||||
}) async {
|
||||
Future<T?> _safeInit<T>(String name, Future<T> Function() initializer, {int? timeout}) async {
|
||||
try {
|
||||
return await _init(name, initializer, timeout: timeout);
|
||||
} catch (e) {
|
||||
|
||||
@@ -39,24 +39,22 @@ class AnalyticsController extends _$AnalyticsController with AppLogger {
|
||||
final sentryLogger = SentryLoggyIntegration();
|
||||
LoggerController.instance.addPrinter("analytics", sentryLogger);
|
||||
|
||||
await SentryFlutter.init(
|
||||
(options) {
|
||||
options.dsn = dsn;
|
||||
// options.environment = env.name;
|
||||
// options.dist = appInfo.release.name;
|
||||
options.debug = kDebugMode;
|
||||
options.enableNativeCrashHandling = true;
|
||||
options.enableNdkScopeSync = true;
|
||||
options.autoAppStart = false;
|
||||
// options.attachScreenshot = true;
|
||||
options.serverName = "";
|
||||
options.attachThreads = true;
|
||||
options.tracesSampleRate = 0.20;
|
||||
options.enableUserInteractionTracing = true;
|
||||
options.addIntegration(sentryLogger);
|
||||
options.beforeSend = sentryBeforeSend;
|
||||
},
|
||||
);
|
||||
await SentryFlutter.init((options) {
|
||||
options.dsn = dsn;
|
||||
// options.environment = env.name;
|
||||
// options.dist = appInfo.release.name;
|
||||
options.debug = kDebugMode;
|
||||
options.enableNativeCrashHandling = true;
|
||||
options.enableNdkScopeSync = true;
|
||||
options.autoAppStart = false;
|
||||
// options.attachScreenshot = true;
|
||||
options.serverName = "";
|
||||
options.attachThreads = true;
|
||||
options.tracesSampleRate = 0.20;
|
||||
options.enableUserInteractionTracing = true;
|
||||
options.addIntegration(sentryLogger);
|
||||
options.beforeSend = sentryBeforeSend;
|
||||
});
|
||||
|
||||
state = const AsyncData(true);
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ abstract class Constants {
|
||||
static const githubUrl = "https://github.com/hiddify/hiddify-next";
|
||||
static const licenseUrl = "https://github.com/hiddify/hiddify-next?tab=License-1-ov-file#readme";
|
||||
static const githubReleasesApiUrl = "https://api.github.com/repos/hiddify/hiddify-next/releases";
|
||||
static const githubLatestReleaseUrl = "https://github.com/hiddify/hiddify-next/releases/latest";
|
||||
static const githubLatestReleaseUrl = "https://github.com/hiddify/hiddify-app/releases/latest";
|
||||
static const appCastUrl = "https://raw.githubusercontent.com/hiddify/hiddify-next/main/appcast.xml";
|
||||
static const telegramChannelUrl = "https://t.me/hiddify";
|
||||
static const privacyPolicyUrl = "https://hiddify.com/privacy-policy/";
|
||||
@@ -54,11 +54,7 @@ abstract class IntroConst {
|
||||
static const termsAndConditionsKey = 'terms-and-conditions';
|
||||
static const githubKey = 'github';
|
||||
static const licenseKey = 'license';
|
||||
static const url = <String, String>{
|
||||
IntroConst.termsAndConditionsKey: Constants.termsAndConditionsUrl,
|
||||
IntroConst.githubKey: Constants.githubUrl,
|
||||
IntroConst.licenseKey: Constants.licenseUrl,
|
||||
};
|
||||
static const url = <String, String>{IntroConst.termsAndConditionsKey: Constants.termsAndConditionsUrl, IntroConst.githubKey: Constants.githubUrl, IntroConst.licenseKey: Constants.licenseUrl};
|
||||
}
|
||||
|
||||
abstract class WarpConst {
|
||||
@@ -67,30 +63,12 @@ abstract class WarpConst {
|
||||
static const warpConsentGiven = "warp-consent-given";
|
||||
static const warpTermsOfServiceKey = 'warp-terms-of-service';
|
||||
static const warpPrivacyPolicyKey = 'warp-privacy-policy';
|
||||
static const url = <String, String>{
|
||||
WarpConst.warpTermsOfServiceKey: Constants.cfWarpTermsOfService,
|
||||
WarpConst.warpPrivacyPolicyKey: Constants.cfWarpPrivacyPolicy,
|
||||
};
|
||||
static const url = <String, String>{WarpConst.warpTermsOfServiceKey: Constants.cfWarpTermsOfService, WarpConst.warpPrivacyPolicyKey: Constants.cfWarpPrivacyPolicy};
|
||||
}
|
||||
|
||||
abstract class KeyboardConst {
|
||||
static final allArrows = {
|
||||
LogicalKeyboardKey.arrowUp,
|
||||
LogicalKeyboardKey.arrowDown,
|
||||
LogicalKeyboardKey.arrowLeft,
|
||||
LogicalKeyboardKey.arrowRight,
|
||||
};
|
||||
static final horizontalArrows = {
|
||||
LogicalKeyboardKey.arrowLeft,
|
||||
LogicalKeyboardKey.arrowRight,
|
||||
};
|
||||
static final verticalArrows = {
|
||||
LogicalKeyboardKey.arrowUp,
|
||||
LogicalKeyboardKey.arrowDown,
|
||||
};
|
||||
static final select = {
|
||||
LogicalKeyboardKey.select,
|
||||
LogicalKeyboardKey.enter,
|
||||
LogicalKeyboardKey.tab,
|
||||
};
|
||||
static final allArrows = {LogicalKeyboardKey.arrowUp, LogicalKeyboardKey.arrowDown, LogicalKeyboardKey.arrowLeft, LogicalKeyboardKey.arrowRight};
|
||||
static final horizontalArrows = {LogicalKeyboardKey.arrowLeft, LogicalKeyboardKey.arrowRight};
|
||||
static final verticalArrows = {LogicalKeyboardKey.arrowUp, LogicalKeyboardKey.arrowDown};
|
||||
static final select = {LogicalKeyboardKey.select, LogicalKeyboardKey.enter, LogicalKeyboardKey.tab};
|
||||
}
|
||||
|
||||
@@ -4,14 +4,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
class PreferencesEntry<T, P> with InfraLogger {
|
||||
PreferencesEntry({
|
||||
required this.preferences,
|
||||
required this.key,
|
||||
required this.defaultValue,
|
||||
this.mapFrom,
|
||||
this.mapTo,
|
||||
this.validator,
|
||||
});
|
||||
PreferencesEntry({required this.preferences, required this.key, required this.defaultValue, this.mapFrom, this.mapTo, this.validator});
|
||||
|
||||
final SharedPreferences preferences;
|
||||
final String key;
|
||||
@@ -22,7 +15,7 @@ class PreferencesEntry<T, P> with InfraLogger {
|
||||
|
||||
T read() {
|
||||
try {
|
||||
loggy.debug("getting persisted preference [$key]($T)");
|
||||
// loggy.debug("getting persisted preference [$key]($T)");
|
||||
final T value;
|
||||
if (mapFrom != null) {
|
||||
final persisted = preferences.get(key) as P?;
|
||||
@@ -93,55 +86,36 @@ class PreferencesEntry<T, P> with InfraLogger {
|
||||
}
|
||||
|
||||
class PreferencesNotifier<T, P> extends StateNotifier<T> {
|
||||
PreferencesNotifier._({
|
||||
required Ref ref,
|
||||
required this.entry,
|
||||
this.overrideValue,
|
||||
this.possibleValues,
|
||||
}) : _ref = ref,
|
||||
super(overrideValue ?? entry.read());
|
||||
PreferencesNotifier._({required Ref ref, required this.entry, this.overrideValue, this.possibleValues}) : _ref = ref, super(overrideValue ?? entry.read());
|
||||
|
||||
final Ref _ref;
|
||||
final PreferencesEntry<T, P> entry;
|
||||
final T? overrideValue;
|
||||
final List<T>? possibleValues;
|
||||
|
||||
static StateNotifierProvider<PreferencesNotifier<T, P>, T> create<T, P>(String key, T defaultValue,
|
||||
{T Function(Ref ref)? defaultValueFunction, T Function(P value)? mapFrom, P Function(T value)? mapTo, bool Function(T value)? validator, T? overrideValue, List<T>? possibleValues}) =>
|
||||
StateNotifierProvider(
|
||||
(ref) => PreferencesNotifier._(
|
||||
ref: ref,
|
||||
entry: PreferencesEntry<T, P>(
|
||||
preferences: ref.read(sharedPreferencesProvider).requireValue,
|
||||
key: key,
|
||||
defaultValue: defaultValueFunction?.call(ref) ?? defaultValue,
|
||||
mapFrom: mapFrom,
|
||||
mapTo: mapTo,
|
||||
validator: validator,
|
||||
),
|
||||
overrideValue: overrideValue,
|
||||
possibleValues: possibleValues),
|
||||
);
|
||||
|
||||
static AutoDisposeStateNotifierProvider<PreferencesNotifier<T, P>, T> createAutoDispose<T, P>(
|
||||
static StateNotifierProvider<PreferencesNotifier<T, P>, T> create<T, P>(
|
||||
String key,
|
||||
T defaultValue, {
|
||||
T Function(Ref ref)? defaultValueFunction,
|
||||
T Function(P value)? mapFrom,
|
||||
P Function(T value)? mapTo,
|
||||
bool Function(T value)? validator,
|
||||
T? overrideValue,
|
||||
}) =>
|
||||
List<T>? possibleValues,
|
||||
}) => StateNotifierProvider(
|
||||
(ref) => PreferencesNotifier._(
|
||||
ref: ref,
|
||||
entry: PreferencesEntry<T, P>(preferences: ref.read(sharedPreferencesProvider).requireValue, key: key, defaultValue: defaultValueFunction?.call(ref) ?? defaultValue, mapFrom: mapFrom, mapTo: mapTo, validator: validator),
|
||||
overrideValue: overrideValue,
|
||||
possibleValues: possibleValues,
|
||||
),
|
||||
);
|
||||
|
||||
static AutoDisposeStateNotifierProvider<PreferencesNotifier<T, P>, T> createAutoDispose<T, P>(String key, T defaultValue, {T Function(P value)? mapFrom, P Function(T value)? mapTo, bool Function(T value)? validator, T? overrideValue}) =>
|
||||
StateNotifierProvider.autoDispose(
|
||||
(ref) => PreferencesNotifier._(
|
||||
ref: ref,
|
||||
entry: PreferencesEntry<T, P>(
|
||||
preferences: ref.read(sharedPreferencesProvider).requireValue,
|
||||
key: key,
|
||||
defaultValue: defaultValue,
|
||||
mapFrom: mapFrom,
|
||||
mapTo: mapTo,
|
||||
validator: validator,
|
||||
),
|
||||
entry: PreferencesEntry<T, P>(preferences: ref.read(sharedPreferencesProvider).requireValue, key: key, defaultValue: defaultValue, mapFrom: mapFrom, mapTo: mapTo, validator: validator),
|
||||
overrideValue: overrideValue,
|
||||
),
|
||||
);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:fpdart/fpdart.dart';
|
||||
import 'package:grpc/grpc.dart';
|
||||
@@ -36,12 +37,15 @@ class HiddifyCoreService with InfraLogger {
|
||||
statusController.add(currentState);
|
||||
if (ref == null) return;
|
||||
final dirs = ref.read(appDirectoriesProvider).requireValue;
|
||||
setup(dirs, false).mapLeft((e) {
|
||||
loggy.error(e);
|
||||
ref.read(inAppNotificationControllerProvider).showErrorToast(e);
|
||||
}).map((_) {
|
||||
loggy.info("Hiddify-core setup done");
|
||||
}).run();
|
||||
setup(dirs, false)
|
||||
.mapLeft((e) {
|
||||
loggy.error(e);
|
||||
ref.read(inAppNotificationControllerProvider).showErrorToast(e);
|
||||
})
|
||||
.map((_) {
|
||||
loggy.info("Hiddify-core setup done");
|
||||
})
|
||||
.run();
|
||||
}
|
||||
|
||||
/// validates config by path and save it
|
||||
@@ -50,198 +54,157 @@ class HiddifyCoreService with InfraLogger {
|
||||
/// [tempPath] includes base config, possibly invalid
|
||||
/// [debug] indicates if debug mode (avoid in prod)
|
||||
|
||||
TaskEither<String, Unit> validateConfigByPath(
|
||||
String path,
|
||||
String tempPath,
|
||||
bool debug,
|
||||
) {
|
||||
return TaskEither(
|
||||
() async {
|
||||
final response = await core.fgClient.parse(
|
||||
ParseRequest(tempPath: tempPath, configPath: path, debug: false),
|
||||
);
|
||||
if (response.responseCode != ResponseCode.OK) return left("${response.responseCode} ${response.message}");
|
||||
return right(unit);
|
||||
},
|
||||
);
|
||||
TaskEither<String, Unit> validateConfigByPath(String path, String tempPath, bool debug) {
|
||||
return TaskEither(() async {
|
||||
final response = await core.fgClient.parse(ParseRequest(tempPath: tempPath, configPath: path, debug: false));
|
||||
if (response.responseCode != ResponseCode.OK) return left("${response.responseCode} ${response.message}");
|
||||
return right(unit);
|
||||
});
|
||||
}
|
||||
|
||||
TaskEither<String, String> generateFullConfigByPath(String path) {
|
||||
return TaskEither(
|
||||
() async {
|
||||
final response = await core.fgClient.parse(
|
||||
ParseRequest(configPath: path, debug: false),
|
||||
);
|
||||
if (response.responseCode != ResponseCode.OK) return left("${response.responseCode} ${response.message}");
|
||||
return right(response.content);
|
||||
},
|
||||
);
|
||||
return TaskEither(() async {
|
||||
final response = await core.fgClient.parse(ParseRequest(configPath: path, debug: false));
|
||||
if (response.responseCode != ResponseCode.OK) return left("${response.responseCode} ${response.message}");
|
||||
return right(response.content);
|
||||
});
|
||||
}
|
||||
|
||||
TaskEither<String, Unit> setup(Directories directories, bool debug) {
|
||||
return TaskEither(
|
||||
() async {
|
||||
try {
|
||||
final setupResponse = await core.setup(directories, debug, 3);
|
||||
return TaskEither(() async {
|
||||
try {
|
||||
final setupResponse = await core.setup(directories, debug, 3);
|
||||
|
||||
if (setupResponse.isNotEmpty) {
|
||||
return left(setupResponse);
|
||||
}
|
||||
await startListeningLogs("fg", core.fgClient);
|
||||
await startListeningStatus("fg", core.fgClient);
|
||||
if (!core.isSingleChannel()) {
|
||||
await startListeningLogs("bg", core.bgClient);
|
||||
await startListeningStatus("bg", core.bgClient);
|
||||
}
|
||||
|
||||
return right(unit);
|
||||
} catch (e) {
|
||||
return left(e.toString());
|
||||
if (setupResponse.isNotEmpty) {
|
||||
return left(setupResponse);
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
TaskEither<String, Unit> changeOptions(SingboxConfigOption options) {
|
||||
return TaskEither(
|
||||
() async {
|
||||
loggy.debug("changing options");
|
||||
// latestOptions = options;
|
||||
try {
|
||||
final res = await core.fgClient.changeHiddifySettings(
|
||||
ChangeHiddifySettingsRequest(
|
||||
hiddifySettingsJson: jsonEncode(options.toJson()),
|
||||
),
|
||||
);
|
||||
if (res.messageType != MessageType.EMPTY) return left("${res.messageType} ${res.message}");
|
||||
await core.bgClient.changeHiddifySettings(
|
||||
ChangeHiddifySettingsRequest(
|
||||
hiddifySettingsJson: jsonEncode(options.toJson()),
|
||||
),
|
||||
);
|
||||
} on GrpcError catch (e) {
|
||||
if (e.code == StatusCode.unavailable) {
|
||||
loggy.debug("background core is not started yet! $e");
|
||||
} else {
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
return right(unit);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
TaskEither<String, Unit> start(String path, String name, bool disableMemoryLimit) {
|
||||
return TaskEither(
|
||||
() async {
|
||||
statusController.add(currentState = const SingboxStatus.starting());
|
||||
loggy.debug("starting");
|
||||
|
||||
if (!await core.start(path, name)) {}
|
||||
await startListeningLogs("fg", core.fgClient);
|
||||
await startListeningStatus("fg", core.fgClient);
|
||||
if (!core.isSingleChannel()) {
|
||||
await startListeningLogs("bg", core.bgClient);
|
||||
await startListeningStatus("bg", core.bgClient);
|
||||
}
|
||||
// if (latestOptions != null) {
|
||||
// await core.bgClient.changeHiddifySettings(
|
||||
// ChangeHiddifySettingsRequest(
|
||||
// hiddifySettingsJson: jsonEncode(latestOptions!.toJson()),
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
// final content = await File(path).readAsString();
|
||||
// loggy.debug("starting with content: $content");
|
||||
try {
|
||||
final res = await core.bgClient.start(
|
||||
StartRequest(
|
||||
configPath: path,
|
||||
configName: name,
|
||||
// configContent: content,
|
||||
disableMemoryLimit: disableMemoryLimit,
|
||||
),
|
||||
);
|
||||
if (res.messageType != MessageType.EMPTY) return left("${res.messageType} ${res.message}");
|
||||
} on GrpcError catch (e) {
|
||||
loggy.error("failed to start bg core: $e");
|
||||
if (e.code == StatusCode.unavailable) {
|
||||
return left("background core is not started yet!");
|
||||
}
|
||||
// throw InvalidConfig(e.message);
|
||||
// throw DioException.connectionError(requestOptions: RequestOptions(), reason: e.codeName, error: e);
|
||||
|
||||
// throw DioException(requestOptions: RequestOptions(), error: e);
|
||||
return left("${e.message}");
|
||||
}
|
||||
|
||||
// if (res.messageType != MessageType.EMPTY) return left(res);
|
||||
|
||||
return right(unit);
|
||||
},
|
||||
);
|
||||
} catch (e) {
|
||||
return left(e.toString());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
TaskEither<String, Unit> stop() {
|
||||
return TaskEither(
|
||||
() async {
|
||||
loggy.debug("stopping");
|
||||
try {
|
||||
final res = await core.bgClient.stop(Empty());
|
||||
} catch (e) {
|
||||
loggy.error("failed to stop bg core: $e");
|
||||
TaskEither<String, Unit> changeOptions(SingboxConfigOption options) {
|
||||
return TaskEither(() async {
|
||||
loggy.debug("changing options");
|
||||
// latestOptions = options;
|
||||
try {
|
||||
final res = await core.fgClient.changeHiddifySettings(ChangeHiddifySettingsRequest(hiddifySettingsJson: jsonEncode(options.toJson())));
|
||||
if (res.messageType != MessageType.EMPTY) return left("${res.messageType} ${res.message}");
|
||||
await core.bgClient.changeHiddifySettings(ChangeHiddifySettingsRequest(hiddifySettingsJson: jsonEncode(options.toJson())));
|
||||
} on GrpcError catch (e) {
|
||||
if (e.code == StatusCode.unavailable) {
|
||||
loggy.debug("background core is not started yet! $e");
|
||||
} else {
|
||||
rethrow;
|
||||
}
|
||||
if (!await core.stop()) {}
|
||||
statusController.add(currentState = const SingboxStatus.stopped());
|
||||
}
|
||||
|
||||
return right(unit);
|
||||
},
|
||||
);
|
||||
return right(unit);
|
||||
});
|
||||
}
|
||||
|
||||
TaskEither<String, Unit> restart(String path, String name, bool disableMemoryLimit) {
|
||||
return TaskEither(
|
||||
() async {
|
||||
loggy.debug("restarting");
|
||||
// if (!await core.restart(path, name)) {
|
||||
final res = await core.bgClient.restart(
|
||||
TaskEither<String, Unit> start(String path, String name, bool disableMemoryLimit) {
|
||||
return TaskEither(() async {
|
||||
statusController.add(currentState = const SingboxStatus.starting());
|
||||
loggy.debug("starting");
|
||||
|
||||
if (!await core.start(path, name)) {}
|
||||
if (!core.isSingleChannel()) {
|
||||
await startListeningLogs("bg", core.bgClient);
|
||||
await startListeningStatus("bg", core.bgClient);
|
||||
}
|
||||
// if (latestOptions != null) {
|
||||
// await core.bgClient.changeHiddifySettings(
|
||||
// ChangeHiddifySettingsRequest(
|
||||
// hiddifySettingsJson: jsonEncode(latestOptions!.toJson()),
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
// final content = await File(path).readAsString();
|
||||
// loggy.debug("starting with content: $content");
|
||||
try {
|
||||
final res = await core.bgClient.start(
|
||||
StartRequest(
|
||||
configPath: path,
|
||||
configName: name,
|
||||
// configContent: content,
|
||||
disableMemoryLimit: disableMemoryLimit,
|
||||
delayStart: true,
|
||||
),
|
||||
);
|
||||
if (res.messageType != MessageType.EMPTY) return left("${res.messageType} ${res.message}");
|
||||
await stop().run();
|
||||
await start(path, name, disableMemoryLimit).run();
|
||||
// }
|
||||
// if (!core.isSingleChannel()) {
|
||||
// await startListeningStatus("bg", core.bgClient);
|
||||
// await startListeningLogs("bg", core.bgClient);
|
||||
// }
|
||||
return right(unit);
|
||||
},
|
||||
);
|
||||
} on GrpcError catch (e) {
|
||||
loggy.error("failed to start bg core: $e");
|
||||
if (e.code == StatusCode.unavailable) {
|
||||
return left("background core is not started yet!");
|
||||
}
|
||||
// throw InvalidConfig(e.message);
|
||||
// throw DioException.connectionError(requestOptions: RequestOptions(), reason: e.codeName, error: e);
|
||||
|
||||
// throw DioException(requestOptions: RequestOptions(), error: e);
|
||||
return left("${e.message}");
|
||||
}
|
||||
|
||||
// if (res.messageType != MessageType.EMPTY) return left(res);
|
||||
|
||||
return right(unit);
|
||||
});
|
||||
}
|
||||
|
||||
TaskEither<String, Unit> stop() {
|
||||
return TaskEither(() async {
|
||||
loggy.debug("stopping");
|
||||
try {
|
||||
final res = await core.bgClient.stop(Empty());
|
||||
} catch (e) {
|
||||
loggy.error("failed to stop bg core: $e");
|
||||
}
|
||||
if (!await core.stop()) {}
|
||||
statusController.add(currentState = const SingboxStatus.stopped());
|
||||
|
||||
return right(unit);
|
||||
});
|
||||
}
|
||||
|
||||
TaskEither<String, Unit> restart(String path, String name, bool disableMemoryLimit) {
|
||||
return TaskEither(() async {
|
||||
loggy.debug("restarting");
|
||||
// if (!await core.restart(path, name)) {
|
||||
final res = await core.bgClient.restart(StartRequest(configPath: path, configName: name, disableMemoryLimit: disableMemoryLimit, delayStart: true));
|
||||
if (res.messageType != MessageType.EMPTY) return left("${res.messageType} ${res.message}");
|
||||
await stop().run();
|
||||
await start(path, name, disableMemoryLimit).run();
|
||||
// }
|
||||
// if (!core.isSingleChannel()) {
|
||||
// await startListeningStatus("bg", core.bgClient);
|
||||
// await startListeningLogs("bg", core.bgClient);
|
||||
// }
|
||||
return right(unit);
|
||||
});
|
||||
}
|
||||
|
||||
TaskEither<String, Unit> resetTunnel() {
|
||||
return TaskEither(
|
||||
() async {
|
||||
// only available on iOS (and macOS later)
|
||||
if (!PlatformUtils.isIOS) {
|
||||
throw UnimplementedError(
|
||||
"reset tunnel function unavailable on platform",
|
||||
);
|
||||
}
|
||||
return TaskEither(() async {
|
||||
// only available on iOS (and macOS later)
|
||||
if (!PlatformUtils.isIOS) {
|
||||
throw UnimplementedError("reset tunnel function unavailable on platform");
|
||||
}
|
||||
|
||||
// loggy.debug("resetting tunnel");
|
||||
final res = await core.resetTunnel();
|
||||
if (res) {
|
||||
return right(unit);
|
||||
}
|
||||
return left("failed to reset tunnel");
|
||||
},
|
||||
);
|
||||
// loggy.debug("resetting tunnel");
|
||||
final res = await core.resetTunnel();
|
||||
if (res) {
|
||||
return right(unit);
|
||||
}
|
||||
return left("failed to reset tunnel");
|
||||
});
|
||||
}
|
||||
|
||||
// Stream<List<OutboundGroup>> watchGroups() async* {
|
||||
@@ -278,35 +241,22 @@ class HiddifyCoreService with InfraLogger {
|
||||
}
|
||||
|
||||
TaskEither<String, Unit> selectOutbound(String groupTag, String outboundTag) {
|
||||
return TaskEither(
|
||||
() async {
|
||||
loggy.debug("selecting outbound");
|
||||
final res = await core.bgClient.selectOutbound(
|
||||
SelectOutboundRequest(
|
||||
groupTag: groupTag,
|
||||
outboundTag: outboundTag,
|
||||
),
|
||||
);
|
||||
if (res.code != ResponseCode.OK) return left("${res.code} ${res.message}");
|
||||
return TaskEither(() async {
|
||||
loggy.debug("selecting outbound");
|
||||
final res = await core.bgClient.selectOutbound(SelectOutboundRequest(groupTag: groupTag, outboundTag: outboundTag));
|
||||
if (res.code != ResponseCode.OK) return left("${res.code} ${res.message}");
|
||||
|
||||
return right(unit);
|
||||
},
|
||||
);
|
||||
return right(unit);
|
||||
});
|
||||
}
|
||||
|
||||
TaskEither<String, Unit> urlTest(String groupTag) {
|
||||
return TaskEither(
|
||||
() async {
|
||||
loggy.debug("url test");
|
||||
final res = await core.bgClient.urlTest(
|
||||
UrlTestRequest(
|
||||
groupTag: groupTag,
|
||||
),
|
||||
);
|
||||
if (res.code != ResponseCode.OK) return left("${res.code} ${res.message}");
|
||||
return right(unit);
|
||||
},
|
||||
);
|
||||
return TaskEither(() async {
|
||||
loggy.debug("url test");
|
||||
final res = await core.bgClient.urlTest(UrlTestRequest(groupTag: groupTag));
|
||||
if (res.code != ResponseCode.OK) return left("${res.code} ${res.message}");
|
||||
return right(unit);
|
||||
});
|
||||
}
|
||||
|
||||
List<LogMessage> logBuffer = [];
|
||||
@@ -335,42 +285,23 @@ class HiddifyCoreService with InfraLogger {
|
||||
}
|
||||
|
||||
TaskEither<String, Unit> clearLogs() {
|
||||
return TaskEither(
|
||||
() async {
|
||||
loggy.debug("clearing logs");
|
||||
logBuffer.clear();
|
||||
// final res = await core.bgClient(Empty());
|
||||
// if (res.code != ResponseCode.OK) return left("${res.code} ${res.message}");
|
||||
return right(unit);
|
||||
},
|
||||
);
|
||||
return TaskEither(() async {
|
||||
loggy.debug("clearing logs");
|
||||
logBuffer.clear();
|
||||
// final res = await core.bgClient(Empty());
|
||||
// if (res.code != ResponseCode.OK) return left("${res.code} ${res.message}");
|
||||
return right(unit);
|
||||
});
|
||||
}
|
||||
|
||||
TaskEither<String, WarpResponse> generateWarpConfig({
|
||||
required String licenseKey,
|
||||
required String previousAccountId,
|
||||
required String previousAccessToken,
|
||||
}) {
|
||||
return TaskEither(
|
||||
() async {
|
||||
loggy.debug("generating warp config");
|
||||
final warpConfig = await core.fgClient.generateWarpConfig(
|
||||
GenerateWarpConfigRequest(
|
||||
licenseKey: licenseKey,
|
||||
accountId: previousAccountId,
|
||||
accessToken: previousAccessToken,
|
||||
),
|
||||
);
|
||||
// if (warpConfig.code != ResponseCode.OK) return left("${warpConfig.code} ${warpConfig.message}");
|
||||
final WarpResponse warp = (
|
||||
log: warpConfig.log,
|
||||
accountId: warpConfig.account.accountId,
|
||||
accessToken: warpConfig.account.accessToken,
|
||||
wireguardConfig: jsonEncode(warpConfig.config.toProto3Json()),
|
||||
);
|
||||
return right(warp);
|
||||
},
|
||||
);
|
||||
TaskEither<String, WarpResponse> generateWarpConfig({required String licenseKey, required String previousAccountId, required String previousAccessToken}) {
|
||||
return TaskEither(() async {
|
||||
loggy.debug("generating warp config");
|
||||
final warpConfig = await core.fgClient.generateWarpConfig(GenerateWarpConfigRequest(licenseKey: licenseKey, accountId: previousAccountId, accessToken: previousAccessToken));
|
||||
// if (warpConfig.code != ResponseCode.OK) return left("${warpConfig.code} ${warpConfig.message}");
|
||||
final WarpResponse warp = (log: warpConfig.log, accountId: warpConfig.account.accountId, accessToken: warpConfig.account.accessToken, wireguardConfig: jsonEncode(warpConfig.config.toProto3Json()));
|
||||
return right(warp);
|
||||
});
|
||||
}
|
||||
|
||||
Stream<SingboxStatus> watchStatus() async* {
|
||||
@@ -380,13 +311,14 @@ class HiddifyCoreService with InfraLogger {
|
||||
Future<void> startListeningStatus(String key, CoreClient cc) async {
|
||||
await listenSingle<SingboxStatus>(
|
||||
"${key}StatusListener",
|
||||
() => cc.coreInfoListener(Empty(), options: grpcOptions).map(
|
||||
(event) {
|
||||
currentState = SingboxStatus.fromCoreInfo(event);
|
||||
statusController.add(currentState);
|
||||
return currentState;
|
||||
},
|
||||
).endWith(const SingboxStatus.stopped()),
|
||||
() => cc
|
||||
.coreInfoListener(Empty(), options: grpcOptions)
|
||||
.map((event) {
|
||||
currentState = SingboxStatus.fromCoreInfo(event);
|
||||
statusController.add(currentState);
|
||||
return currentState;
|
||||
})
|
||||
.endWith(const SingboxStatus.stopped()),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Hiddify AppStream Metadata
|
||||
Place this file at: linux/packaging/myappid.appdata.xml
|
||||
-->
|
||||
<component type="desktop-application">
|
||||
<id>app.hiddify.com</id>
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>GPL-3.0-or-later</project_license>
|
||||
|
||||
<name>Hiddify</name>
|
||||
<summary>Modern Proxy and VPN Manager for Linux</summary>
|
||||
|
||||
<developer_name>Hiddify</developer_name>
|
||||
<update_contact>linux@hiddify.com</update_contact>
|
||||
|
||||
<description>
|
||||
<p>
|
||||
Hiddify is an advanced proxy and VPN client built for privacy and control.
|
||||
It supports multiple backend protocols including V2Ray, Xray, Clash, and Sing-box,
|
||||
providing flexibility and performance for all kinds of network configurations.
|
||||
</p>
|
||||
<p>
|
||||
Designed with simplicity in mind, Hiddify helps users connect securely and
|
||||
manage complex proxy configurations through a clean graphical interface.
|
||||
</p>
|
||||
</description>
|
||||
|
||||
<screenshots>
|
||||
<screenshot type="default">
|
||||
<image>https://hiddify.com/assets/hiddify-next-mobile.svg</image>
|
||||
<caption>Main Interface of Hiddify</caption>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
|
||||
<launchable type="desktop-id">hiddify.desktop</launchable>
|
||||
|
||||
<icon type="local">./assets/images/source/ic_launcher_border.png</icon>
|
||||
|
||||
<categories>
|
||||
<category>Network</category>
|
||||
</categories>
|
||||
|
||||
<keywords>
|
||||
<keyword>Hiddify</keyword>
|
||||
<keyword>Proxy</keyword>
|
||||
<keyword>VPN</keyword>
|
||||
<keyword>V2Ray</keyword>
|
||||
<keyword>Nekoray</keyword>
|
||||
<keyword>Xray</keyword>
|
||||
<keyword>Psiphon</keyword>
|
||||
<keyword>OpenVPN</keyword>
|
||||
</keywords>
|
||||
|
||||
<mime-types>
|
||||
<mime-type>x-scheme-handler/hiddify</mime-type>
|
||||
<mime-type>x-scheme-handler/v2ray</mime-type>
|
||||
<mime-type>x-scheme-handler/v2rayn</mime-type>
|
||||
<mime-type>x-scheme-handler/v2rayng</mime-type>
|
||||
<mime-type>x-scheme-handler/clash</mime-type>
|
||||
<mime-type>x-scheme-handler/clashmeta</mime-type>
|
||||
<mime-type>x-scheme-handler/sing-box</mime-type>
|
||||
</mime-types>
|
||||
|
||||
<url type="homepage">https://hiddify.com</url>
|
||||
<url type="bugtracker">https://github.com/hiddify/hiddify-app/issues</url>
|
||||
<url type="help">https://docs.hiddify.com</url>
|
||||
|
||||
<provides>
|
||||
<binary>hiddify</binary>
|
||||
</provides>
|
||||
|
||||
<releases>
|
||||
<release version="1.0.0" date="2025-10-25">
|
||||
<description>
|
||||
<p>Initial Linux release of Hiddify with multi-protocol support and modern UI.</p>
|
||||
</description>
|
||||
</release>
|
||||
</releases>
|
||||
|
||||
<translation type="gettext">hiddify</translation>
|
||||
|
||||
<custom>
|
||||
<value key="PackageName">hiddify</value>
|
||||
<value key="Priority">optional</value>
|
||||
<value key="Section">x11</value>
|
||||
<value key="InstalledSize">6604</value>
|
||||
<value key="Essential">false</value>
|
||||
</custom>
|
||||
</component>
|
||||
@@ -41,3 +41,5 @@ app_run_file: AppRun
|
||||
# include:
|
||||
# - libcurl.so.4
|
||||
include: []
|
||||
|
||||
metainfo: linux/packaging/app.hiddify.com.appdata.xml
|
||||
@@ -40,3 +40,5 @@ supported_mime_type:
|
||||
- x-scheme-handler/clash
|
||||
- x-scheme-handler/clashmeta
|
||||
- x-scheme-handler/sing-box
|
||||
|
||||
metainfo: linux/packaging/app.hiddify.com.appdata.xml
|
||||
@@ -1,5 +1,5 @@
|
||||
display_name: Hiddify
|
||||
url: https://github.com/hiddify/hiddify-next/
|
||||
url: https://github.com/hiddify/hiddify-app/
|
||||
license: Other
|
||||
|
||||
packager: hiddify
|
||||
@@ -35,3 +35,5 @@ supported_mime_type:
|
||||
- x-scheme-handler/clash
|
||||
- x-scheme-handler/clashmeta
|
||||
- x-scheme-handler/sing-box
|
||||
|
||||
metainfo: linux/packaging/app.hiddify.com.appdata.xml
|
||||
@@ -1,2 +1,2 @@
|
||||
install-path: /Applications
|
||||
#sign-identity: <your-sign-identity>
|
||||
sign-identity: "Apple Development: app hiddify (VS8XK8XGMM)"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
app_id: 6L903538-42B1-4596-G479-BJ779F21A65D
|
||||
publisher: Hiddify
|
||||
publisher_url: https://github.com/hiddify/hiddify-next
|
||||
publisher_url: https://github.com/hiddify/hiddify-app
|
||||
display_name: Hiddify
|
||||
executable_name: Hiddify.exe
|
||||
output_base_file_name: Hiddify.exe
|
||||
|
||||
Reference in New Issue
Block a user