diff --git a/.envrc b/.envrc index eb282a8b..0db5e0f5 100644 --- a/.envrc +++ b/.envrc @@ -1,2 +1,3 @@ export PYTHON_PATH=/Library/Frameworks/Python.framework/Versions/2.7/bin/python export CAPACITOR_ANDROID_STUDIO_PATH='/Users/stapxs/Applications/Android Studio.app' +export ANDROID_HOME=~/Library/Android/sdk diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 72b5c05f..de072e8c 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -2,6 +2,7 @@ require('@rushstack/eslint-patch/modern-module-resolution') module.exports = { + // 继承的规则配置 extends: [ 'eslint:recommended', 'plugin:vue/vue3-recommended', @@ -10,39 +11,57 @@ module.exports = { '@vue/eslint-config-typescript/recommended', ], rules: { - // 基础规则 - '@typescript-eslint/no-explicit-any': 'off', // 忽略使用 any 类型的错误 - 'no-debugger': 'warn', // debugger - 'no-console': 'warn', // console - 'prefer-arrow-callback': 'warn', // 优先使用箭头函数 - 'quotes': ['warn', 'single'], // 引号 - 'max-len': ['warn', { - 'code': 80, - 'ignoreUrls': true, - 'ignoreStrings': true, - 'ignoreTemplateLiterals': true, - 'ignoreRegExpLiterals': true, - }], // 单行长度 - // Vue 相关规则 + // === 基础规则 === + // 忽略使用 any 类型的错误 + '@typescript-eslint/no-explicit-any': 'off', + // debugger + 'no-debugger': 'warn', + // console + 'no-console': 'warn', + // 优先使用箭头函数 + 'prefer-arrow-callback': 'warn', + // 引号 + 'quotes': ['warn', 'single'], + // 三元表达式 + 'multiline-ternary': ['warn', 'never'], + + // === Vue 相关规则 === + // html 缩进 + 'vue/html-indent': ['warn', 4, { + 'alignAttributesVertically': false + }], + // html 标签闭合 'vue/html-closing-bracket-spacing': ['warn', { - 'startTag': 'never', - 'endTag': 'never', 'selfClosingTag': 'always' - }], // html 标签闭合 + }], + // 每行最大属性数 + 'vue/max-attributes-per-line': ['warn', { + 'singleline': { 'max': 3 }, + 'multiline': { 'max': 3 } + }], + // 属性换行设置 + 'vue/first-attribute-linebreak': ['warn', { + 'singleline': 'ignore', + 'multiline': 'ignore' + }], + // html 标签换行 'vue/html-closing-bracket-newline': ['warn', { 'multiline': 'never' - }], // html 标签换行 - 'vue/max-attributes-per-line': ['warn', { - 'singleline': 5 - }], // html 属性换行 + }], + // html 引号 'vue/html-quotes': [ 'warn', 'double', { 'avoidEscape': true } - ], // html 引号 - 'vue/v-for-delimiter-style': ['error', 'in'], // v-for 分隔符 - 'vue/require-name-property': 'warn', // 组件 name 属性 - 'vue/prefer-true-attribute-shorthand': 'warn', // 属性简写 - 'vue/require-prop-types': 'off', // prop 类型 - 'vue/no-v-html': 'off', // v-html + ], + // v-for 分隔符 + 'vue/v-for-delimiter-style': ['error', 'in'], + // 组件 name 属性 + 'vue/require-name-property': 'warn', + // 属性简写 + 'vue/prefer-true-attribute-shorthand': 'warn', + // prop 类型 + 'vue/require-prop-types': 'off', + // v-html + 'vue/no-v-html': 'off', }, } diff --git a/.vscode/settings.json b/.vscode/settings.json index 8ebbfcfb..cb644bd2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,11 +1,6 @@ { "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "vscode.typescript-language-features" }, - "[javascript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[json]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - } + "java.configuration.updateBuildConfiguration": "automatic" } diff --git a/README.md b/README.md index c58c5a17..ab9048e8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,3 @@ -简体中文 - | [English](README_en-US.md) -


-

Logo @@ -25,7 +21,13 @@ ![view](README/view.png) +# 文档 + +- **简体中文(当前)** +- **[English](README_en-US.md)** + ## ✨ 特性支持 + - ✅ 使用 Vue.js 全家桶开发,快乐前后端分离 - 🎨 自适应布局,竖版也能使用 - 🖥️ 支持 PWA(都有 Electron 了(小声)) @@ -40,28 +42,35 @@ - 🛠 更多特性开发中 ## ♿️ 快速使用 + ### > 运行服务 + Stapxs QQ Lite 需要一个 QQ Bot 后端提供服务,你可以参考 [📖 这个文档](https://github.com/Stapxs/Stapxs-QQ-Lite-2.0/wiki/%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B) 布置它。 ### > 访问网页 + 本仓库开启了 GitHub Pages, 所有向主分支提交的代码将会自动构建并发布。你可以直接访问 [🌎 这个页面](https://stapxs.github.io/Stapxs-QQ-Lite-2.0) 来使用已经构建并部署的页面。 ### > 安装客户端 + 除了直接使用本仓库的构建页面,你也可以下载使用 electron 打包的功能**稍稍**更丰富的客户端版本,访问 [📦️ 这儿](https://github.com/Stapxs/Stapxs-QQ-Lite-2.0/releases) 查看版本发布列表。 当然你也可以使用包管理来安装它,使用包管理安装将会更便于更新 Stapxs QQ Lite 而不用每次都从 Github 上手动更新,访问 [💬 这儿](https://github.com/Stapxs/Stapxs-QQ-Lite-2.0/issues/99) 来查看目前支持的包管理。 ### > 自行部署网页 + Stapxs QQ Lite 在版本发布时构建了一份根目录下的 Web 文件,你可以在 [📦️ 这儿](https://github.com/Stapxs/Stapxs-QQ-Lite-2.0/releases) 找到它,它一般叫做```Stapxs.QQ.Lite-<版本>-web.zip```,将它解压放置到你的网页服务器中即可。 什么?不会部署网页服务器?Stapxs QQ Lite 网页版现在已经发布到了 [npm](https://www.npmjs.com/package/ssqq-web) 上!你可以使用 npx 工具快速启动它: -~~~bash + +``` bash npx ssqq-web hostname=127.0.0.1 port=8081 -~~~ +``` ## 💬 提醒和问题 ### > 关于不安全连接 + - 当使用 https 页面连接 ws 服务(反之相同)的情况下,连接将会失败;这是由于其中某一者是不安全的。在这种情况下,你可以选择将 ws 提升为 wss 或者将 https 降级为 http(不安全)来解决问题,此处不提供解决方案。>> [Stapxs-QQ-Lite#32](https://github.com/Stapxs/Stapxs-QQ-Lite/issues/32) ### > 我能使用其他 QQ Http Bot 吗 @@ -78,54 +87,90 @@ npx ssqq-web hostname=127.0.0.1 port=8081 - 如果有什么奇奇怪怪的问题, 欢迎发起 [issue]() 询问! 如果有什么 BUG 和优化建议也可以哦! ## 📦️ 构建应用 + 为了规范对其他仓库的引用,Stapxs QQ Lite 2.0 仓库含有一些子模块,这意味着你需要在克隆仓库的时候包含子模块: -~~~bash + +``` bash git clone https://github.com/Stapxs/Stapxs-QQ-Lite-2.0 --recursive -~~~ +``` + 如果你已经克隆了仓库,也可以使用这个来补全子模块: -~~~bash -git submodule update --init -~~~ -### > 构建 Web 页面 -Stapxs QQ Lite 2.0 是一个基于 Vue 的单页应用,这意味着如果你想自行部署到网页服务需要进行构建。当然你同样可以前往 [这儿](https://github.com/Stapxs/Stapxs-QQ-Lite-2.0/releases) 来下载预构建好的根目录文件包。 -注意。在正式构建前,如果你的网站运作目录并不在根域名下,你需要修改(或增加)项目根目录下 `vue.config.js` 内导出的 `publicPath` 字段的值,它代表着最终你会运行在的目录,比如它在现在是 `/Stapxs-QQ-Lite-2.0/`;如果你本来就运行在根目录下,可以直接删去它。 +``` bash +git submodule update --init +``` -下面是构建 Vue 应用的命令,构建结果将最终输出在 `dist` 下: +在开始构建之前请安装依赖,请确保安装了 `yarn`: ``` bash # 安装依赖 +yarn + +or + yarn install +``` + +### > 构建 Web 页面 + +Stapxs QQ Lite 2.0 是一个基于 Vue 的单页应用,这意味着如果你想自行部署到网页服务需要进行构建。当然你同样可以前往 [这儿](https://github.com/Stapxs/Stapxs-QQ-Lite-2.0/releases) 来下载预构建好的根目录文件包。 + +下面是构建该项目的命令,构建结果将最终输出在 `dist` 目录下: + +``` bash # 运行本地调试 -yarn serve +yarn dev + # 代码检查和自动格式化 yarn lint + # 构建应用 yarn build ``` ### > 构建 Electron 客户端 + 在 `2.3.0` 版本后,Stapxs QQ Lite 2.0 支持构建为 Electron 应用并补充部分平台特性的功能,你也可以自行构建。 -下面是构建 Electron 应用的命令,构建结果将最终输出在 `dist_electron/out` 下: +下面是构建 Electron 应用的命令,构建结果将最终输出在 `dist_electron/out` 目录下: ``` bash # electron 运行本地调试 -yarn electron:serve +yarn dev:electron + # electron 构建应用 -yarn electron:build +yarn build:win ``` -你可以补充平台选项来指定构建某个平台: -```bash -yarn electron:build --linux -``` +其他平台构建查看[命令列表](#-命令列表) + +### > 命令列表 + +**命令格式为`yarn <命令>`,其中`<命令>`为列表中的一个:** + +| 命令 | 描述 | +| ------------- | ------------------ | +| install | 安装依赖 | +| lint | 代码检查和自动格式化 | +| dev | 网页调试 | +| dev:electron | Electron 调试 | +| dev:ios | Ios 调试 | +| dev:android | 安卓调试 | +| build | 网页构建 | +| build:win | 构建 Windows 应用 | +| build:mac | 构建 Mac Os 应用 | +| build:linux | 构建 Liunx 应用 | +| build:ios | 构建 Ios 应用 | +| build:android | 构建 Andorid 应用 | + ### > Github Actions + *为什么会有人对自动构建感兴趣,总之自动构建脚本我写了好久。感兴趣就自己去看好了(无端)。* ![auto-build](README/auto-build.png) ## 🎉 鸣谢 + 感谢这些小伙伴们在开发和文本中提供的支持 —— diff --git a/README_en-US.md b/README_en-US.md index af22ac09..902f34bf 100644 --- a/README_en-US.md +++ b/README_en-US.md @@ -1,8 +1,3 @@ -[简体中文](README.md) - | English -


- -

Logo @@ -22,9 +17,15 @@

-![card](README/card.png) +![view](README/view.png) + +# 文档 + +- **[Simplified Chinese](README.md)** +- **English(Current)** ## ✨ Supported Features + - ✅ Developed with a complete Vue.js framwork, frontend-backend seperated - 🎨 Adaptive landscape and portrait layouts - 🖥️ PWA support (why not just use our cool Electron app anyway) @@ -39,18 +40,23 @@ - 🛠 More to come ... ## ♿️ Get Started + ### > Running Services + Stapxs QQ Lite requires connecting to a QQ bot API to function properly. You can set one up by following [📖 this documentation](https://github.com/Stapxs/Stapxs-QQ-Lite-2.0/wiki/%E8%BF%9E%E6%8E%A5-oicq2-http). ### > Using the App On the Go + GitHub Pages is enabled and is serving a live demo [🌎 over here](https://stapxs.github.io/Stapxs-QQ-Lite-2.0). ### > Installing the App + Besides the live demo, you can also download the desktop app built with Electron that has more features [📦️ here](https://github.com/Stapxs/Stapxs-QQ-Lite-2.0/releases). ## 💬 Tips and FAQs ### > Insecure connections? + - When connecting to a WebSocket (ws) service via an HTTPS page, or vice versa, the connection will fail because one of them is insecure. In this case, you can choose to upgrade the WebSocket connection to a secure WebSocket (wss) or downgrade the HTTPS connection to HTTP (insecure) to solve the problem. However, specific solutions are not provided here. >> [Stapxs-QQ-Lite#32](https://github.com/Stapxs/Stapxs-QQ-Lite/issues/32) ### > Could I use other QQ bot APIs? @@ -62,57 +68,95 @@ Besides the live demo, you can also download the desktop app built with Electron - For potential risks in using oicq-http, refer to [this page](). If you're using other QQ bot APIs, check out their own repositories for more infomation. -### > I have questions / problems. +### > I have questions / problems - Don't hesitate to send us an [issue]() if you do. Bug reports and suggestions are also welcome. ## 📦️ Building the App -### > Building Webpages -Stapxs QQ Lite 2.0 is a single-page Vue application, which means you'll have to build the page before serving it. -NOTE: if you do not serve the app at public web root, you'll have to modify the value of `publicPath` in `vue.config.js` to your need before you build it. You can also remove the mentioned key if you only plan to serve the app at web root. +In order to standardize the reference to other repositories, Stapxs QQ Lite 2.0 repository contains some submodules, which means you need to include submodules when cloning the repository: -Below are commands used to test and build this Vue app. Artifacts will be in `dist` folder. +``` bash +git clone https://github.com/Stapxs/Stapxs-QQ-Lite-2.0 --recursive +``` + +If you have already cloned the repository, you can also use this to complete the submodules: + +``` bash +git submodule update --init +``` + +Before starting to build, install dependencies, please make sure to install yarn: ``` bash # Install dependencies +yarn + +or + yarn install -# Test the app locally -yarn serve -# Check and format the code +``` + +### > Building Webpages + +Stapxs QQ Lite 2.0 is a single-page Vue application, which means you'll have to build the page before serving it. + +Below are commands used to test and build this Vue app. Artifacts will be in `dist` folder. + +``` bash +# Run local debugging +yarn dev + +# Code check and automatic formatting yarn lint -# Build the app + +# Build application yarn build ``` ### > Building the Electron App + Starting from version `2.3.0`, Stapxs QQ Lite 2.0 can be built into an Electron app with enhanced features for some platforms. You can also build the app yourself with instructions below. Commands for testing and building the Electron app are shown below. Artifacts will be in `dist_electron/out` folder. ``` bash -# Run local Electron test -yarn electron:serve -# Build the Electron app -yarn electron:build -``` -You can also specify the desired platform with an option: +# Electron run local debugging +yarn dev:electron -```bash -yarn electron:build --linux +# Electron build application +yarn build:win ``` + +Other platform builds can be viewed in [command list](#-command-list) + +### > Command List + +Command format is `yarn `, where `` is one of the following in the list: + +| Command | Command | +| ------------- | ----------------------------------- | +| install | Install dependencies | +| lint | Code check and automatic formatting | +| dev | Web debugging | +| dev:electron | Electron debugging | +| dev:ios | Ios debugging | +| dev:android | Android debugging | +| build | Web build | +| build:win | Build Windows App | +| build:mac | Build MacOs App | +| build:linux | Build Liunx App | +| build:ios | Build Ios App | +| build:android | Build Andorid App | + ### > GitHub Actions + *Why would anyone be interested in build automation? Anyway, I had worked on it for so long and you can check it out yourself in GitHub Actions.* ![auto-build](README/auto-build.png) -## 🖼️ Screenshots -![1](README/pics/1.png) -![2](README/pics/2.png) -![3](README/pics/4.png) -![3](README/pics/3.png) - ## 🎉 Credits + Shoutout to my friends who have offered help in development and translation!
diff --git a/capacitor.config.ts b/capacitor.config.ts index df662c88..a373cdd3 100644 --- a/capacitor.config.ts +++ b/capacitor.config.ts @@ -1,4 +1,5 @@ import type { CapacitorConfig } from '@capacitor/cli' +import { resolve } from 'path' const config: CapacitorConfig = { appId: 'cn.stapxs.webqq', @@ -9,12 +10,15 @@ const config: CapacitorConfig = { path: 'src/mobile/ios' }, android: { - path: 'src/mobile/android' - }, - // server: { - // url: 'http://localhost:8080', - // cleartext: true - // } + path: 'src/mobile/android', + buildOptions: { + keystorePath: resolve(__dirname, 'src/mobile/_signing/ssteam'), + keystoreAlias: 'key-ssteam', + keystorePassword: process.env.KEYSTORE_PASSWORD || '', + keystoreAliasPassword: process.env.KEYSTORE_ALIAS_PASSWORD || '', + releaseType: 'APK' + } + } } export default config diff --git a/package.json b/package.json index f4d6e7e7..dd792b21 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "stapxs-qq-lite", - "version": "3.0.0", + "version": "3.0.1", "private": false, "author": "Stapx Steve [林槐]", "description": "一个兼容 OneBot 的非官方网页版 QQ 客户端,使用 Vue 重制的全新版本。", @@ -9,17 +9,21 @@ "main": "./out/main/index.js", "type": "module", "scripts": { + "capacitor:copy:before": "capacitor-sync-version", "lint": "eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts,.vue --fix", + "update:icon": "npx @capacitor/assets generate --assetPath 'src/mobile/_assets' --iosProject 'src/mobile/ios/App' --androidProject 'src/mobile/android' --android --ios", "dev": "vite dev", "dev:electron": "electron-vite dev", - "dev:ios": "capacitor sync ios && capacitor run ios", - "dev:android": "capacitor sync android && capacitor run android", + "dev:ios": "vite build && capacitor sync ios && capacitor run ios", + "dev:android": "vite build && capacitor sync android && capacitor run android", + "open:ios": "vite build && capacitor sync ios && capacitor open ios", + "open:android": "vite build && capacitor sync android && capacitor open android", "build": "vite build", "build:win": "electron-vite build && electron-builder --win", "build:mac": "electron-vite build && electron-builder --mac", "build:linux": "electron-vite build && electron-builder --linux", - "build:ios": "vite build && capacitor sync ios && capacitor open ios", - "build:android": "vite build && capacitor sync android && capacitor open android" + "build:ios": "vite build && capacitor sync ios && sh ./scripts/build-export-ipa.sh", + "build:android": "vite build && capacitor sync android && capacitor build android" }, "dependencies": { "@electron-toolkit/preload": "^3.0.0", @@ -33,10 +37,13 @@ "devDependencies": { "@capacitor/android": "^6.2.0", "@capacitor/app": "^6.0.2", + "@capacitor/assets": "^3.0.5", "@capacitor/cli": "^6.2.0", "@capacitor/core": "^6.2.0", "@capacitor/ios": "^6.2.0", + "@capacitor/keyboard": "^6.0.3", "@capacitor/local-notifications": "^6.1.1", + "@capacitor/status-bar": "^6.0.2", "@electron-toolkit/eslint-config": "^1.0.2", "@electron-toolkit/eslint-config-ts": "^2.0.0", "@electron-toolkit/tsconfig": "^1.0.1", @@ -44,8 +51,10 @@ "@fortawesome/free-regular-svg-icons": "^6.7.0", "@fortawesome/free-solid-svg-icons": "^6.7.0", "@fortawesome/vue-fontawesome": "^3.0.8", + "@hugotomazi/capacitor-navigation-bar": "^4.0.1", "@modyfi/vite-plugin-yaml": "^1.1.0", "@rushstack/eslint-patch": "^1.10.3", + "@stapxs/capacitor-sync-version": "^1.0.10", "@stapxs/umami-logger-typescript": "^1.0.12", "@types/jsonpath": "^0.2.4", "@types/node": "^20.14.8", diff --git a/bin/build-export-ipa.sh b/scripts/build-export-ipa.sh similarity index 71% rename from bin/build-export-ipa.sh rename to scripts/build-export-ipa.sh index 54d9c5d1..b88401d9 100644 --- a/bin/build-export-ipa.sh +++ b/scripts/build-export-ipa.sh @@ -1,4 +1,8 @@ -rm -r dist_capacitor +rm -rf dist_capacitor + +VERSION=$(node -p "require('./package.json').version") +IPA_NAME="Stapxs.QQ.Lite-$VERSION.ipa" +EXPORT_PATH="dist_capacitor/$IPA_NAME" xcodebuild clean build \ -workspace src/mobile/ios/App/App.xcworkspace \ @@ -16,3 +20,5 @@ xcodebuild -exportArchive \ CODE_SIGNING_ALLOWED=NO \ CODE_SIGNING_REQUIRED=NO \ CODE_SIGN_IDENTITY="" + +mv "dist_capacitor/App.ipa" "$EXPORT_PATH" diff --git a/scripts/clear-dist.sh b/scripts/clear-dist.sh new file mode 100644 index 00000000..966af440 --- /dev/null +++ b/scripts/clear-dist.sh @@ -0,0 +1,16 @@ +dirs=( + "dist" + "dist_electron" + "dist_capacitor" + "out" + "ssqq.npx-web-quick-start/bin" + "ssqq.npx-web-quick-start/node_modules" + "stats.html" +) + +for dir in ${dirs[@]}; do + if [ -e $dir ]; then + echo "rm -rf $dir" + rm -rf $dir + fi +done diff --git a/src/main/function/ipc.ts b/src/main/function/ipc.ts index 4c3bebf7..47277f66 100644 --- a/src/main/function/ipc.ts +++ b/src/main/function/ipc.ts @@ -16,6 +16,7 @@ import { runCommand } from './util.ts' import { win, touchBarInstance } from '../index.ts' import { Connector } from './connector.ts' import { logLevel } from '../index.ts' +import ScanNetwork from './scannetwork.ts' let connector = undefined as Connector | undefined const store = new Store() @@ -315,6 +316,11 @@ export function regIpcListener() { return { success: false, message: (ex as Error).message } } }) + // 启用服务发现 + ipcMain.on('sys:scanNetwork', () => { + if(win) + new ScanNetwork(win).scanNetwork() + }) // Windows:闪烁状态栏图标 ipcMain.on('win:flashWindow', () => { @@ -494,9 +500,7 @@ export function regIpcListener() { } if (menuIndex > -1) { const item = - itemIndex > -1 - ? template[menuIndex].submenu[itemIndex] - : template[menuIndex] + itemIndex > -1? template[menuIndex].submenu[itemIndex]: template[menuIndex] switch (action) { case 'label': item.label = value diff --git a/src/main/function/scannetwork.ts b/src/main/function/scannetwork.ts new file mode 100644 index 00000000..8a0bf780 --- /dev/null +++ b/src/main/function/scannetwork.ts @@ -0,0 +1,103 @@ +import os from 'os' +import http from 'http' +import log4js from 'log4js' + +import { logLevel } from '../index.ts' + +class ScanNetwork { + + private logger = log4js.getLogger('ScanNetwork') + private win: Electron.BrowserWindow + + constructor(win: Electron.BrowserWindow) { + this.logger.level = logLevel + this.win = win + } + + /** + * 获取局域网网段 + * @returns {string[]} 所有可能的 IP 地址 + */ + private getLocalSubnetIPs(): string[] { + const interfaces = os.networkInterfaces() + const ips = [] as string[] + + Object.entries(interfaces).forEach(([name, network]) => { + if (!name.startsWith('bridge')) { + network?.forEach(({ family, address, netmask }) => { + if (family === 'IPv4' && !address.startsWith('127') && !address.startsWith('169.254')) { + const subnetParts = address.split('.').map(Number); + const netmaskParts = netmask.split('.').map(Number); + + this.logger.info(`IP: ${address}, Netmask: ${netmask}`) + + for (let i = 1; i <= 254; i++) { + const possibleIP = subnetParts.map((part, index) => { + return (part & netmaskParts[index]) | ((i & ~netmaskParts[index]) & 0xff) + }).join('.') + ips.push(possibleIP === address ? '127.0.0.1' : possibleIP) + } + } + }) + } + }) + + return [...new Set(ips)] + } + + /** + * 检查指定 IP 和端口是否可连接 + * @param {string} ip - 目标 IP + * @param {number} port - 目标端口 + * @returns {Promise} 是否可连接 + **/ + private isPortOpen(ip: string, port: number): Promise { + return new Promise((resolve) => { + const req = http.get(`http://${ip}:${port}`, { + timeout: 200 + }, (res) => { + resolve(true) + res.destroy() + }) + + req.on('error', () => { + resolve(false) + }) + + req.on('timeout', () => { + req.destroy() + resolve(false) + }) + }) + } + + /** + * 遍历局域网 IP 并检测端口 + * @param {number} port - 要检查的端口 + */ + public async scanNetwork() { + const portList = [3001, 5700] + const ips = this.getLocalSubnetIPs() + if(ips.length < 1000) { + const results = await Promise.all( + portList.flatMap(port => + ips.map((ip) => this.isPortOpen(ip, port).then((isOpen) => ({ ip, port, isOpen }))) + ) + ) + this.logger.info('以下 IP 的端口开放:') + results.filter(({ isOpen }) => isOpen) + .forEach(({ ip, port }) => { + this.logger.info(`${ip}:${port}`) + this.win.webContents.send('sys:serviceFound', { + address: ip, + port: port + }) + }) + } else { + this.logger.error('IP 数量过多,放弃扫描') + } + + } +} + +export default ScanNetwork diff --git a/src/mobile/_assets/icon-background.png b/src/mobile/_assets/icon-background.png new file mode 100644 index 00000000..99e7e041 Binary files /dev/null and b/src/mobile/_assets/icon-background.png differ diff --git a/src/mobile/_assets/icon-foreground.png b/src/mobile/_assets/icon-foreground.png new file mode 100644 index 00000000..f8470c0e Binary files /dev/null and b/src/mobile/_assets/icon-foreground.png differ diff --git a/src/mobile/_assets/icon-only.png b/src/mobile/_assets/icon-only.png new file mode 100644 index 00000000..f8470c0e Binary files /dev/null and b/src/mobile/_assets/icon-only.png differ diff --git a/src/mobile/_assets/splash-dark.png b/src/mobile/_assets/splash-dark.png new file mode 100644 index 00000000..6ea4a753 Binary files /dev/null and b/src/mobile/_assets/splash-dark.png differ diff --git a/src/mobile/_assets/splash.png b/src/mobile/_assets/splash.png new file mode 100644 index 00000000..e766299b Binary files /dev/null and b/src/mobile/_assets/splash.png differ diff --git a/src/mobile/_signing/ssteam b/src/mobile/_signing/ssteam new file mode 100644 index 00000000..29065919 Binary files /dev/null and b/src/mobile/_signing/ssteam differ diff --git a/src/mobile/android/.gitignore b/src/mobile/android/.gitignore index 48354a3d..2ef587a0 100644 --- a/src/mobile/android/.gitignore +++ b/src/mobile/android/.gitignore @@ -1,6 +1,7 @@ # Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore # Built application files +output-metadata.json *.apk *.aar *.ap_ diff --git a/src/mobile/android/.idea/deviceManager.xml b/src/mobile/android/.idea/deviceManager.xml new file mode 100644 index 00000000..a758a5ea --- /dev/null +++ b/src/mobile/android/.idea/deviceManager.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/src/mobile/android/.idea/misc.xml b/src/mobile/android/.idea/misc.xml index 74dd639e..b2c751a3 100644 --- a/src/mobile/android/.idea/misc.xml +++ b/src/mobile/android/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/src/mobile/android/app/app.properties b/src/mobile/android/app/app.properties new file mode 100644 index 00000000..c9b84019 --- /dev/null +++ b/src/mobile/android/app/app.properties @@ -0,0 +1,2 @@ +versionName=3.0.1 +versionCode=3000001 \ No newline at end of file diff --git a/src/mobile/android/app/build.gradle b/src/mobile/android/app/build.gradle index 73db2093..8442d510 100644 --- a/src/mobile/android/app/build.gradle +++ b/src/mobile/android/app/build.gradle @@ -1,5 +1,8 @@ apply plugin: 'com.android.application' +def appProperties = new Properties(); +file("app.properties").withInputStream { appProperties.load(it) } + android { namespace "cn.stapxs.webqq" compileSdk rootProject.ext.compileSdkVersion @@ -7,8 +10,8 @@ android { applicationId "cn.stapxs.webqq" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0" + versionCode appProperties.getProperty("versionCode").toInteger() + versionName appProperties.getProperty("versionName") testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. diff --git a/src/mobile/android/app/capacitor.build.gradle b/src/mobile/android/app/capacitor.build.gradle index 1da7c68e..0914a66f 100644 --- a/src/mobile/android/app/capacitor.build.gradle +++ b/src/mobile/android/app/capacitor.build.gradle @@ -10,7 +10,10 @@ android { apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" dependencies { implementation project(':capacitor-app') + implementation project(':capacitor-keyboard') implementation project(':capacitor-local-notifications') + implementation project(':capacitor-status-bar') + implementation project(':hugotomazi-capacitor-navigation-bar') implementation project(':untiny-capacitor-safe-area') implementation project(':capacitor-onebot-connctor') diff --git a/src/mobile/android/app/src/main/AndroidManifest.xml b/src/mobile/android/app/src/main/AndroidManifest.xml index ce1c832d..344593f5 100644 --- a/src/mobile/android/app/src/main/AndroidManifest.xml +++ b/src/mobile/android/app/src/main/AndroidManifest.xml @@ -1,15 +1,13 @@ - + - - - - - + + + diff --git a/src/mobile/android/app/src/main/java/cn/stapxs/webqq/MainActivity.java b/src/mobile/android/app/src/main/java/cn/stapxs/webqq/MainActivity.java index b2389f6f..f71c118f 100644 --- a/src/mobile/android/app/src/main/java/cn/stapxs/webqq/MainActivity.java +++ b/src/mobile/android/app/src/main/java/cn/stapxs/webqq/MainActivity.java @@ -1,5 +1,22 @@ package cn.stapxs.webqq; +import android.os.Bundle; +import android.webkit.WebView; + +import com.getcapacitor.Bridge; import com.getcapacitor.BridgeActivity; -public class MainActivity extends BridgeActivity {} +public class MainActivity extends BridgeActivity { + @Override + public void onCreate(Bundle savedInstance) { + super.onCreate(savedInstance); + Bridge bridge = getBridge(); + WebView webView = bridge.getWebView(); + + webView.setOverScrollMode(WebView.OVER_SCROLL_NEVER); + webView.getSettings().setUseWideViewPort(true); + webView.getSettings().setLoadWithOverviewMode(true); + webView.getSettings().setSupportZoom(false); + webView.getSettings().setBuiltInZoomControls(false); + } +} diff --git a/src/mobile/android/app/src/main/res/drawable-land-hdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-land-hdpi/splash.png index e31573b4..71badba3 100644 Binary files a/src/mobile/android/app/src/main/res/drawable-land-hdpi/splash.png and b/src/mobile/android/app/src/main/res/drawable-land-hdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-land-ldpi/splash.png b/src/mobile/android/app/src/main/res/drawable-land-ldpi/splash.png new file mode 100644 index 00000000..6746fb3b Binary files /dev/null and b/src/mobile/android/app/src/main/res/drawable-land-ldpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-land-mdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-land-mdpi/splash.png index f7a64923..a3fcb496 100644 Binary files a/src/mobile/android/app/src/main/res/drawable-land-mdpi/splash.png and b/src/mobile/android/app/src/main/res/drawable-land-mdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-land-night-hdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-land-night-hdpi/splash.png new file mode 100644 index 00000000..8442a221 Binary files /dev/null and b/src/mobile/android/app/src/main/res/drawable-land-night-hdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-land-night-ldpi/splash.png b/src/mobile/android/app/src/main/res/drawable-land-night-ldpi/splash.png new file mode 100644 index 00000000..14121c69 Binary files /dev/null and b/src/mobile/android/app/src/main/res/drawable-land-night-ldpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-land-night-mdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-land-night-mdpi/splash.png new file mode 100644 index 00000000..1de02821 Binary files /dev/null and b/src/mobile/android/app/src/main/res/drawable-land-night-mdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-land-night-xhdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-land-night-xhdpi/splash.png new file mode 100644 index 00000000..308ad80a Binary files /dev/null and b/src/mobile/android/app/src/main/res/drawable-land-night-xhdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-land-night-xxhdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-land-night-xxhdpi/splash.png new file mode 100644 index 00000000..ca7dd14a Binary files /dev/null and b/src/mobile/android/app/src/main/res/drawable-land-night-xxhdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-land-night-xxxhdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-land-night-xxxhdpi/splash.png new file mode 100644 index 00000000..a61ae498 Binary files /dev/null and b/src/mobile/android/app/src/main/res/drawable-land-night-xxxhdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-land-xhdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-land-xhdpi/splash.png index 80772550..e38ce781 100644 Binary files a/src/mobile/android/app/src/main/res/drawable-land-xhdpi/splash.png and b/src/mobile/android/app/src/main/res/drawable-land-xhdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-land-xxhdpi/splash.png index 14c6c8fe..82cfa68e 100644 Binary files a/src/mobile/android/app/src/main/res/drawable-land-xxhdpi/splash.png and b/src/mobile/android/app/src/main/res/drawable-land-xxhdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-land-xxxhdpi/splash.png index 244ca250..17631ca0 100644 Binary files a/src/mobile/android/app/src/main/res/drawable-land-xxxhdpi/splash.png and b/src/mobile/android/app/src/main/res/drawable-land-xxxhdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-night/splash.png b/src/mobile/android/app/src/main/res/drawable-night/splash.png new file mode 100644 index 00000000..14121c69 Binary files /dev/null and b/src/mobile/android/app/src/main/res/drawable-night/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-port-hdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-port-hdpi/splash.png index 74faaa58..84829af6 100644 Binary files a/src/mobile/android/app/src/main/res/drawable-port-hdpi/splash.png and b/src/mobile/android/app/src/main/res/drawable-port-hdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-port-ldpi/splash.png b/src/mobile/android/app/src/main/res/drawable-port-ldpi/splash.png new file mode 100644 index 00000000..e9ec6f9b Binary files /dev/null and b/src/mobile/android/app/src/main/res/drawable-port-ldpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-port-mdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-port-mdpi/splash.png index e944f4ad..7846d704 100644 Binary files a/src/mobile/android/app/src/main/res/drawable-port-mdpi/splash.png and b/src/mobile/android/app/src/main/res/drawable-port-mdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-port-night-hdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-port-night-hdpi/splash.png new file mode 100644 index 00000000..8e664988 Binary files /dev/null and b/src/mobile/android/app/src/main/res/drawable-port-night-hdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-port-night-ldpi/splash.png b/src/mobile/android/app/src/main/res/drawable-port-night-ldpi/splash.png new file mode 100644 index 00000000..22138332 Binary files /dev/null and b/src/mobile/android/app/src/main/res/drawable-port-night-ldpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-port-night-mdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-port-night-mdpi/splash.png new file mode 100644 index 00000000..c9e152f4 Binary files /dev/null and b/src/mobile/android/app/src/main/res/drawable-port-night-mdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-port-night-xhdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-port-night-xhdpi/splash.png new file mode 100644 index 00000000..e78d521d Binary files /dev/null and b/src/mobile/android/app/src/main/res/drawable-port-night-xhdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-port-night-xxhdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-port-night-xxhdpi/splash.png new file mode 100644 index 00000000..3c92a326 Binary files /dev/null and b/src/mobile/android/app/src/main/res/drawable-port-night-xxhdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-port-night-xxxhdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-port-night-xxxhdpi/splash.png new file mode 100644 index 00000000..7ecbddd3 Binary files /dev/null and b/src/mobile/android/app/src/main/res/drawable-port-night-xxxhdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-port-xhdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-port-xhdpi/splash.png index 564a82ff..583c470a 100644 Binary files a/src/mobile/android/app/src/main/res/drawable-port-xhdpi/splash.png and b/src/mobile/android/app/src/main/res/drawable-port-xhdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-port-xxhdpi/splash.png index bfabe687..0672b084 100644 Binary files a/src/mobile/android/app/src/main/res/drawable-port-xxhdpi/splash.png and b/src/mobile/android/app/src/main/res/drawable-port-xxhdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/src/mobile/android/app/src/main/res/drawable-port-xxxhdpi/splash.png index 69290712..c5dc292b 100644 Binary files a/src/mobile/android/app/src/main/res/drawable-port-xxxhdpi/splash.png and b/src/mobile/android/app/src/main/res/drawable-port-xxxhdpi/splash.png differ diff --git a/src/mobile/android/app/src/main/res/drawable/splash.png b/src/mobile/android/app/src/main/res/drawable/splash.png index f7a64923..7846d704 100644 Binary files a/src/mobile/android/app/src/main/res/drawable/splash.png and b/src/mobile/android/app/src/main/res/drawable/splash.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/src/mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 036d09bc..0aa82aa1 100644 --- a/src/mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/src/mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,9 @@ - - + + + + + + \ No newline at end of file diff --git a/src/mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/src/mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 036d09bc..0aa82aa1 100644 --- a/src/mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/src/mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,9 @@ - - + + + + + + \ No newline at end of file diff --git a/src/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/src/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index c023e505..7873af3a 100644 Binary files a/src/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/src/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png b/src/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png new file mode 100644 index 00000000..91a97489 Binary files /dev/null and b/src/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/src/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png index 2127973b..d9e18be8 100644 Binary files a/src/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and b/src/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/src/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png index b441f37d..a6b129d6 100644 Binary files a/src/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/src/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher.png b/src/mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher.png new file mode 100644 index 00000000..c00a1047 Binary files /dev/null and b/src/mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher_background.png b/src/mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher_background.png new file mode 100644 index 00000000..df35134c Binary files /dev/null and b/src/mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher_background.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher_foreground.png b/src/mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher_foreground.png new file mode 100644 index 00000000..762dd59f Binary files /dev/null and b/src/mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher_foreground.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png b/src/mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png new file mode 100644 index 00000000..42c7bf89 Binary files /dev/null and b/src/mobile/android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/src/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 72905b85..4b331b0b 100644 Binary files a/src/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/src/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png b/src/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png new file mode 100644 index 00000000..e91ef4c1 Binary files /dev/null and b/src/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/src/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png index 8ed0605c..78ea290b 100644 Binary files a/src/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and b/src/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/src/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png index 9502e47a..9160bda8 100644 Binary files a/src/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/src/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/src/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 4d1e0771..ba53c246 100644 Binary files a/src/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/src/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png b/src/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png new file mode 100644 index 00000000..10c3ebc6 Binary files /dev/null and b/src/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/src/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png index df0f1588..16e23201 100644 Binary files a/src/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and b/src/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/src/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png index 853db043..0ef30a9a 100644 Binary files a/src/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/src/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/src/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 6cdf97c1..45b5952c 100644 Binary files a/src/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/src/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png b/src/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png new file mode 100644 index 00000000..44c226b1 Binary files /dev/null and b/src/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/src/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png index 2960cbb6..9e385ff8 100644 Binary files a/src/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and b/src/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/src/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index 8e3093a8..61e24305 100644 Binary files a/src/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/src/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/src/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 46de6e25..cec1220c 100644 Binary files a/src/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/src/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png b/src/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png new file mode 100644 index 00000000..8a72324c Binary files /dev/null and b/src/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/src/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png index d2ea9abe..99225718 100644 Binary files a/src/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and b/src/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/src/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/src/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index a40d73e9..b5f2df06 100644 Binary files a/src/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/src/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/src/mobile/android/capacitor.settings.gradle b/src/mobile/android/capacitor.settings.gradle index c2d31d71..564c5355 100644 --- a/src/mobile/android/capacitor.settings.gradle +++ b/src/mobile/android/capacitor.settings.gradle @@ -5,9 +5,18 @@ project(':capacitor-android').projectDir = new File('../../../node_modules/@capa include ':capacitor-app' project(':capacitor-app').projectDir = new File('../../../node_modules/@capacitor/app/android') +include ':capacitor-keyboard' +project(':capacitor-keyboard').projectDir = new File('../../../node_modules/@capacitor/keyboard/android') + include ':capacitor-local-notifications' project(':capacitor-local-notifications').projectDir = new File('../../../node_modules/@capacitor/local-notifications/android') +include ':capacitor-status-bar' +project(':capacitor-status-bar').projectDir = new File('../../../node_modules/@capacitor/status-bar/android') + +include ':hugotomazi-capacitor-navigation-bar' +project(':hugotomazi-capacitor-navigation-bar').projectDir = new File('../../../node_modules/@hugotomazi/capacitor-navigation-bar/android') + include ':untiny-capacitor-safe-area' project(':untiny-capacitor-safe-area').projectDir = new File('../../../node_modules/@untiny/capacitor-safe-area/android') diff --git a/src/mobile/android/variables.gradle b/src/mobile/android/variables.gradle index 8ef305d0..c847fed2 100644 --- a/src/mobile/android/variables.gradle +++ b/src/mobile/android/variables.gradle @@ -13,4 +13,4 @@ ext { androidxJunitVersion = '1.1.5' androidxEspressoCoreVersion = '3.5.1' cordovaAndroidVersion = '10.1.1' -} \ No newline at end of file +} diff --git a/src/mobile/ios/App/App.xcodeproj/project.pbxproj b/src/mobile/ios/App/App.xcodeproj/project.pbxproj index 8ba4383e..338ab4b7 100644 --- a/src/mobile/ios/App/App.xcodeproj/project.pbxproj +++ b/src/mobile/ios/App/App.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; }; 50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; }; A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; }; + A2E5D1EB2D1297860071C6EF /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A2E5D1EA2D1297860071C6EF /* Settings.bundle */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -27,6 +28,7 @@ 504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; + A2E5D1EA2D1297860071C6EF /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = ""; }; AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = ""; }; FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = ""; }; @@ -55,6 +57,7 @@ 504EC2FB1FED79650016851F = { isa = PBXGroup; children = ( + A2E5D1EA2D1297860071C6EF /* Settings.bundle */, 504EC3061FED79650016851F /* App */, 504EC3051FED79650016851F /* Products */, 7F8756D8B27F46E3366F6CEA /* Pods */, @@ -122,8 +125,8 @@ 504EC2FC1FED79650016851F /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 0920; + LastSwiftUpdateCheck = 920; + LastUpgradeCheck = 920; TargetAttributes = { 504EC3031FED79650016851F = { CreatedOnToolsVersion = 9.2; @@ -163,6 +166,7 @@ 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */, 504EC30D1FED79650016851F /* Main.storyboard in Resources */, 2FAD9763203C412B000D30F8 /* config.xml in Resources */, + A2E5D1EB2D1297860071C6EF /* Settings.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -351,9 +355,11 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = LZ4NKVK3NY; INFOPLIST_FILE = App/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; + INFOPLIST_KEY_CFBundleDisplayName = "Stapx QQ Lite"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 3.0.0; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; PRODUCT_BUNDLE_IDENTIFIER = cn.stapxs.webqq; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -372,9 +378,11 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = LZ4NKVK3NY; INFOPLIST_FILE = App/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; + INFOPLIST_KEY_CFBundleDisplayName = "Stapx QQ Lite"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 3.0.0; PRODUCT_BUNDLE_IDENTIFIER = cn.stapxs.webqq; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; diff --git a/src/mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png b/src/mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png index 4a0c239f..1ef1dad3 100644 Binary files a/src/mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png and b/src/mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png differ diff --git a/src/mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json b/src/mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json index 9b7d382d..b1a84833 100644 --- a/src/mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/src/mobile/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,14 +1,14 @@ { - "images" : [ + "images": [ { - "filename" : "AppIcon-512@2x.png", - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" + "idiom": "universal", + "size": "1024x1024", + "filename": "AppIcon-512@2x.png", + "platform": "ios" } ], - "info" : { - "author" : "xcode", - "version" : 1 + "info": { + "author": "xcode", + "version": 1 } -} +} \ No newline at end of file diff --git a/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json b/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json index d7d96a67..84a416d6 100644 --- a/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json +++ b/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json @@ -1,23 +1,56 @@ { - "images" : [ + "images": [ { - "idiom" : "universal", - "filename" : "splash-2732x2732-2.png", - "scale" : "1x" + "idiom": "universal", + "filename": "Default@1x~universal~anyany.png", + "scale": "1x" }, { - "idiom" : "universal", - "filename" : "splash-2732x2732-1.png", - "scale" : "2x" + "idiom": "universal", + "filename": "Default@2x~universal~anyany.png", + "scale": "2x" }, { - "idiom" : "universal", - "filename" : "splash-2732x2732.png", - "scale" : "3x" + "idiom": "universal", + "filename": "Default@3x~universal~anyany.png", + "scale": "3x" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "idiom": "universal", + "scale": "1x", + "filename": "Default@1x~universal~anyany-dark.png" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "idiom": "universal", + "scale": "2x", + "filename": "Default@2x~universal~anyany-dark.png" + }, + { + "appearances": [ + { + "appearance": "luminosity", + "value": "dark" + } + ], + "idiom": "universal", + "scale": "3x", + "filename": "Default@3x~universal~anyany-dark.png" } ], - "info" : { - "version" : 1, - "author" : "xcode" + "info": { + "version": 1, + "author": "xcode" } } \ No newline at end of file diff --git a/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany-dark.png b/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany-dark.png new file mode 100644 index 00000000..6d8da5c0 Binary files /dev/null and b/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany-dark.png differ diff --git a/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany.png b/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany.png new file mode 100644 index 00000000..e7394f36 Binary files /dev/null and b/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany.png differ diff --git a/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany-dark.png b/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany-dark.png new file mode 100644 index 00000000..6d8da5c0 Binary files /dev/null and b/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany-dark.png differ diff --git a/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany.png b/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany.png new file mode 100644 index 00000000..e7394f36 Binary files /dev/null and b/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany.png differ diff --git a/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany-dark.png b/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany-dark.png new file mode 100644 index 00000000..6d8da5c0 Binary files /dev/null and b/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany-dark.png differ diff --git a/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany.png b/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany.png new file mode 100644 index 00000000..e7394f36 Binary files /dev/null and b/src/mobile/ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany.png differ diff --git a/src/mobile/ios/App/App/Info.plist b/src/mobile/ios/App/App/Info.plist index 1984a8e2..3817265c 100644 --- a/src/mobile/ios/App/App/Info.plist +++ b/src/mobile/ios/App/App/Info.plist @@ -1,67 +1,65 @@ - - CFBundleDevelopmentRegion - zh - CFBundleDisplayName - Stapxs QQ Lite - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - + + CFBundleDevelopmentRegion + zh + CFBundleDisplayName + Stapxs QQ Lite + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 3.0.1 + CFBundleVersion + 3.0.1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + AllowsInlineMediaPlayback NSAppTransportSecurity - NSAllowsArbitraryLoads - + NSAllowsArbitraryLoads + - NSRemoteNotificationType - Stapxs QQ Lite 需要您的同意,才能将新消息的通知推送给您。 UlUserNotificationSettings - UIUserNotificationTypeAlert - - UIUserNotificationTypeBadge - - UIUserNotificationTypeSound - + UIUserNotificationTypeAlert + + UIUserNotificationTypeBadge + + UIUserNotificationTypeSound + - + NSRemoteNotificationType + Stapxs QQ Lite 需要能的同意才能推送新的通知消息 + NSLocalNetworkUsageDescription + Stapxs QQ Lite 需要访问局域网以自动发现可用的服务 + diff --git a/src/mobile/ios/App/Podfile b/src/mobile/ios/App/Podfile index 0eaae72c..a623bcfb 100644 --- a/src/mobile/ios/App/Podfile +++ b/src/mobile/ios/App/Podfile @@ -12,7 +12,10 @@ def capacitor_pods pod 'Capacitor', :path => '../../../../node_modules/@capacitor/ios' pod 'CapacitorCordova', :path => '../../../../node_modules/@capacitor/ios' pod 'CapacitorApp', :path => '../../../../node_modules/@capacitor/app' + pod 'CapacitorKeyboard', :path => '../../../../node_modules/@capacitor/keyboard' pod 'CapacitorLocalNotifications', :path => '../../../../node_modules/@capacitor/local-notifications' + pod 'CapacitorStatusBar', :path => '../../../../node_modules/@capacitor/status-bar' + pod 'HugotomaziCapacitorNavigationBar', :path => '../../../../node_modules/@hugotomazi/capacitor-navigation-bar' pod 'UntinyCapacitorSafeArea', :path => '../../../../node_modules/@untiny/capacitor-safe-area' pod 'CapacitorOnebotConnctor', :path => '../../../../node_modules/capacitor-onebot-connctor' end diff --git a/src/mobile/ios/App/Podfile.lock b/src/mobile/ios/App/Podfile.lock index 62946d5e..470f03af 100644 --- a/src/mobile/ios/App/Podfile.lock +++ b/src/mobile/ios/App/Podfile.lock @@ -4,10 +4,16 @@ PODS: - CapacitorApp (6.0.2): - Capacitor - CapacitorCordova (6.2.0) + - CapacitorKeyboard (6.0.3): + - Capacitor - CapacitorLocalNotifications (6.1.1): - Capacitor - CapacitorOnebotConnctor (0.0.1): - Capacitor + - CapacitorStatusBar (6.0.2): + - Capacitor + - HugotomaziCapacitorNavigationBar (4.0.1): + - Capacitor - UntinyCapacitorSafeArea (1.0.3): - Capacitor @@ -15,8 +21,11 @@ DEPENDENCIES: - "Capacitor (from `../../../../node_modules/@capacitor/ios`)" - "CapacitorApp (from `../../../../node_modules/@capacitor/app`)" - "CapacitorCordova (from `../../../../node_modules/@capacitor/ios`)" + - "CapacitorKeyboard (from `../../../../node_modules/@capacitor/keyboard`)" - "CapacitorLocalNotifications (from `../../../../node_modules/@capacitor/local-notifications`)" - CapacitorOnebotConnctor (from `../../../../node_modules/capacitor-onebot-connctor`) + - "CapacitorStatusBar (from `../../../../node_modules/@capacitor/status-bar`)" + - "HugotomaziCapacitorNavigationBar (from `../../../../node_modules/@hugotomazi/capacitor-navigation-bar`)" - "UntinyCapacitorSafeArea (from `../../../../node_modules/@untiny/capacitor-safe-area`)" EXTERNAL SOURCES: @@ -26,10 +35,16 @@ EXTERNAL SOURCES: :path: "../../../../node_modules/@capacitor/app" CapacitorCordova: :path: "../../../../node_modules/@capacitor/ios" + CapacitorKeyboard: + :path: "../../../../node_modules/@capacitor/keyboard" CapacitorLocalNotifications: :path: "../../../../node_modules/@capacitor/local-notifications" CapacitorOnebotConnctor: :path: "../../../../node_modules/capacitor-onebot-connctor" + CapacitorStatusBar: + :path: "../../../../node_modules/@capacitor/status-bar" + HugotomaziCapacitorNavigationBar: + :path: "../../../../node_modules/@hugotomazi/capacitor-navigation-bar" UntinyCapacitorSafeArea: :path: "../../../../node_modules/@untiny/capacitor-safe-area" @@ -37,10 +52,13 @@ SPEC CHECKSUMS: Capacitor: 1f3c7b9802d958cd8c4eb63895fff85dff2e1eea CapacitorApp: 2a8c3a0b0814322e5e6e15fe595f02c3808f0f8b CapacitorCordova: b33e7f4aa4ed105dd43283acdd940964374a87d9 + CapacitorKeyboard: 460c6f9ec5e52c84f2742d5ce2e67bbc7ab0ebb0 CapacitorLocalNotifications: 113dcab0b40781e8463bfdbbd6b54c6116361644 CapacitorOnebotConnctor: 4b8b6ea764a19d57c4c14df6c9c628a803bb0131 + CapacitorStatusBar: 3b9ac7d0684770522c532d1158a1434512ab1477 + HugotomaziCapacitorNavigationBar: 57d7cd51c65ef5e40159bafb0095ee99fab432ba UntinyCapacitorSafeArea: 6354c662c37e272d587bb2a224cba030d902b2bd -PODFILE CHECKSUM: a1b4802350b6cc97c0940d5b52fbb3e890ff997c +PODFILE CHECKSUM: c65146071ed43150d5e23368cffe06dd48ed84df COCOAPODS: 1.16.2 diff --git a/src/mobile/ios/App/Settings.bundle/Root.plist b/src/mobile/ios/App/Settings.bundle/Root.plist new file mode 100644 index 00000000..9a3e1b26 --- /dev/null +++ b/src/mobile/ios/App/Settings.bundle/Root.plist @@ -0,0 +1,39 @@ + + + + + StringsTable + Root + PreferenceSpecifiers + + + Type + PSToggleSwitchSpecifier + Title + 启用彩蛋 + Key + egg-config + DefaultValue + + + + Type + PSTitleValueSpecifier + Title + 版本 + Key + version + DefaultValue + 3.0.1 + IsSecure + + KeyboardType + Alphabet + AutocapitalizationType + None + AutocorrectionType + No + + + + diff --git a/src/mobile/ios/App/Settings.bundle/en.lproj/Root.strings b/src/mobile/ios/App/Settings.bundle/en.lproj/Root.strings new file mode 100644 index 00000000..8cd87b9d Binary files /dev/null and b/src/mobile/ios/App/Settings.bundle/en.lproj/Root.strings differ diff --git a/src/renderer/src/App.vue b/src/renderer/src/App.vue index cffff442..67dee05e 100644 --- a/src/renderer/src/App.vue +++ b/src/renderer/src/App.vue @@ -1,907 +1,737 @@ diff --git a/src/renderer/src/assets/css/append/append_android.css b/src/renderer/src/assets/css/append/append_android.css new file mode 100644 index 00000000..7974e87b --- /dev/null +++ b/src/renderer/src/assets/css/append/append_android.css @@ -0,0 +1,3 @@ +.chat-pan > div.more > div:nth-child(2) > div:nth-child(2) > div { + display: block !important; +} diff --git a/src/renderer/src/assets/css/append/append_darwin.css b/src/renderer/src/assets/css/append/append_darwin.css index f7eadd38..55ecc6e9 100644 --- a/src/renderer/src/assets/css/append/append_darwin.css +++ b/src/renderer/src/assets/css/append/append_darwin.css @@ -40,9 +40,6 @@ body { .chat-pan > div.info { margin-top: 35px; } - .chat-pan > div.info > svg { - display: block; - } .chat-pan.open > div.info > svg { display: none; } diff --git a/src/renderer/src/assets/css/append/append_ios.css b/src/renderer/src/assets/css/append/append_ios.css deleted file mode 100644 index 706640fc..00000000 --- a/src/renderer/src/assets/css/append/append_ios.css +++ /dev/null @@ -1,213 +0,0 @@ -html { - -webkit-tap-highlight-color: transparent; -} -.ss-card { - border-radius: 15px; -} - -#app { - background: var(--color-card-1); -} -.main-body > ul { - background: rgba(var(--color-card-rgb), 0.7); - backdrop-filter: blur(10px); -} - -/* 联系人列表 */ -.friend-list .small { - display: none !important; -} -.friend-list .base { - display: flex !important; -} -.friend-list .base > span { - font-size: 1.5rem; -} -.friend-list .base > svg { - height: 1.3rem !important; -} -.friend-list > div:first-child label { - height: calc(1rem + 25px); - margin-top: 10px; - display: flex; -} -.friend-list > div:first-child label > input { - font-size: 1rem; -} - -/* 聊天面板 */ -.chat-pan > div.info > svg { - display: none; -} - -.main-body > ul { - justify-content: space-evenly; -} -.main-body > ul > li > span { - display: block !important; -} -.hiden-home { - margin-left: -140px; -} -.main-body > ul > li:first-child { - margin-top: 0; -} -.main-body > ul > li.active > span, -.main-body > ul > li.active > svg { - background-color: transparent; - color: var(--color-main); -} - -.chat-pan { - z-index: 21; - box-shadow: 0 0 5px var(--color-shader); - height: calc(100% + 35px - var(--safe-area-bottom)); -} -.chat-pan > div.info { - margin: 0 0 15px 0; - width: calc(100% - 50px); - padding: 15px 25px; - padding-top: calc(var(--safe-area-top) + 15px); -} -.merge-pan { - box-shadow: 0 0 5px var(--color-shader); -} -.merge-pan>div:last-child>div:first-child { - margin: calc(var(--safe-area-top) + 15px) 35px 0 35px; - flex-direction: row-reverse; - overflow: hidden; - padding: 0; -} -.merge-pan>div:last-child>div:first-child svg:first-child { - display: none; -} -.merge-pan>div:last-child>div:first-child svg { - transform: translateX(calc(-50% + 1px)); -} -.merge-pan>div:last-child>div:first-child span { - font-size: 1.5rem; -} -.chat-pan > div.bg { - height: calc(100% - 34px - var(--append-fs-adaptation)); -} -.chat-pan > div.chat { - margin-bottom: -60px; - padding-bottom: 60px; -} -.chat-pan > div.chat > div:first-child > div:last-child { - padding-bottom: 70px; -} -.chat-pan > div.more { - flex-direction: column-reverse; - display: flex; -} -.chat-pan > div.more > div:first-child { - background: var(--color-card-1); -} -.chat-pan > div.more > div:nth-child(2) { - background: rgba(var(--color-card-1-rgb), 0.8); - backdrop-filter: blur(50px); -} -.chat-pan > div.more > div:nth-child(2) > div:first-child { - border-radius: 999px; -} -.chat-pan > div.more > div:nth-child(2) > div:nth-child(2) { - background: transparent; - border: 1px solid var(--color-font-2); - opacity: 0.7; - border-radius: 999px; - height: 45px; -} -.chat-pan > div.more > div:nth-child(2) > div:nth-child(2) > div { - display: none; -} - -.msg-menu-body { - max-width: 35%; - width: 35%; -} -.chat-pan > div.new-msg { - margin: -50px 20px 20px auto; -} - -.chat-info > header { - margin-top: calc(var(--safe-area-top)); - flex-direction: row-reverse; - overflow: hidden; - transform: translateX(20px); -} -.chat-info>header>span { - font-size: 1.5rem; - font-weight: bold; - margin-bottom: 20px; -} -.chat-info>header>svg { - width: 2.2rem; - height: 2.2rem; - transform: translateX(calc(-50% + 0.5px)); - margin-right: -10px; -} - -.more-detail { - background: var(--color-card-1); -} -.more-detail > div { - background: var(--color-card-2); -} -.more-detail.show { - height: calc(var(--safe-area-bottom) + 50px); -} -.face-pan { - position: relative; - transform: unset; - width: 100%; - border-radius: 0; - margin: 0; -} - -.face-pan div.tab-main { - flex-direction: column-reverse; - display: flex; -} -.tab-main>div:first-child { - padding-top: 30px; -} -.tab-main>div:first-child svg { - font-size: 1.2rem; -} - -.img-sender { - height: calc(100% - var(--safe-area-top) - calc(var(--safe-area-bottom) + 15px)); - margin: calc(var(--safe-area-top) + 15px) 20px 0 20px; - width: calc(100% - 40px); -} -.img-sender > div.card { - box-shadow: 0 0 5px var(--color-shader) !important; - border-radius: 7px !important; -} - -/* 消息 */ -.message-body > div { - border-radius: 20px; - padding: 7px 15px; - margin-top: 10px; -} -.msg-img { - border-radius: 20px; - max-height: 20vh; -} -.msg-img.alone { - max-width: calc(100% + 30px); - margin: -10px -15px; -} - -/* 设置面板 */ -.tab-main>div:first-child { - width: fit-content; - margin: 10px auto 20px auto !important; - border-radius: 999px; - padding-top: 20px !important; -} -.opt-tab .tab-bar { - margin: -17px -10px -17px -50px; -} diff --git a/src/renderer/src/assets/css/append/append_linux.css b/src/renderer/src/assets/css/append/append_linux.css index 6a586666..c05aac5c 100644 --- a/src/renderer/src/assets/css/append/append_linux.css +++ b/src/renderer/src/assets/css/append/append_linux.css @@ -101,7 +101,7 @@ width: 60px !important; } .friend-list > div:first-child { - margin: 55px 15px 0 8px !important; + margin: 15px 15px 0 8px !important; margin-left: 0 !important; } .friend-list > div:first-child > div.small > div { @@ -122,6 +122,6 @@ @media (max-width: 500px) { .friend-list > div:first-child { - margin: 80px 15px 0 0 !important; + margin: 15px 15px 0 0 !important; } } diff --git a/src/renderer/src/assets/css/append/append_mobile.css b/src/renderer/src/assets/css/append/append_mobile.css new file mode 100644 index 00000000..3dfc464b --- /dev/null +++ b/src/renderer/src/assets/css/append/append_mobile.css @@ -0,0 +1,343 @@ +html { + -webkit-tap-highlight-color: transparent; +} +.ss-card { + border-radius: 15px; +} + +.tab-bar>li svg { + font-size: 1.2rem !important; +} +.tab-bar>span { + display: none; +} + +#app { + background: var(--color-card); +} +.main-body > ul { + background: rgba(var(--color-card-rgb), 0.7); + backdrop-filter: blur(35px); +} + +.login-pan-card { + background: transparent; + box-shadow: unset; +} +.login-pan-card:hover { + box-shadow: unset !important; +} +.wave-pan { + display: none; +} + +/* 一级侧栏 */ +.main-body > ul { + justify-content: space-evenly; + padding-bottom: var(--safe-area-bottom); + position: absolute; + z-index: 20; + display: flex; + flex-direction: row; + width: 365px; + height: 75px; + left: 0; + bottom: 0; +} +.side-bar-space { + display: none; +} +.friend-list { + background: var(--color-card); + width: 365px; +} +.chat-pan { + left: 365px; +} +.friend-body img { + height: 45px; + width: 45px; +} + +.home-body { + background: var(--color-card); + width: calc(100% - 365px); + margin-left: 365px; + border-left: 1px solid var(--color-card-2); +} + +/* 聊天面板 */ +.viewer-footer > div { + margin-top: calc(var(--safe-area--viewer-top) + 15px); +} +.chat-pan > div.info > svg { + display: none; +} +.main-body > ul > li > span { + display: block !important; +} +.main-body > ul > li:first-child { + margin-top: 20px; +} +.main-body > ul > li.active > span, +.main-body > ul > li.active > svg { + background-color: transparent; + color: var(--color-main); +} +.chat-pan { + z-index: 21; + height: calc(100% + 35px - var(--safe-area-bottom)); + border-left: 1px solid var(--color-card-2); +} +.chat-pan > div.info { + margin: 0 0 15px 0; + width: calc(100% - 50px); + padding: 15px 25px; + padding-top: calc(var(--safe-area-top) + 15px); + background: rgba(var(--color-card-rgb), 0.7); + backdrop-filter: blur(35px); + box-shadow: unset; + border-bottom: 1px solid var(--color-card-2); + border-radius: 0; +} +.merge-pan { + box-shadow: 0 0 5px var(--color-shader); +} +.merge-pan>div:last-child>div:first-child { + margin: calc(var(--safe-area-top) + 15px) 35px 0 35px; + flex-direction: row-reverse; + overflow: hidden; + padding: 0; +} +.merge-pan>div:last-child>div:first-child svg:first-child { + display: none; +} +.merge-pan>div:last-child>div:first-child svg { + transform: translateX(calc(-50% + 1px)); +} +.merge-pan>div:last-child>div:first-child span { + font-size: 1.5rem; +} +.chat-pan > div.bg { + height: calc(100% - 34px - var(--append-fs-adaptation)); +} +.chat-pan > div.chat { + margin-bottom: -60px; + padding-bottom: 60px; +} +.chat-pan > div.chat > div:first-child > div:last-child { + padding-bottom: 70px; +} +.chat-pan > div.more { + padding-bottom: var(--safe-area-bottom); + border-top: 1px solid var(--color-card-2); +} +.chat-pan > div.more > div:first-child { + background: var(--color-card-1); +} +.chat-pan > div.more > div:nth-child(2) { + background: rgba(var(--color-card-rgb), 0.7); + backdrop-filter: blur(35px); +} +.chat-pan > div.more > div:nth-child(2) > div:first-child { + border-radius: 999px; +} +.chat-pan > div.more > div:nth-child(2) > div:nth-child(2) { + background: transparent; + border: 1px solid var(--color-font-2); + opacity: 0.7; + border-radius: 999px; +} +.chat-pan > div.more > div:nth-child(2) > div:nth-child(2) > div { + display: none; +} +.msg-menu-body { + max-width: 35%; + width: 35%; +} +.chat-pan > div.new-msg { + margin: -50px 20px 20px auto; +} +.more-detail { + background: var(--color-card-1); +} +.more-detail > div { + background: var(--color-card-2); +} +.face-pan { + position: relative; + transform: unset; + width: 100%; + border-radius: 0; + margin: 0; +} +.face-pan div.tab-main > div { + padding-top: 10px !important; +} +.base-face, .face-stickers { + height: 300px; +} +.img-sender { + height: calc(100% - var(--safe-area-top) - calc(var(--safe-area-bottom) + 15px)); + margin: calc(var(--safe-area-top) + 15px) 20px 0 20px; + width: calc(100% - 40px); +} +.img-sender > div.card { + box-shadow: 0 0 5px var(--color-shader) !important; + border-radius: 7px !important; +} +/* 消息 */ +.message-body > div { + border-radius: 20px; + padding: 7px 15px; + margin-top: 10px; +} +.msg-img { + border-radius: 20px; + max-height: 40vh; +} +.msg-img.alone { + max-width: calc(100% + 30px); + margin: -10px -15px; +} +/* 设置面板 */ +.opt-tab { + height: calc(100% - 145px); +} +.opt-tab > div:first-child { + box-shadow: unset !important; + margin: 0 -10px 0 -10px !important; + padding-top: calc(var(--safe-area-top) + 20px); + background: transparent; + backdrop-filter: blur(35px); +} +.opt-tab > div:first-child > div { + box-shadow: 0 0 5px var(--color-shader); + width: fit-content; + margin: 0 auto 20px auto; + background: var(--color-card-2); + border-radius: 999px; + padding: 0 20px !important; +} +.opt-tab > div:first-child svg { + font-size: 1.2rem; +} +.opt-tab .tab-bar { + margin: -17px -10px -17px -50px; +} +.opt-tab .tab-bar > li:last-child > div { + box-shadow: -10px 0 0 0 var(--color-card), 10px 0 0 0 var(--color-card); + background: var(--color-card); + height: 30px; + margin-top: -30px; + border-radius: 999px; + z-index: 1; +} +.opt-tab .tab-bar > li span { + z-index: 2; +} +.opt-tab .tab-bar > li:last-child span { + transform: translateY(-5px); +} +.opt-tab .tab-body { + margin-top: -60px; + padding-top: 70px; +} +.opt-tab .tab-body > div { + padding: 0 10%; +} +.friend-list-space { + border-left: 1px solid var(--color-card-2); + background: var(--color-card); +} + +.opt-main { + padding-top: 0; +} +.opt-main>div:first-child { + padding-top: var(--safe-area-top); +} + +@media (max-width: 600px) { + .main-body > div { + height: calc(100% - 75px - var(--safe-area-top) - var(--safe-area-bottom)); + padding-bottom: calc(75px + var(--safe-area-bottom)); + margin-top: var(--safe-area-top); + } + + .opt-main-tab, + .main-body > div > div[name="主页"] { + margin-top: calc(1px - var(--safe-area-bottom))!important; + height: calc(100% + var(--safe-area-top) + var(--safe-area-bottom)) !important; + } + + .chat-pan { + box-shadow: 0 0 5px var(--color-shader); + } + + /* 联系人列表 */ + .friend-list .small { + display: none !important; + } + .friend-list .base { + display: flex !important; + } + .friend-list .base > span { + font-size: 1.5rem; + } + .friend-list .base > svg { + height: 1.3rem !important; + } + .friend-list > div:first-child label { + height: calc(1rem + 25px); + margin-top: 10px; + display: flex; + } + .friend-list > div:first-child label > input { + font-size: 1rem; + } + .friend-body > div:nth-child(1) { + transform: scaleY(0) !important; + height: unset !important; + width: 6px !important; + border-radius: 6px !important; + position: unset !important; + } + .friend-body > div:nth-child(1).new { + transform: scaleY(0.5) !important; + } + .exp-header:not(.open) { + display: flex !important; + } + + .chat-info > header { + margin-top: calc(var(--safe-area-top)); + flex-direction: row-reverse; + overflow: hidden; + transform: translateX(20px); + } + .chat-info>header>span { + font-size: 1.5rem; + font-weight: bold; + margin-bottom: 20px; + } + .chat-info>header>svg { + width: 2.2rem; + height: 2.2rem; + transform: translateX(calc(-50% + 0.5px)); + margin-right: -10px; + } + + .msg-img { + max-height: 20vh; + } + + .home-body { + width: 100%; + margin-left: 0; + } + + .opt-tab .tab-body > div { + padding: 0; + } +} diff --git a/src/renderer/src/assets/css/append/append_new.css b/src/renderer/src/assets/css/append/append_new.css index 32eb989f..e2c110ff 100644 --- a/src/renderer/src/assets/css/append/append_new.css +++ b/src/renderer/src/assets/css/append/append_new.css @@ -61,6 +61,23 @@ body { top: 75vh; } +.quick-login { + background: transparent; + padding: 0; +} +.quick-login > div.list::-webkit-scrollbar { + display: none; +} +.quick-login > div.list > div { + border: 1px solid var(--color-main); + background: transparent; + border-radius: 999px; +} +.quick-login > div.list > div > div { + border: 1px solid var(--color-main); + background: transparent; +} + .friend-list { width: 220px; } @@ -730,7 +747,7 @@ body { height: 60px !important; } .friend-list { - width: 75px !important; + width: 75px; } .chat-pan { height: calc(100% - 60px); @@ -749,6 +766,7 @@ body { padding: 0 7px 0 5px !important; } .friend-list > div:first-child > div.small { + margin-left: 15px; margin-top: 10px; height: 44px; } diff --git a/src/renderer/src/assets/css/chat.css b/src/renderer/src/assets/css/chat.css index a32c447c..90aa495e 100644 --- a/src/renderer/src/assets/css/chat.css +++ b/src/renderer/src/assets/css/chat.css @@ -113,7 +113,7 @@ input { z-index: 1; flex: 1; } -.chat-pan > div.chat > div { +.chat-pan > div.chat > div:last-child { height: calc(100% - var(--safe-area-bottom)); } .chat-pan > div.chat::-webkit-scrollbar { diff --git a/src/renderer/src/assets/css/view.css b/src/renderer/src/assets/css/view.css index 0e46cc74..b74124b9 100644 --- a/src/renderer/src/assets/css/view.css +++ b/src/renderer/src/assets/css/view.css @@ -2,6 +2,7 @@ html, body { font-family: Helvetica, Arial, Verdana, Tahoma, sans-serif; background: var(--color-main); + position: relative; user-select: none; overflow: hidden; height: 100%; @@ -98,8 +99,6 @@ textarea:focus { #app, #base-app { - --safe-area-bottom: 0; - overflow: hidden; height: 100%; } @@ -130,7 +129,7 @@ textarea:focus { height: 100%; border: none; min-width: 75px; - padding: 0; + padding: 0 0 calc(var(--safe-area-bottom) + 10px) 0; margin: 0; } .side-bar-space { @@ -196,6 +195,67 @@ textarea:focus { width: 100%; } +.quick-login { + background: var(--color-card-1); + box-shadow: unset !important; + padding: 15px; +} +.quick-login > div.title { + align-items: center; + margin-bottom: 15px; + display: flex; +} +.quick-login > div.title > span { + flex: 1; + text-align: left; + color: var(--color-font-1); + margin-left: 10px; + font-size: 0.9rem; + display: block; +} +.quick-login > div.title > a { + background: var(--color-main); + margin: 0; + color: var(--color-font-r); + border-radius: 7px; + padding: 3px 10px; + cursor: pointer; +} +.quick-login > div.list { + max-height: calc(calc(1rem + 30px) * 2); + overflow-y: scroll; +} +.quick-login > div.list > div { + background: var(--color-card-2); + margin-top: 5px; + padding: 10px 15px; + border-radius: 7px; + cursor: pointer; + display: flex; +} +.quick-login > div.list > div > span { + flex: 1; + text-align: left; + color: var(--color-font-1); +} +.quick-login > div.list > div > div { + width: 1rem; + height: 1rem; + background: var(--color-card-1); + border-radius: 100%; + margin-top: 0.2rem; +} +.quick-login > div.list > div > div > div { + background: var(--color-card-1); + width: calc(100% - 0.4rem); + height: calc(100% - 0.4rem); + border: 0.2rem solid var(--color-card-1); + border-radius: 100%; +} +.quick-login > div.list > div.select > div > div { + background: var(--color-main); +} + .login-pan-card { background: var(--color-card); padding: 40px 30px; @@ -337,7 +397,7 @@ textarea:focus { border-radius: 7px 7px 0 0; align-items: center; font-size: 1rem; - padding: 10px 10px 0 10px; + padding: 10px; display: flex; color: var(--color-font); } @@ -354,7 +414,6 @@ textarea:focus { background: var(--color-main); color: var(--color-font-r); align-items: center; - margin-right: 10px; border-radius: 7px; text-wrap: nowrap; padding: 0 20px; @@ -954,8 +1013,7 @@ textarea:focus { } .hiden-home { - margin-top: calc(-100% + 15px) !important; - transform: translateY(-100%) !important; + display: none !important; } .qq-err-card { @@ -1083,11 +1141,6 @@ textarea:focus { min-width: 100% !important; z-index: 20; } - .hiden-home { - margin-top: calc(100% + 5px) !important; - transform: translateY(0) !important; - margin-left: -70px; - } .main-body > ul > li { margin-top: 0; margin-bottom: 0 !important; @@ -1144,6 +1197,10 @@ textarea:focus { .friend-list.open > div:first-child > div.small > label { display: flex !important; } + + .friend-list.open > div:first-child > div.small > div:last-child { + margin-left: 10px; + } .friend-list > div:first-child > div.small > div > svg { color: var(--color-font-r); height: 17px; @@ -1224,6 +1281,7 @@ textarea:focus { @media (max-width: 500px) { /* 全局通用弹窗 */ .pop-box-body { + min-width: unset; width: calc(100% - 80px); transform: unset !important; margin: 20px; @@ -1250,9 +1308,6 @@ textarea:focus { padding: 10px !important; margin: 10px !important; } - .friend-list > div:first-child > div.small > div { - display: none; - } .friend-list > div:first-child > div.small > span { display: flex !important; margin-right: 0; @@ -1261,6 +1316,9 @@ textarea:focus { .friend-list > div:first-child > div.small > label { display: flex !important; } + .friend-list > div:first-child > div.small > div:last-child { + margin-left: 10px; + } .friend-list-space { overflow: hidden; width: 0; diff --git a/src/renderer/src/assets/l10n/en-US.po b/src/renderer/src/assets/l10n/en-US.po index 208e19aa..a158b87b 100644 --- a/src/renderer/src/assets/l10n/en-US.po +++ b/src/renderer/src/assets/l10n/en-US.po @@ -309,10 +309,6 @@ msgstr "" msgid "兼容选项" msgstr "Compatibility Options" -#: src/pages/options/OptDev.vue:35 -msgid "发送心跳包" -msgstr "Send keepalive packets" - #: src/pages/options/OptDev.vue:36 msgid "没救了,拖出去吧" msgstr "Sometimes a CPR would help :)" @@ -406,7 +402,7 @@ msgid "我们使用 Umami 对应用的使用情况进行分析,它将不会上 msgstr "We utilize Umami to analyze the usage of the app. All the data are solely for usage analyses only and don't include identifiable infomation (unless you explicitly enable it). You can opt in or out of it from here." #: src/pages/options/OptFunction.vue:126 -msgid "访问统计信息" +msgid "访问统计信息" msgstr "" #: src/pages/options/OptFunction.vue:112 @@ -1373,4 +1369,4 @@ msgid "截图" msgstr "" msgid "“{body}” 以及 {num} 条消息" -msgstr "" \ No newline at end of file +msgstr "" diff --git a/src/renderer/src/assets/l10n/zh-CN.po b/src/renderer/src/assets/l10n/zh-CN.po index ab64d32d..4914f75a 100644 --- a/src/renderer/src/assets/l10n/zh-CN.po +++ b/src/renderer/src/assets/l10n/zh-CN.po @@ -310,10 +310,6 @@ msgstr "" msgid "兼容选项" msgstr "" -#: src/pages/options/OptDev.vue:35 -msgid "发送心跳包" -msgstr "" - #: src/pages/options/OptDev.vue:36 msgid "没救了,拖出去吧" msgstr "" @@ -407,7 +403,7 @@ msgid "我们使用 Umami 对应用的使用情况进行分析,它将不会上 msgstr "" #: src/pages/options/OptFunction.vue:126 -msgid "访问统计信息" +msgid "访问统计信息" msgstr "" #: src/pages/options/OptFunction.vue:112 @@ -1374,4 +1370,4 @@ msgid "截图" msgstr "" msgid "“{body}” 以及 {num} 条消息" -msgstr "" \ No newline at end of file +msgstr "" diff --git a/src/renderer/src/assets/l10n/zh-TW.po b/src/renderer/src/assets/l10n/zh-TW.po index 2eb5f465..1b00319c 100644 --- a/src/renderer/src/assets/l10n/zh-TW.po +++ b/src/renderer/src/assets/l10n/zh-TW.po @@ -310,10 +310,6 @@ msgstr "" msgid "兼容选项" msgstr "相容性設定" -#: src/pages/options/OptDev.vue:35 -msgid "发送心跳包" -msgstr "傳送心跳封包" - #: src/pages/options/OptDev.vue:36 msgid "没救了,拖出去吧" msgstr "「這個嘛,我想是這樣子啦:他真的沒救了。」" @@ -407,7 +403,7 @@ msgid "我们使用 Umami 对应用的使用情况进行分析,它将不会上 msgstr "我們使用 Umami 對應用程式的使用情形進行分析。所有分析資訊均不會包含精確到使用者的資料,並僅限用於使用情形的分析。你可以在這裡控制分析功能及額外分析項目的啟用狀況。" #: src/pages/options/OptFunction.vue:126 -msgid "访问统计信息" +msgid "访问统计信息" msgstr "" #: src/pages/options/OptFunction.vue:112 @@ -1374,4 +1370,4 @@ msgid "截图" msgstr "" msgid "“{body}” 以及 {num} 条消息" -msgstr "" \ No newline at end of file +msgstr "" diff --git a/src/renderer/src/assets/l10n/zh-YUE.po b/src/renderer/src/assets/l10n/zh-YUE.po index b8520553..24212e06 100644 --- a/src/renderer/src/assets/l10n/zh-YUE.po +++ b/src/renderer/src/assets/l10n/zh-YUE.po @@ -310,10 +310,6 @@ msgstr "" msgid "兼容选项" msgstr "相容性選項" -#: src/pages/options/OptDev.vue:35 -msgid "发送心跳包" -msgstr "Send 心跳" - #: src/pages/options/OptDev.vue:36 msgid "没救了,拖出去吧" msgstr "Call 999 save your life" @@ -407,7 +403,7 @@ msgid "我们使用 Umami 对应用的使用情况进行分析,它将不会上 msgstr "我哋使用 Umami 對 App 嘅使用情況進行分析,所有分析資訊唔會精確到使用者,而且僅用於進行使用情況分析。你可以喺呢度控制分析功能的開關和額外分析項。" #: src/pages/options/OptFunction.vue:126 -msgid "访问统计信息" +msgid "访问统计信息" msgstr "" #: src/pages/options/OptFunction.vue:112 @@ -1374,4 +1370,4 @@ msgid "截图" msgstr "" msgid "“{body}” 以及 {num} 条消息" -msgstr "" \ No newline at end of file +msgstr "" diff --git a/src/renderer/src/components/AboutPan.vue b/src/renderer/src/components/AboutPan.vue index c7ec851d..8b61bdab 100644 --- a/src/renderer/src/components/AboutPan.vue +++ b/src/renderer/src/components/AboutPan.vue @@ -7,121 +7,121 @@