AppDelegate 中调用UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCente一定几率下出现 #28502 NSInternalInconsistencyException Invalid parameter not satisfying: bundleProxy != nil

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

posted @ 2019-03-04 10:03  do+better  阅读(1514)  评论(0编辑  收藏  举报