42e1c2e34b
Swift 侧(协议与 Android UploadPlugin.kt 逐字一致,编译/真机留 G3): - UploadBridge.swift:通道/方法/事件/失败码常量 + registerTask 参数解析 (镜像 UploadProtocol.kt) - UploadEventBus.swift:单调 seq + 终态 ack 缓存重放(镜像 UploadEventBus.kt),iOS 增强——未 ack 终态落盘(系统后台拉起投递的 回调在进程重启后同样重放,技术方案 §6.2 持久化原生回调) - UploadTaskStore.swift:taskId→URLSession taskIdentifier 映射 plist 持久化 (Application Support;对应 Android WorkManager 自持映射) - UploadPlugin.swift:URLSession background (com.photolive.photo_live.uploads)+ delegate 失败分类(2xx→completed+etag / 403→needsRenew / 4xx→HTTP_4XX / 网络→重试上限后 NETWORK,镜像 UploadPutExecutor/UploadWorker)、原生重试(5 次上限、10s 指数退避)、 进度 500ms 节流、queryTask/cancelTask/ackEvents、静默取消 - AppDelegate.swift:implicit engine 通道注册 + 启动重建会话 + handleEventsForBackgroundURLSession completionHandler 暂存 - Info.plist:UIBackgroundModes 有意不声明(background URLSession 无需; 计划措辞按技术方案 §6.2 修正,见 README-ios.md) - project.pbxproj 登记新 Swift 文件;README-ios.md(Xcode 步骤 + G3 验证 清单:实际文件上传/持久化回调窗口/服务端补偿/重启重联校准/强制退出/ 低电量延迟/100 张批量) Dart:NativeTransport 选择矩阵并入 iOS(Platform.isAndroid || isIOS, FORCE_DART_TRANSPORT 覆盖不变)——协议两侧一致,无新通道代码。 flutter analyze 0 issue;flutter test 219 全绿。 Co-Authored-By: Claude Code <noreply@anthropic.com>
39 lines
1.7 KiB
Swift
39 lines
1.7 KiB
Swift
import Flutter
|
||
import UIKit
|
||
|
||
@main
|
||
@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate {
|
||
override func application(
|
||
_ application: UIApplication,
|
||
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
||
) -> Bool {
|
||
// 后台会话启动即重建:App 被系统在后台拉起(Dart 引擎未起)时,
|
||
// delegate 回调即可入总线缓存(终态落盘,引擎 onListen 后重放)。
|
||
UploadPlugin.shared.ensureSession()
|
||
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
||
}
|
||
|
||
func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) {
|
||
GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry)
|
||
// 上传桥接(P3 Task 8):MethodChannel 命令 + EventChannel 事件流
|
||
// (通道/协议与 Android UploadPlugin 一致,Dart 侧同一 NativeTransport)。
|
||
UploadPlugin.register(with: engineBridge.applicationRegistrar.messenger())
|
||
}
|
||
|
||
/// 系统完成后台会话事件投递前的拉起回调:暂存 completionHandler,
|
||
/// 供 urlSessionDidFinishEvents 消费(否则 App 被系统挂起惩罚)。
|
||
override func application(
|
||
_ application: UIApplication,
|
||
handleEventsForBackgroundURLSession identifier: String,
|
||
completionHandler: @escaping () -> Void
|
||
) {
|
||
super.application(
|
||
application, handleEventsForBackgroundURLSession: identifier,
|
||
completionHandler: completionHandler)
|
||
if identifier == UploadBridge.sessionIdentifier {
|
||
UploadPlugin.shared.ensureSession()
|
||
UploadPlugin.shared.storeBackgroundCompletionHandler(completionHandler)
|
||
}
|
||
}
|
||
}
|