diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 69537492..849acc9a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -311,6 +311,8 @@ jobs: name: Build on iOS (arm64) runs-on: macos-26 timeout-minutes: 120 + outputs: + version: ${{ steps.ios_version.outputs.version }} env: IOS_DEPLOYMENT_TARGET: "16.0" EXPECTED_IOS_SDK: "26.5" @@ -369,6 +371,26 @@ jobs: - name: Checkout code uses: actions/checkout@v5 + - name: Read independent iOS version + id: ios_version + shell: bash + run: | + IOS_VERSION_BASE="$(xcodebuild \ + -project apps/ios/CrossDeskMobile.xcodeproj \ + -scheme CrossDeskMobile \ + -configuration Release \ + -destination 'generic/platform=iOS' \ + -showBuildSettings CODE_SIGNING_ALLOWED=NO | \ + awk '$1 == "MARKETING_VERSION" && $2 == "=" { print $3 }')" + if [[ ! "${IOS_VERSION_BASE}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Invalid iOS marketing version: ${IOS_VERSION_BASE}" >&2 + exit 1 + fi + VERSION_NUM="v${IOS_VERSION_BASE}-${VERSION_NUM##*-}" + echo "IOS_VERSION_BASE=${IOS_VERSION_BASE}" >> "${GITHUB_ENV}" + echo "VERSION_NUM=${VERSION_NUM}" >> "${GITHUB_ENV}" + echo "version=${VERSION_NUM}" >> "${GITHUB_OUTPUT}" + - name: Initialize submodules run: git submodule update --init --recursive @@ -439,6 +461,11 @@ jobs: fi xcrun lipo "${EXECUTABLE_PATH}" -verify_arch arm64 + APP_VERSION=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' "${INFO_PLIST}") + if [[ "${APP_VERSION}" != "${IOS_VERSION_BASE}" ]]; then + echo "Unexpected iOS app version: expected ${IOS_VERSION_BASE}, got ${APP_VERSION}" >&2 + exit 1 + fi MINIMUM_OS=$(/usr/libexec/PlistBuddy -c 'Print :MinimumOSVersion' "${INFO_PLIST}") if [[ "${MINIMUM_OS}" != "${IOS_DEPLOYMENT_TARGET}" ]]; then echo "Unexpected minimum iOS version: expected ${IOS_DEPLOYMENT_TARGET}, got ${MINIMUM_OS}" >&2 @@ -749,6 +776,25 @@ jobs: echo "BUILD_DATE_ISO=${BUILD_DATE_ISO}" >> $GITHUB_OUTPUT echo "PATCH_NUMBER=${PATCH_NUMBER}" >> $GITHUB_OUTPUT + - name: Prepare release notes + env: + RELEASE_TAG: ${{ steps.version.outputs.VERSION_WITH_V }} + VERSION_BASE: ${{ steps.version.outputs.VERSION_BASE }} + run: | + if [[ -f "docs/releases/${RELEASE_TAG}.md" ]]; then + cp "docs/releases/${RELEASE_TAG}.md" release-notes.md + elif [[ -f "docs/releases/v${VERSION_BASE}.md" ]]; then + cp "docs/releases/v${VERSION_BASE}.md" release-notes.md + else + cat > release-notes.md << 'EOF' + Binary release only. Source code is not included. + + ## Code signing policy + + Free code signing provided by [SignPath.io](https://signpath.io/), certificate by [SignPath Foundation](https://signpath.org/). + EOF + fi + - name: Rename artifacts run: | mkdir -p release @@ -756,7 +802,7 @@ jobs: cp artifacts/crossdesk-macos-arm64-${{ steps.version.outputs.VERSION_WITH_V }}/* release/crossdesk-macos-arm64-${{ steps.version.outputs.VERSION_WITH_V }}.pkg cp artifacts/crossdesk-linux-amd64-${{ steps.version.outputs.VERSION_WITH_V }}/* release/crossdesk-linux-amd64-${{ steps.version.outputs.VERSION_WITH_V }}.deb cp artifacts/crossdesk-linux-arm64-${{ steps.version.outputs.VERSION_WITH_V }}/* release/crossdesk-linux-arm64-${{ steps.version.outputs.VERSION_WITH_V }}.deb - cp artifacts/crossdesk-ios-arm64-unsigned-${{ steps.version.outputs.VERSION_WITH_V }}/* release/crossdesk-ios-arm64-unsigned-${{ steps.version.outputs.VERSION_WITH_V }}.zip + cp artifacts/crossdesk-ios-arm64-unsigned-${{ needs.build-ios.outputs.version }}/* release/crossdesk-ios-arm64-unsigned-${{ needs.build-ios.outputs.version }}.zip cp artifacts/crossdesk-win-x64-${{ steps.version.outputs.VERSION_WITH_V }}/* release/crossdesk-win-x64-${{ steps.version.outputs.VERSION_WITH_V }}.exe cp artifacts/crossdesk-win-x64-portable-${{ steps.version.outputs.VERSION_WITH_V }}/* release/crossdesk-win-x64-portable-${{ steps.version.outputs.VERSION_WITH_V }}.zip @@ -767,17 +813,13 @@ jobs: uses: softprops/action-gh-release@v2 with: tag_name: ${{ steps.version.outputs.VERSION_WITH_V }} + target_commitish: ${{ github.sha }} name: Release ${{ steps.version.outputs.VERSION_WITH_V }} draft: false prerelease: false files: release/* generate_release_notes: false - body: | - Binary release only. Source code is not included. - - ## Code signing policy - - Free code signing provided by [SignPath.io](https://signpath.io/), certificate by [SignPath Foundation](https://signpath.org/). + body_path: release-notes.md - name: Create or update 'latest' tag run: | @@ -795,12 +837,7 @@ jobs: prerelease: false files: release/* generate_release_notes: false - body: | - Binary release only. Source code is not included. - - ## Code signing policy - - Free code signing provided by [SignPath.io](https://signpath.io/), certificate by [SignPath Foundation](https://signpath.org/). + body_path: release-notes.md - name: Upload artifacts to server uses: burnett01/rsync-deployments@5.2 @@ -851,6 +888,11 @@ jobs: } } EOF + jq --arg release_name "Release ${{ steps.version.outputs.VERSION_WITH_V }}" \ + --rawfile release_notes release-notes.md \ + '.releaseName = $release_name | .releaseNotes = $release_notes' \ + version.json > version-with-notes.json + mv version-with-notes.json version.json cat version.json - name: Upload version.json to server diff --git a/apps/ios/CrossDeskMobile.xcodeproj/project.pbxproj b/apps/ios/CrossDeskMobile.xcodeproj/project.pbxproj index 3c420450..d83431cc 100644 --- a/apps/ios/CrossDeskMobile.xcodeproj/project.pbxproj +++ b/apps/ios/CrossDeskMobile.xcodeproj/project.pbxproj @@ -265,7 +265,7 @@ ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = 8DNC3SZ86S; ENABLE_BITCODE = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -277,7 +277,7 @@ ); INFOPLIST_FILE = CrossDeskMobile/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 16.0; - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 0.0.1; OTHER_LDFLAGS = ( "$(inherited)", "$(PROJECT_DIR)/Vendor/iphoneos/$(CONFIGURATION)/libCrossDeskMiniRTC.a", @@ -314,7 +314,7 @@ ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = 8DNC3SZ86S; ENABLE_BITCODE = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -326,7 +326,7 @@ ); INFOPLIST_FILE = CrossDeskMobile/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 16.0; - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 0.0.1; OTHER_LDFLAGS = ( "$(inherited)", "$(PROJECT_DIR)/Vendor/iphoneos/$(CONFIGURATION)/libCrossDeskMiniRTC.a", diff --git a/apps/ios/CrossDeskMobile/Info.plist b/apps/ios/CrossDeskMobile/Info.plist index 3e76d4ba..65c5aac2 100644 --- a/apps/ios/CrossDeskMobile/Info.plist +++ b/apps/ios/CrossDeskMobile/Info.plist @@ -17,9 +17,9 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + $(MARKETING_VERSION) CFBundleVersion - 2 + $(CURRENT_PROJECT_VERSION) LSRequiresIPhoneOS NSLocalNetworkUsageDescription diff --git a/docs/releases/v1.5.0.md b/docs/releases/v1.5.0.md new file mode 100644 index 00000000..67a5b89c --- /dev/null +++ b/docs/releases/v1.5.0.md @@ -0,0 +1,12 @@ +# **更新内容** + +1. 新增原生iOS/iPadOS客户端v0.0.1,支持远程画面与音频、触控鼠标和键盘输入、多显示器切换、双向文件传输及接收远端文本剪贴板。 +2. 完善iOS远程操作体验,提供相对位置与绝对位置鼠标模式、捏合缩放及悬浮控制菜单,支持查看连接状态、P2P/中继模式、分辨率与码率;修复切回前台后画面无法恢复、相对鼠标跳动及灵动岛遮挡控件等问题。 +3. 新增帧率优先、画质优先和平衡三种画面偏好,优化带宽变化时的分辨率、帧率与码率调节,提升远程桌面的清晰度和流畅度。 +4. 优化Windows与macOS原生视频采集、硬件编码和渲染流程,减少画面拷贝;Linux新增CUDA/OpenGL视频渲染,提升硬件解码画面的显示效率。 +5. 优化P2P连接建立与UPnP支持,支持连接从中继升级为P2P,并改进ICE连接、视频恢复及音视频时间戳处理,提升弱网和网络变化时的连接稳定性。 +6. 修复Windows锁屏界面无法远程控制,以及部分设备因OpenGL初始化失败导致启动崩溃的问题,优化锁屏画面采集与恢复。 +7. 修复桌面端与iOS端设备在线状态更新不及时、桌面端启动后托盘图标未显示的问题,并将连接清理移出界面线程,减少断开连接时的卡顿。 +8. 完善iOS与桌面端跨平台构建和打包流程,更新界面截图、构建指南、自托管说明及常见问题文档。 + +PC客户端版本为v1.5.0,iOS/iPadOS客户端使用独立版本号,本次为v0.0.1。iOS/iPadOS客户端要求iOS 16.0及以上版本和arm64真机,提供的构建包为未签名应用,需要自行签名后安装;目前仅支持作为控制端连接电脑。