分享CAF格式音频文件时Xcode报错求助
我在分享沙盒DocumentDirectory中的CAF格式音频文件时,iPhone上能正常打开分享面板并保存到“文件”应用,但Xcode会抛出一系列错误。请问是否需要在info.plist中添加隐私权限字符串?
执行windowScene.windows.first?.rootViewController?.present(activityViewController, animated: true, completion: nil)时出现以下错误:
Failed to request default share mode for fileURL:file:///var/mobile/Containers/Data/Application/E13E4199-A782-4A29-8F13-A3568CCDD7B1/Documents/speakhby_exported_audio_20240623_174455.caf error:Error Domain=NSOSStatusErrorDomain Code=-10814 "(null)" UserInfo={_LSLine=1741, _LSFunction=runEvaluator}
Only support loading options for CKShare and SWY types.
error fetching item for URL:file:///var/mobile/Containers/Data/Application/C2BEA3CC-01DA-46E2-919A-42A7000C121F/Documents/speakhby_exported_audio_20240623_172629.caf : Error Domain=NSCocoaErrorDomain Code=256 "The file couldn’t be opened."
Error acquiring assertion: <Error Domain=RBSServiceErrorDomain Code=1 "(originator doesn't have entitlement com.apple.runningboard.primitiveattribute AND originator doesn't have entitlement com.apple.runningboard.assertions.frontboard AND target is not running or doesn't have entitlement com.apple.runningboard.trustedtarget AND Target not hosted by originator)" UserInfo={NSLocalizedFailureReason=(originator doesn't have entitlement com.apple.runningboard.primitiveattribute AND originator doesn't have entitlement com.apple.runningboard.assertions.frontboard AND target is not running or doesn't have entitlement com.apple.runningboard.trustedtarget AND Target not hosted by originator)}>
(501) personaAttributesForPersonaType for type:0 failed with error Error Domain=NSCocoaErrorDomain Code=4099 "The connection to service named com.apple.mobile.usermanagerd.xpc was invalidated: failed at lookup with error 159 - Sandbox restriction." UserInfo={NSDebugDescription=The connection to service named com.apple.mobile.usermanagerd.xpc was invalidated: failed at lookup with error 159 - Sandbox restriction.}
相关代码如下:
func shareFile(_ fileName: String) { guard let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent(fileName) else { print("File not found!") return } if FileManager.default.fileExists(atPath: fileURL.path) { let activityViewController = UIActivityViewController(activityItems: [fileURL], applicationActivities: nil) // Find the current window scene if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene { // On iPad, you need to specify a source view when presenting the activity view controller activityViewController.popoverPresentationController?.sourceView = windowScene.windows.first?.rootViewController?.view // Present the view controller // Pop errors when executing this line windowScene.windows.first?.rootViewController?.present(activityViewController, animated: true, completion: nil) } else { print("No window scene found") } } else { print("File not found!") } }
解答
不需要额外添加隐私权限字符串。这些报错属于系统内部调试日志,不影响实际功能运行:
NSOSStatusErrorDomain Code=-10814:是系统处理分享选项时的内部警告,CAF格式并非CKShare或SWY类型,系统会自动切换到通用分享逻辑,不影响功能。NSCocoaErrorDomain Code=256:部分分享扩展尝试读取文件时的权限问题,但核心分享到“文件”应用的逻辑不受影响,因为UIActivityViewController已正确处理沙盒文件的临时访问权限。- RBSServiceErrorDomain和usermanagerd相关错误:属于系统服务的沙盒限制日志,是Xcode调试时的正常输出,与应用代码无关,发布版本不会出现这类日志。
可以优化代码的小建议:
- 给UIActivityViewController设置
excludedActivityTypes,过滤掉不支持CAF格式的分享选项,减少系统内部错误触发。 - 完善iPad上popover的布局设置,避免潜在警告:
if let sourceView = windowScene.windows.first?.rootViewController?.view { activityViewController.popoverPresentationController?.sourceView = sourceView activityViewController.popoverPresentationController?.sourceRect = CGRect(x: sourceView.bounds.midX, y: sourceView.bounds.midY, width: 0, height: 0) }
内容的提问来源于stack exchange,提问作者Zhou Haibo

