2015-03-18 61 views
2

我正在开发适用于Mac OS X的屏幕保护程序,我需要做一些方法混写,所以我做了一个小实验:为什么方法swizzling被屏幕保护程序绕过?

@implementation CAHTTPCookieStorage 
+ (void) highjack { 
    NSLog(@"Attempting to highjack cookies."); 
    Class originalClass = [NSHTTPCookieStorage class]; 
    Method originalMeth = class_getClassMethod(originalClass, @selector(sharedHTTPCookieStorage)); 
    Method replacementMeth = class_getClassMethod([self class], @selector(patchedSharedHTTPCookieStorage)); 
    method_exchangeImplementations(originalMeth, replacementMeth); 
} 

+ (NSHTTPCookieStorage*) patchedSharedHTTPCookieStorage { 
    NSLog(@"Cookies have been highjacked!!!!"); 
    return [CAHTTPCookieStorage patchedSharedHTTPCookieStorage]; 
} 
@end 

我从AppDelegate.init我的应用程序调用CAHTTPCookieStorage.highjack() ()和我ScreensaverViewSubclass.init(...)的屏幕保护程序。在预览模式下(在系统首选项中)运行我的应用程序或屏幕保护程序时,它可以正常工作,但是当我将其作为正确的屏幕保护程序运行时,我可以看到消息“试图强行挂断cookie”。但从来没有“曲奇已被劫持!!!!”。

任何想法可能会出错?也许是线程的问题?每个线程都在调整方法吗?

回答

0

对此的进一步调查证明,双监视器模式下仅在10.10时才为真,而在双监视器模式下仅为10.10,而在两台监视器中为10.9,而在单监视器时为10.10。我不确定是什么导致了它,但使用+加载方法进行调整解决了它:

+ (void) load { 
    NSLog(@"Attempting to highjack cookies."); 
    Class originalClass = [NSHTTPCookieStorage class]; 
    Method originalMeth = class_getClassMethod(originalClass, @selector(sharedHTTPCookieStorage)); 
    Method replacementMeth = class_getClassMethod([self class], @selector(patchedSharedHTTPCookieStorage)); 
    method_exchangeImplementations(originalMeth, replacementMeth); 
} 
相关问题