fix ios transfer song bug

This commit is contained in:
2026-10-03 15:20:50 +08:00
parent e3ce4aa9fd
commit 34842e2577
24 changed files with 415 additions and 102 deletions
+1 -1
View File
@@ -289,7 +289,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "if [ \"YES\" = \"$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \\\"YES\\\"\"\n exit 0\nfi\nset -euo pipefail\nif [ \"YES\" = \"${OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED:-}\" ]; then\n echo \"Skipping Gradle build (OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED=YES)\"\n exit 0\nfi\ncd \"$SRCROOT/..\"\n./gradlew :composeApp:embedAndSignAppleFrameworkForXcode";
shellScript = "set -euo pipefail\ncd \"$SRCROOT/..\"\nif [ \"YES\" = \"${OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED:-}\" ]; then\n echo \"Kotlin framework was built by the IDE; syncing Compose resources only\"\n ./gradlew -Pcompose.ios.resources.archs=arm64 :composeApp:syncComposeResourcesForIos --rerun\n exit 0\nfi\n./gradlew :composeApp:embedAndSignAppleFrameworkForXcode";
};
C516F4DE7FC107135868F830 /* Verify Widget Extension Embedded */ = {
isa = PBXShellScriptBuildPhase;
+7
View File
@@ -94,6 +94,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
guard let message = notification.userInfo?["message"] as? String else { return }
HostBridge.shared.showToast(message)
}
NotificationCenter.default.addObserver(
forName: Notification.Name("llmpRequestLocalNetworkPermission"),
object: nil,
queue: .main
) { _ in
HostBridge.shared.requestLocalNetworkPermission()
}
NotificationCenter.default.addObserver(
forName: Notification.Name("llmpPrepareAudioSession"),
object: nil,
+39
View File
@@ -1,9 +1,48 @@
import Network
import UIKit
/// Bridges Swift host events to Kotlin (via UserDefaults + notifications).
/// Full bidirectional callback requires exporting Kotlin handlers through the ComposeApp framework.
final class HostBridge {
static let shared = HostBridge()
private var localNetworkBrowser: NWBrowser?
private var localNetworkTimeout: DispatchWorkItem?
/// iOS 没有显式的本地网络权限 API;开始 Bonjour 浏览会在首次进入传输页时触发系统授权。
func requestLocalNetworkPermission() {
guard localNetworkBrowser == nil else { return }
let parameters = NWParameters()
parameters.includePeerToPeer = true
let browser = NWBrowser(
for: .bonjour(type: "_llmp._tcp", domain: nil),
using: parameters
)
localNetworkBrowser = browser
browser.stateUpdateHandler = { [weak self] state in
switch state {
case .ready, .failed:
self?.stopLocalNetworkPermissionRequest()
default:
break
}
}
browser.start(queue: .main)
let timeout = DispatchWorkItem { [weak self] in
self?.stopLocalNetworkPermissionRequest()
}
localNetworkTimeout = timeout
DispatchQueue.main.asyncAfter(deadline: .now() + 30, execute: timeout)
}
private func stopLocalNetworkPermissionRequest() {
localNetworkTimeout?.cancel()
localNetworkTimeout = nil
localNetworkBrowser?.stateUpdateHandler = nil
localNetworkBrowser?.cancel()
localNetworkBrowser = nil
}
func handleDeepLink(_ url: String) {
UserDefaults(suiteName: widgetGroupId)?.set(url, forKey: "pendingDeepLink")
+7 -4
View File
@@ -89,18 +89,15 @@
<string>mqqapi</string>
<string>timapi</string>
<string>mqqopensdkminiapp</string>
<string>mqqopensdkapi</string>
<string>mqqopensdkapiV2</string>
<string>mqqopensdkapiV3</string>
<string>mqqopensdkapiV4</string>
<string>mqqOpensdkSSoLogin</string>
<string>mqzoneopensdk</string>
<string>mqzoneopensdkapi</string>
<string>mqzoneopensdkapi19</string>
<string>mqzoneopensdkapiV2</string>
<string>mqqwpa</string>
<string>mqzone</string>
<string>wtloginmqq2</string>
</array>
<key>LSRequiresIPhoneOS</key>
<true/>
@@ -119,6 +116,12 @@
</dict>
<key>NSCameraUsageDescription</key>
<string>需要获取摄像头权限扫描二维码</string>
<key>NSBonjourServices</key>
<array>
<string>_llmp._tcp</string>
</array>
<key>NSLocalNetworkUsageDescription</key>
<string>需要访问本地网络以连接电脑传输歌曲和同步数据</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>需要读取相册获取图片</string>
<key>UIApplicationSceneManifest</key>
@@ -175,6 +178,6 @@
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>
<false/>
</dict>
</plist>
+1
View File
@@ -1,2 +1,3 @@
NSCameraUsageDescription = "Kamerazugriff ist zum Scannen von QR-Codes erforderlich";
NSPhotoLibraryUsageDescription = "Fotobibliothek-Zugriff ist zum Auswählen von Bildern erforderlich";
NSLocalNetworkUsageDescription = "Der Zugriff auf das lokale Netzwerk ist erforderlich, um für Musikübertragungen und die Datensynchronisierung eine Verbindung zu einem Computer herzustellen";
+1
View File
@@ -1,2 +1,3 @@
NSCameraUsageDescription = "Camera access is required to scan QR codes";
NSPhotoLibraryUsageDescription = "Photo library access is required to choose images";
NSLocalNetworkUsageDescription = "Local network access is required to connect to a computer for music transfer and data sync";
+1
View File
@@ -1,2 +1,3 @@
NSCameraUsageDescription = "QRコードをスキャンするためにカメラへのアクセスが必要です";
NSPhotoLibraryUsageDescription = "画像を取得するために写真へのアクセスが必要です";
NSLocalNetworkUsageDescription = "パソコンに接続して楽曲の転送とデータ同期を行うために、ローカルネットワークへのアクセスが必要です";
@@ -1,2 +1,3 @@
NSCameraUsageDescription = "需要获取摄像头权限扫描二维码";
NSPhotoLibraryUsageDescription = "需要读取相册获取图片";
NSLocalNetworkUsageDescription = "需要访问本地网络以连接电脑传输歌曲和同步数据";
+6 -2
View File
@@ -91,6 +91,9 @@ targets:
- UIInterfaceOrientationLandscapeRight
NSCameraUsageDescription: 需要获取摄像头权限扫描二维码
NSPhotoLibraryUsageDescription: 需要读取相册获取图片
NSLocalNetworkUsageDescription: 需要访问本地网络以连接电脑传输歌曲和同步数据
NSBonjourServices:
- _llmp._tcp
NSAppTransportSecurity:
NSAllowsArbitraryLoads: true
NSAllowsArbitraryLoads: true
@@ -206,11 +209,12 @@ targets:
basedOnDependencyAnalysis: false
script: |
set -euo pipefail
cd "$SRCROOT/.."
if [ "YES" = "${OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED:-}" ]; then
echo "Skipping Gradle build (OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED=YES)"
echo "Kotlin framework was built by the IDE; syncing Compose resources only"
./gradlew -Pcompose.ios.resources.archs=arm64 :composeApp:syncComposeResourcesForIos --rerun
exit 0
fi
cd "$SRCROOT/.."
./gradlew :composeApp:embedAndSignAppleFrameworkForXcode
WidgetExtension: