iOS 10下向NSMutableArray添加UNNotificationAction实例时崩溃求助
看起来你在iOS 10上碰到了个有点费解的崩溃:Crashlytics显示崩溃发生在CFStringConvertNSStringEncodingToEncoding这个系统方法里,对应你代码的第100行——也就是把UNNotificationAction添加到数组的那一步。结合你的代码和iOS 10的特性,我整理了几个大概率的排查方向:
1. 先排查title参数的字符串问题
UNNotificationAction的title在iOS 10的底层实现里会涉及字符串编码转换操作,这很可能是崩溃的源头。如果你的@"title"不是硬编码的纯ASCII字符串(比如是本地化字符串、服务器返回的内容,或者包含特殊字符),要注意这几点:
- 字符串是否包含无效Unicode字符或者损坏的编码数据——这类内容会让
CFString在转换编码时直接崩溃 - 如果你用了本地化字符串,检查
Localizable.strings文件是否是UTF-8编码,有没有语法错误(比如遗漏分号、引号不配对)
你可以先临时把title换成纯硬编码的简单字符串(比如@"Test Action"),跑一遍看看是否还会崩溃,快速验证是不是字符串的锅。
2. 确认数组和action对象的有效性
虽然你用[NSMutableArray array]创建了数组,但如果这段代码在多线程环境下执行,或者存在意外的内存释放,也可能触发奇怪的崩溃。可以加个断言或者日志来验证:
NSMutableArray *myActions = [NSMutableArray array]; NSAssert(myActions != nil, @"myActions array should not be nil"); UNNotificationAction *action = [UNNotificationAction actionWithIdentifier:@"actionId" title:@"title" options:UNNotificationActionOptionNone]; NSAssert(action != nil, @"Failed to create UNNotificationAction"); [myActions addObject:action];
3. 注意iOS 10 UserNotifications的隐藏限制
iOS 10是UserNotifications框架的第一个版本,有一些官方文档没明确提到的边缘限制:
identifier参数最好不要包含空格、emoji这类特殊字符——不少开发者反馈这类字符会触发底层编码异常- 确保你已经正确导入
UserNotifications框架,并且在使用通知相关API前已经请求了通知权限(虽然权限问题通常不会引发这类编码崩溃,但也不能完全排除)
4. 用Zombie Objects排查内存问题
如果action对象被意外释放(比如ARC环境下的循环引用或者内存管理漏洞),也可能导致添加到数组时触发野指针错误,进而表现为CFString的崩溃栈。你可以打开Xcode的Zombie Objects调试功能,追踪对象的生命周期,看看是不是内存问题导致的。
建议先从字符串内容和编码的方向入手排查,这是这类CFString编码崩溃最常见的原因。
内容的提问来源于stack exchange,提问作者UPT

