Unity AssetBundles经AppStoreConnect分发触发SIGABRT崩溃求助
Unity iOS AssetBundle(按需资源ODR)加载崩溃问题
问题描述
我正在用Unity开发包含AssetBundle的游戏,准备通过App Store分发,但加载AssetBundle时应用直接崩溃,抛出SIGABRT错误。
已按照Unity官方文档配置ODR(按需资源),但加载时request.error返回空字符串(预期应为null);不过myLoadedAssetBundle.GetAllAssetNames()能正常返回完整资源列表。
AssetBundle已在XCode中正常显示(见下图),归档上传至App Store Connect后,On-Demand-Resources标记为“是”,但未显示资源数量,与文档描述不符。
环境信息
- Mac Studio M1 Ultra
- macOS 13.0.1 (22A400)
- Unity 2020.3.39f (Intel版本)
- Xcode 14.1 (14B47b)
- Visual Studio for Mac 17.4.1 (build 28)
- iPad 10代
- iPadOS 16.1.1 (20B101)
XCode资源截图

AssetBundle构建代码
public class CreateAssetBundles { static string iosAssetBundleDirectory = "AssetBundles/iOS"; [InitializeOnLoadMethod] static void SetupResourcesBuild() { UnityEditor.iOS.BuildPipeline.collectResources += CollectResources; } static UnityEditor.iOS.Resource[] CollectResources() { var bundles = AssetDatabase.GetAllAssetBundleNames (); var reslist = new List<UnityEditor.iOS.Resource> (); foreach (var b in bundles) { reslist.Add(new UnityEditor.iOS.Resource(b,Path.Combine(iosAssetBundleDirectory, b)).AddOnDemandResourceTags(b)); } return reslist.ToArray(); } [MenuItem ("Assets/Build AssetBundles/iOS")] static void BuildiOS () { EnableDisableAtlas (true); var options = BuildAssetBundleOptions.None; bool shouldCheckODR = EditorUserBuildSettings.activeBuildTarget == BuildTarget.iOS; #if UNITY_TVOS shouldCheckODR |= EditorUserBuildSettings.activeBuildTarget == BuildTarget.tvOS; #endif if (shouldCheckODR) { #if IOS_APP_BUNDLE if (PlayerSettings.iOS.useOnDemandResources) { options |= BuildAssetBundleOptions.UncompressedAssetBundle; } #endif #if ENABLE_IOS_APP_SLICING options |= BuildAssetBundleOptions.UncompressedAssetBundle; #endif if (!Directory.Exists(iosAssetBundleDirectory)) { Directory.CreateDirectory(iosAssetBundleDirectory); } } var ret = BuildPipeline.BuildAssetBundles (iosAssetBundleDirectory, options, BuildTarget.iOS); EnableDisableAtlas (false); } }
AssetBundle加载代码
public override IEnumerator DownloadAssetBundleAsync (string bundleName, StringParameter statusParameter, Image progressBar, float remainingPercentiles) { OnDemandResourcesRequest request = OnDemandResources.PreloadAsync(new string[] { bundleName }); while (!request.isDone) { yield return null; } if (request.error != null && request.error != "") { //错误处理 } DownloadFinished?.Invoke(bundleName); yield break; } public override IEnumerator LoadAssetBundleFromFileAsync (string bundleName, StringParameter statusParameter, Image progressBar, float remainingPercentiles, bool checkOutdated) { var filepath = "res://" + bundleName; var bundleLoadRequest = AssetBundle.LoadFromFileAsync(filepath); yield return bundleLoadRequest; while (!bundleLoadRequest.isDone) { yield return null; } var myLoadedAssetBundle = bundleLoadRequest.assetBundle; if (myLoadedAssetBundle == null) { //错误处理 } loadedAssetBundle = myLoadedAssetBundle; }
SIGABRT崩溃日志
Incident Identifier: [已移除] Beta Identifier: [已移除] Hardware Model: iPad13,18 Process: [已移除] [547] Path: /private/var/containers/Bundle/Application/[已移除] Identifier: [已移除] Version: 0.9.1 (21) AppStoreTools: 14C17 AppVariant: 1:iPad13,18:16 Beta: YES Code Type: ARM-64 (原生) Role: 前台 Parent Process: launchd [1] Coalition: [已移除] [694] 日期/时间: 2022-12-12 13:45:12.5058 +0100 启动时间: 2022-12-12 13:45:05.0791 +0100 系统版本: iPhone OS 16.1.1 (20B101) 发布类型: 用户版 报告版本: 104 异常类型: EXC_CRASH (SIGABRT) 异常代码: 0x0000000000000000, 0x0000000000000000 触发线程: 35 应用特定信息: abort() 被调用 最后异常调用栈: 0 CoreFoundation 0x1d1171e88 __exceptionPreprocess + 164 1 libobjc.A.dylib 0x1ca5178d8 objc_exception_throw + 60 2 Foundation 0x1cb6259b0 -[_NSInlineData length] + 0 3 UnityFramework 0x10fc45370 AssetCatalogFile::Read(unsigned long long, unsigned long long, void*, unsigned long long*, FileReadFlags) + 88806256 (AssetCatalogFileSystem.mm:52) 4 UnityFramework 0x10fc45264 AssetCatalogFileSystemHandler::Read(FileEntryData&, VFS::FileSize, unsigned long long, void*, unsigned long long*, FileReadFlags) + 88805988 (AssetCatalogFileSystem.mm:178) 5 UnityFramework 0x10f0c1074 FileAccessor::Read(VFS::FileSize, unsigned long long, void*, unsigned long long*, FileReadFlags) + 76730484 (VirtualFileSystem.cpp:1011) 6 UnityFramework 0x10f6ad6c4 ArchiveStorageReader::ReadFromStorage(unsigned long long, unsigned long long, void*, unsigned long long*) + 82941636 (ArchiveStorageReader.cpp:587) 7 UnityFramework 0x10f6a5f80 ArchiveStorageReader::Read(VFS::FileSize, unsigned long long, void*, unsigned long long*, FileReadFlags) + 82911104 (ArchiveStorageReader.cpp:173) 8 UnityFramework 0x10f6a5d60 ArchiveReadFile::Read(VFS::FileSize, unsigned long long, void*, unsigned long long*, FileReadFlags) + 82910560 (ArchiveReadFile.cpp:42) 9 UnityFramework 0x10f6a4240 ArchiveFileSystem::Read(FileEntryData&, VFS::FileSize, unsigned long long, void*, unsigned long long*, FileReadFlags) + 82903616 (ArchiveFileSystem.cpp:267) 10 UnityFramework 0x10f0c1074 FileAccessor::Read(VFS::FileSize, unsigned long long, void*, unsigned long long*, FileReadFlags) + 76730484 (VirtualFileSystem.cpp:1011) 11 UnityFramework 0x10f61714c File::Read(VFS::FileSize, void*, unsigned long, FileReadFlags) + 82325836 (FileVFS.cpp:443) 12 UnityFramework 0x10f2b1ecc AsyncReadManagerThreaded::PumpRequests(dynamic_array<AsyncReadCommand*, 0ul>&, dynamic_array<AsyncReadCommand*, 0ul>&) + 78765772 (AsyncReadManagerThreaded.cpp:169) 13 UnityFramework 0x10f2b191c AsyncReadManagerThreaded::ThreadEntry() + 78764316 (AsyncReadManagerThreaded.cpp:248) 14 UnityFramework 0x10f2b12d0 AsyncReadManagerThreaded::StaticThreadEntry(void*) + 78762704 (AsyncReadManagerThreaded.cpp:118) 15 UnityFramework 0x10f6c6994 Thread::RunThreadWrapper(void*) + 83044756 (Thread.cpp:81) 16 libsystem_pthread.dylib 0x21d84b6cc _pthread_start + 148 17 libsystem_pthread.dylib 0x21d84aba4 thread_start + 8
内容的提问来源于stack exchange,提问作者cagcoach
相关产品推荐
相关产品推荐

