AppDelegate 中调用UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCente...

本文详细记录了修复iOS开发中UNUserNotificationCenter初始化时遇到的空指针异常问题,通过添加非空校验并替换系统方法,成功解决了崩溃问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2019年2月27日:

修复bug:

查找资料:

 

 

 

 

解决方式:添加分类,对系统方法替换,做非空校验

 

 #import "UNUserNotificationCenter+Hack.h"

#import <objc/runtime.h>

@implementation UNUserNotificationCenter (Hack)
+ (void)load {
static dispatch_once_t _onceToken;
dispatch_once(&_onceToken, ^{
[self safeHook];
});
}

+ (void)safeHook {

/*hook UNUserNotificationCenter's systemMethod - (id)initWithBundleProxy:(id)arg1;*/
NSString * orig_initWithBundleProxyName = @"initWithBundleProxy:";

SEL orig_initWithBundleSelector = NSSelectorFromString(orig_initWithBundleProxyName);

if (![self instancesRespondToSelector:orig_initWithBundleSelector]) {
return;
}

SEL alt_initWithBundleSelector = @selector(hk_initWithBundleProxy:);
Method origMethod = class_getInstanceMethod(self, orig_initWithBundleSelector);
Method altMethod = class_getInstanceMethod(self, @selector(hk_initWithBundleProxy:));

class_addMethod(self,
orig_initWithBundleSelector,
class_getMethodImplementation(self, orig_initWithBundleSelector),
method_getTypeEncoding(origMethod));
class_addMethod(self,
alt_initWithBundleSelector,
class_getMethodImplementation(self, alt_initWithBundleSelector),
method_getTypeEncoding(altMethod));

method_exchangeImplementations(origMethod, altMethod);
}

- (instancetype)hk_initWithBundleProxy:(id)arg1 {

if (nil==arg1||NSNull.null==arg1) return nil;
// return [self hk_initWithBundleProxy:nil]; //crash
return [self hk_initWithBundleProxy:arg1];
}

@end

转载于:https://www.cnblogs.com/coolcold/p/10454867.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值