三層疊加根因: 1. 主根因:.app 缺 NSCameraUsageDescription → macOS TCC 靜默拒絕、不彈授權 視窗、綠燈不亮、ffmpeg avfoundation 抓不到 camera。 2. ffmpeg cmd.Start() 只要 fork 成功就回 nil → HTTP 200 假成功(攝影機沒真開)。 3. cmd.Stderr=nil 吞掉 ffmpeg 錯誤 + pipeline 靜默重試 → 極難查。 修法: - Info.plist + Info.dev.plist 加 NSCameraUsageDescription(wails build template, ad-hoc 簽名下只需 usage description,刻意不加 hardened runtime/entitlement 避免 TCC 直接拒絕) - ffmpeg WaitForFirstFrame:收到首張完整 JPEG frame 才回成功;早退/逾時回明確 錯誤 → camera/start 真的回非 200、前端看到真實失敗。timeout 25s(涵蓋首次 TCC 授權彈窗的使用者反應時間;已授權情境仍秒開) - stderr 導到有界 ringBuffer + log;pipeline camera 模式連續失敗 50 次結束 reviewer 通過(0C/0M/2m)。只動 camera 鏈路(影片/圖片/批次/tunnel 上傳不受影響)。 build/vet/test/gosec 過、4 新 camera 測試。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
71 lines
2.4 KiB
Plaintext
71 lines
2.4 KiB
Plaintext
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
<plist version="1.0">
|
|
<dict>
|
|
<key>CFBundlePackageType</key>
|
|
<string>APPL</string>
|
|
<key>CFBundleName</key>
|
|
<string>{{.Info.ProductName}}</string>
|
|
<key>CFBundleExecutable</key>
|
|
<string>{{.OutputFilename}}</string>
|
|
<key>CFBundleIdentifier</key>
|
|
<string>com.wails.{{.Name}}</string>
|
|
<key>CFBundleVersion</key>
|
|
<string>{{.Info.ProductVersion}}</string>
|
|
<key>CFBundleGetInfoString</key>
|
|
<string>{{.Info.Comments}}</string>
|
|
<key>CFBundleShortVersionString</key>
|
|
<string>{{.Info.ProductVersion}}</string>
|
|
<key>CFBundleIconFile</key>
|
|
<string>iconfile</string>
|
|
<key>LSMinimumSystemVersion</key>
|
|
<string>10.13.0</string>
|
|
<key>NSHighResolutionCapable</key>
|
|
<string>true</string>
|
|
<key>NSHumanReadableCopyright</key>
|
|
<string>{{.Info.Copyright}}</string>
|
|
<key>NSCameraUsageDescription</key>
|
|
<string>visionA Agent 需要使用攝影機進行即時推論</string>
|
|
{{if .Info.FileAssociations}}
|
|
<key>CFBundleDocumentTypes</key>
|
|
<array>
|
|
{{range .Info.FileAssociations}}
|
|
<dict>
|
|
<key>CFBundleTypeExtensions</key>
|
|
<array>
|
|
<string>{{.Ext}}</string>
|
|
</array>
|
|
<key>CFBundleTypeName</key>
|
|
<string>{{.Name}}</string>
|
|
<key>CFBundleTypeRole</key>
|
|
<string>{{.Role}}</string>
|
|
<key>CFBundleTypeIconFile</key>
|
|
<string>{{.IconName}}</string>
|
|
</dict>
|
|
{{end}}
|
|
</array>
|
|
{{end}}
|
|
{{if .Info.Protocols}}
|
|
<key>CFBundleURLTypes</key>
|
|
<array>
|
|
{{range .Info.Protocols}}
|
|
<dict>
|
|
<key>CFBundleURLName</key>
|
|
<string>com.wails.{{.Scheme}}</string>
|
|
<key>CFBundleURLSchemes</key>
|
|
<array>
|
|
<string>{{.Scheme}}</string>
|
|
</array>
|
|
<key>CFBundleTypeRole</key>
|
|
<string>{{.Role}}</string>
|
|
</dict>
|
|
{{end}}
|
|
</array>
|
|
{{end}}
|
|
<key>NSAppTransportSecurity</key>
|
|
<dict>
|
|
<key>NSAllowsLocalNetworking</key>
|
|
<true/>
|
|
</dict>
|
|
</dict>
|
|
</plist>
|