iOS 11.3 Beta设备自定义UIApplication子类崩溃求助
解决iOS 11.3 Beta设备上自定义UIApplication子类的崩溃问题
你遇到的是iOS 11.3 Beta在真机端对自定义UIApplication子类新增的未公开调用要求。崩溃日志里的+[CustomClass registerAsSystemApp]: unrecognized selector sent to class已经给出了明确线索:UIKit在启动流程中尝试调用这个类方法,但你的CustomClass并没有实现它,而且这个行为只出现在真机设备上(模拟器的UIKit逻辑和真机存在差异)。
下面是具体的解决步骤,按优先级尝试:
1. 添加registerAsSystemApp类方法的空实现
系统在iOS 11.3 Beta的真机启动流程中,会对自定义UIApplication子类调用这个未公开的类方法。你只需要在CustomClass中添加它的声明和空实现即可:
在CustomClass.h中添加声明:
@interface CustomClass : UIApplication { TCBIdleService *_idleService; LocationManager *_locationManager; TCBUserSession *_userSession; } // 新增方法声明 + (void)registerAsSystemApp; + (CustomClass *)sharedApp; + (NSString *)pushNotificationTokenKey; - (void)loginWithUserInfo:(UserInfoMto *)userInfo; - (void)logout; - (void)registerPushNotifications; @end
在CustomClass.m中添加实现:
@implementation CustomClass // 新增空实现 + (void)registerAsSystemApp { // 不需要任何逻辑,空实现即可满足系统调用要求 } // 你的其他现有方法实现... @end
2. 确保CustomClass在启动前被正确加载
有时候真机上的类加载时机可能比模拟器晚,导致UIApplicationMain调用时类还没完全初始化。可以在main.m中提前触发类加载:
int main(int argc, char * argv[]) { @autoreleasepool { // 提前加载CustomClass,确保类方法已注册 [CustomClass class]; return UIApplicationMain(argc, argv, NSStringFromClass([CustomClass class]), NSStringFromClass([AppDelegate class])); } }
3. 检查编译配置是否正确
确认你的CustomClass.m已经被添加到项目的编译列表中:
- 打开Xcode,进入项目的
Build Phases选项卡 - 检查
Compile Sources列表中是否包含CustomClass.m - 如果没有,点击
+按钮添加它(模拟器可能因为缓存或者编译设置差异没有这个问题,但真机严格遵循编译列表)
补充说明
这个问题应该是iOS 11.3 Beta的一个未公开行为变更,模拟器因为调试环境的特殊性没有触发这个逻辑。添加空实现后,应该就能绕过这个崩溃。如果后续正式版iOS 11.3移除了这个要求,你可以再删除这个方法实现。
内容的提问来源于stack exchange,提问作者redisky
相关产品推荐
相关产品推荐

