Xcode编译的App仅能在编译Mac启动,签名异常求助
问题描述
已定位到签名异常问题。移除CocoaPods后,将MSAL作为常规包依赖重新构建Xcode项目。该项目在编译设备上运行正常,但将.app文件拷贝至其他Mac设备无法启动,仅Intel Mac生成如下崩溃日志:
{ "app_name":"ui_test", "timestamp":"2023-10-03 16:46:47.00 +0200", "app_version":"1.0", "slice_uuid":"62be6a29-6e5b-37a4-b396-1dbdf81d3f43", "build_version":"1", "platform":0, "bundleID":"tardik.newtodomsal", "share_with_app_devs":0, "is_first_party":0, "bug_type":"309", "os_version":"macOS 13.6 (22G120)", "roots_installed":0, "name":"ui_test", "incident_id":"94B57AAB-CF8D-4A6A-8545-4D622547DA91" } { "uptime":7700, "procRole":"Default", "version":2, "userID":501, "deployVersion":210, "modelCode":"MacPro7,1", "coalitionID":1952, "osVersion":{ "train":"macOS 13.6", "build":"22G120", "releaseType":"User" }, "captureTime":"2023-10-03 16:46:47.8577 +0200", "incident":"94B57AAB-CF8D-4A6A-8545-4D622547DA91", "pid":3353, "cpuType":"X86-64", "roots_installed":0, "bug_type":"309", "procLaunch":"2023-10-03 16:46:47.8008 +0200", "procStartAbsTime":7793359661050, "procExitAbsTime":7793416434750, "procName":"ui_test", "procPath":"\/Volumes\/VOLUME\/ui_test.app\/Contents\/MacOS\/ui_test", "bundleInfo":{"CFBundleShortVersionString":"1.0","CFBundleVersion":"1","CFBundleIdentifier":"tardik.newtodomsal"}, "storeInfo":{"deviceIdentifierForVendor":"BF901324-EBC4-57EB-80A2-EA437BC60DE6","thirdParty":true}, "parentProc":"launchd", "parentPid":1, "coalitionName":"tardik.newtodomsal", "crashReporterKey":"FE05737C-5218-4DB2-B9C6-BE508F19E65F", "codeSigningID":"", "codeSigningTeamID":"", "codeSigningFlags":16777216, "codeSigningValidationCategory":0, "codeSigningTrustLevel":0, "wakeTime":6126, "sleepWakeUUID":"AF336868-DAC2-4830-A714-F1D0473DEE13", "sip":"enabled", "exception":{"codes":"0x0000000000000000, 0x0000000000000000","rawCodes":[0,0],"type":"EXC_CRASH","signal":"SIGKILL (签名无效)"}, "termination":{"flags":66,"code":1,"namespace":"CODESIGNING","indicator":"Taskgated 签名无效"}, "extMods":{"caller":{"thread_create":0,"thread_set_state":0,"task_for_pid":0},"system":{"thread_create":0,"thread_set_state":439,"task_for_pid":9},"targeted":{"thread_create":0,"thread_set_state":0,"task_for_pid":0},"warnings":0}, "faultingThread":0, "threads":[{ "triggered":true, "id":104306, "threadState":{ "r13":{"value":0}, "rax":{"value":0}, "rflags":{"value":512}, "cpu":{"value":0}, "r14":{"value":0}, "rsi":{"value":0}, "r8":{"value":0}, "cr2":{"value":0}, "rdx":{"value":0}, "r10":{"value":0}, "r9":{"value":0}, "r15":{"value":0}, "rbx":{"value":0}, "trap":{"value":0}, "err":{"value":0}, "r11":{"value":0}, "rip":{"value":4382367856,"matchesCrashFrame":1}, "rbp":{"value":0}, "rsp":{"value":140702045277168}, "r12":{"value":0}, "rcx":{"value":0}, "flavor":"x86_THREAD_STATE", "rdi":{"value":0} }, "frames":[{ "imageOffset":20592, "symbol":"_dyld_start", "symbolLocation":0, "imageIndex":0 },{ "imageOffset":1, "imageIndex":2 }] }], "usedImages":[ { "size":638976, "arch":"x86_64", "source":"P", "base":4382347264, "uuid":"3df96f32-b9c9-3566-a6b7-4daebc6d6563" }, { "source":"P", "arch":"x86_64", "base":4303515648, "size":180224, "uuid":"62be6a29-6e5b-37a4-b396-1dbdf81d3f43", "name":"" }, { "size":0, "source":"A", "base":0, "uuid":"00000000-0000-0000-0000-000000000000" } ], "vmSummary":"只读库区域: 总计=1180K 驻留=0K(0%) 已换出或未分配=1180K(100%)\n可写区域: 总计=8192K 已写入=0K(0%) 驻留=0K(0%) 已换出=0K(0%) 未分配=8192K(100%)\n\n 虚拟区域 \n区域类型 大小 数量(未合并) \n=========== ======= ======= \nSTACK GUARD 56.0M 1 \nStack 8192K 1 \nVM_ALLOCATE 4K 1 \n__DATA 48K 2 \n__DATA_CONST 48K 2 \n__DATA_DIRTY 16K 1 \n__LINKEDIT 384K 3 \n__TEXT 800K 2 \n共享内存 4K 1 \n=========== ======= ======= \n总计 65.3M 14 \n", "legacyInfo":{ "threadTriggered":{ } }, "logWritingSignature":"c8aecb4bac96e31f0d308bbfed9c73b1b8f822c9", "trialInfo":{ "rollouts":[ { "rolloutId":"60186475825c62000ccf5450", "factorPackIds":{ }, "deploymentId":240000062 }, { "rolloutId":"6391cacc75b0720ff1f8c695", "factorPackIds":{ "COREOS_ICD":"63957f508061fa721c8edc4a" }, "deploymentId":240000007 } ], "experiments":[ { "treatmentId":"6dd670af-0633-45e4-ae5f-122ae4df02be", "experimentId":"64406ba83deb637ac8a04419", "deploymentId":900000017 } ] }, "reportNotes":[ "dyld_process_snapshot_get_shared_cache 失败" ] }
问题分析
从崩溃日志可明确核心问题:
exception.signal显示SIGKILL (签名无效),termination.indicator标注Taskgated 签名无效,直接指向签名验证失败codeSigningID和codeSigningTeamID为空,说明应用未被正确签名或签名信息在拷贝过程中丢失- 编译设备能正常运行是因为Xcode调试模式下的临时签名仅对当前设备有效,无法通过其他设备的系统验证
解决方案
1. 配置有效签名身份
- 打开Xcode项目的"Signing & Capabilities"页面,选择你的开发团队,开启"Automatically manage signing",让Xcode自动处理签名流程;若手动管理签名,需确保所选证书在目标设备上受信任。
- 构建时选择
Archive而非直接运行,归档后的包签名更完整,适合跨设备分发。
2. 确保MSAL框架签名正确
- 进入项目"Build Phases"的"Embed Frameworks"阶段,确认MSAL框架已添加,且勾选
Code Sign On Copy,让Xcode在嵌入框架时自动重新签名。 - 使用官方发布的MSAL框架版本,避免使用未签名的自定义构建包。
3. 验证签名完整性
- 在编译设备上用终端命令验证签名:
有效签名会输出codesign --verify --verbose=4 /path/to/your/ui_test.appvalid on disk和satisfies its Designated Requirement。 - 拷贝到目标Intel Mac后,再次运行上述命令,确认签名未损坏。
4. 适配Intel Mac架构
- 在项目"Build Settings"中,设置
Architectures为Standard Architectures (arm64, x86_64),生成兼容Intel和Apple Silicon的通用二进制包。 - 检查
Valid Architectures是否包含x86_64,避免架构不兼容触发签名验证失败。
5. 使用合规分发方式
- 不要直接拷贝.app文件,通过Xcode的
Product > Archive归档项目,再选择"Distribute App",根据需求选择Developer ID(对外分发)或Ad Hoc(内部测试)签名导出安装包,确保包签名完整可跨设备运行。
内容的提问来源于stack exchange,提问作者Tardik
相关产品推荐
相关产品推荐

