为child pane创建有效Settings Bundle plist时遇配置无效崩溃问题
问题背景
- 开发首款iOS应用,使用IASK框架实现带child pane的Settings Bundle功能
- 异常表现:
- 系统「设置」应用中对应设置项完全无法加载
- 应用内打开IASK child pane时直接崩溃
崩溃日志如下:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'invalid settings plist' terminating with uncaught exception of type NSException CoreSimulator 802.6.1 - Device: iPhone 12 (62C8FF00-D6FE-4526-8351-7F5B0AEEC9BA) - Runtime: iOS 15.5 (19F70) - DeviceType: iPhone 12
当前使用的child pane plist配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>StringsTable</key> <string>childPaneStrings</string> <key>PreferenceSpecifiers</key> <array> <dict> <key>Type</key> <string>PSTextFieldSpecifier</string> <key>Title</key> <string>Name</string> <key>Key</key> <string>name_preference</string> <key>AutocorrectionType</key> <string>No</string> </dict> </array> </dict> </plist>
问题原因
你的plist中PSTextFieldSpecifier类型的配置项缺失必填字段DefaultValue。
不管是苹果官方Settings Bundle规范,还是IASK的plist解析逻辑,都要求文本输入类设置项必须声明默认值,缺省该字段时会直接判定plist结构非法,触发加载失败或崩溃。
额外需要确认的点:
- 该child pane的plist文件已勾选正确的Target Membership,且存放路径和主Settings Bundle plist保持一致
- 主设置plist中指向该子面板的
PSChildPaneSpecifier配置项,File字段值必须和子面板plist的文件名完全匹配(不要带.plist后缀)
修复方案
在PSTextFieldSpecifier配置中补充DefaultValue字段即可,根据你的需求设置默认值,初始场景填空字符串也能满足校验要求,修复后的配置参考:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>StringsTable</key> <string>childPaneStrings</string> <key>PreferenceSpecifiers</key> <array> <dict> <key>Type</key> <string>PSTextFieldSpecifier</string> <key>Title</key> <string>Name</string> <key>Key</key> <string>name_preference</string> <key>DefaultValue</key> <string></string> <key>AutocorrectionType</key> <string>No</string> </dict> </array> </dict> </plist>
替换文件后清理工程缓存,删除模拟器/真机上的旧安装包重新编译运行即可。
内容的提问来源于stack exchange,提问作者e24
相关产品推荐
相关产品推荐

