SDK開發(fā)中捕獲AppDelegate通知

1.需要WMAppDelegateProxy類

@interfaceWMAppDelegateProxy :NSProxy

- (id)init;

@property(nonatomic,strong)NSObject *hjAppDelegate;

@property(nonatomic,strong)NSObject *originalAppDelegate;

@end

#import"WMAppDelegateProxy.h"

@implementationWMAppDelegateProxy

- (id)init

{

returnself;

}

- (NSMethodSignature*)methodSignatureForSelector:(SEL)aSelector

{

NSMethodSignature*sig;

sig = [self.originalAppDelegatemethodSignatureForSelector:aSelector];

if(sig) {

returnsig;

}else{

sig = [self.hjAppDelegatemethodSignatureForSelector:aSelector];

returnsig;

}

returnnil;

}

// Invoke the invocation on whichever real object had a signature for it.

- (void)forwardInvocation:(NSInvocation*)invocation

{

if([selfhjDelegateRespondsToSelector:[invocationselector]]) {

[invocationinvokeWithTarget:self.hjAppDelegate];

}

if([self.originalAppDelegatemethodSignatureForSelector:[invocationselector]]) {

[invocationinvokeWithTarget:self.originalAppDelegate];

}

}

// Override some of NSProxy's implementations to forward them...

- (BOOL)respondsToSelector:(SEL)aSelector

{

if([self.hjAppDelegaterespondsToSelector:aSelector])

returnYES;

if([self.originalAppDelegaterespondsToSelector:aSelector])

returnYES;

returnNO;

}

- (BOOL)hjDelegateRespondsToSelector:(SEL)selector

{

return[self.hjAppDelegaterespondsToSelector:selector] && ![[NSObjectclass]instancesRespondToSelector:selector];

}

@end


2.新建WMAppDelegate類


#import

@interfaceWMAppDelegate :NSObject

@end

#import"WMAppDelegate.h"

@implementationWMAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

//如果sdk初值化是在didFinishLaunchingWithOptions方法,就無法運行到sdk里面的這個方法

NSLog(@"SDK UIApplication didFinishLaunchingWithOptions:%@, %@", application, launchOptions);

returnYES;

}

- (void)applicationWillResignActive:(UIApplication *)application {

}

- (void)applicationDidEnterBackground:(UIApplication *)application {

}

- (void)applicationWillEnterForeground:(UIApplication*)application {

}

- (void)applicationDidBecomeActive:(UIApplication*)application {

}

- (void)applicationWillTerminate:(UIApplication*)application {

}

@end

3.在SDK初值化的時候 添加如下代碼

_appDelegateProxy=[[WMAppDelegateProxyalloc]init];

@synchronized([UIApplicationsharedApplication]) {

_appDelegateProxy.hjAppDelegate= [[WMAppDelegatealloc]init];

_appDelegateProxy.originalAppDelegate= [UIApplicationsharedApplication].delegate;

[UIApplicationsharedApplication].delegate=_appDelegateProxy;

}

原理:

[UIApplication sharedApplication].delegate, 這個delegate默認是指向DemoAppDelegate, 現(xiàn)在我們可以把[UIApplication sharedApplication].delegate指向一個變量proxy, 那么這個變量將會獲取到所有原來應(yīng)用AppDelegate的回調(diào)方法, 其中包括appDidFinishLaunchedWithOption, appWillResignActive, appWillEnterForeground等回調(diào)用, 同樣也包括本地通知以及遠程通知調(diào)用時的回調(diào)。

上面這個方法是把這個[UIApplication sharedApplication].delegate指向一個變量proxy, 我們只需要在proxy這個變量中同時把appDelegate也進行調(diào)用就可以了。 也即在proxy中,我們可以先處理一下我們想處理的回調(diào)方法, 然后繼續(xù)讓這些回調(diào)方法繼續(xù)流轉(zhuǎn), 如流轉(zhuǎn)到appDelegate即可。也即讓自己先處理完成后, 再進行消息的轉(zhuǎn)發(fā)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容