2012-03-22 104 views
1

如何在UIApplication中加載鉤子?在UIApplication(CaptainHook)中調整openURL

#import <CaptainHook/CaptainHook.h> 
#import <SpringBoard/SpringBoard.h> 

CHDeclareClass(SBAlertWindow); 
CHOptimizedMethod(1, self, void, SBAlertWindow, displayAlert, id, alert) { 
    NSLog(@"load displayAlert!"); 
    CHSuper(1, SBAlertWindow, displayAlert, alert); 
} 

CHDeclareClass(UIApplication) 
CHOptimizedMethod(1, self, void, UIApplication, openURL, NSURL *, url) { 
    NSString *linkToOpen = [[NSURL alloc] initWithString:[url absoluteString]]; 
    NSLog(@"dont load link: %@", linkToOpen); 
    CHSuper(1, UIApplication, openURL, url);   
} 

CHConstructor { 
    CHLoadLateClass(SBAlertWindow); 
    CHHook(1, SBAlertWindow, displayAlert); 

    CHLoadLateClass(UIApplication); 
    CHHook(1, UIApplication, openURL); 
} 

在我的SBAlertWindow測試中。 工作完美。 但在UIApplication的openURL不掛鉤。

需要makefile中的一些配置?

回答

0

從這些轉儲中導入具有該實現的頭文件https://github.com/Fr0stDev/SpringBoard-iOS5-Headers

我不知道使用的excatct方法,但它看起來像財產以後

-(void)openURl:(NSUrl*)url; 

添加方法在你的調整,做你請什麼

-(void)openURl:(NSUrl*)url{ 

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Open Url?" message:@"Tweak 
over rides the method and called an alertview. What do you want to do?" delegate:self 
cancelButtonTitle:@"No Thanks" otherButtonTitles:@"Copy Link", @"Save",@"ViewSaved", 
nil]; 
[alert show]; 
[alert release]; 

return Url; 


} 
0

KHookObjectWrapper.h

#import <Foundation/Foundation.h> 

@interface KHookObjectWrapper : NSObject 

+ (void)initialize; 
- (BOOL)fake__openURL:(NSURL *)url; 

@end 

KHookObjectWrapper.m

#import "KHookObjectWrapper.h" 
#import <objc/objc.h> 
#import <objc/runtime.h> 

@implementation KHookObjectWrapper 

+ (void)initialize 
{ 
Method openURL = class_getInstanceMethod([UIApplication class], @selector(openURL:)); 
Method openURLMy = class_getInstanceMethod([self class], @selector(openURLHooked:)); 
IMP openURLImp = method_getImplementation(openURL); 
class_addMethod([UIApplication class], @selector(fake__openURL:), openURLImp, method_getTypeEncoding(openURL)); 
IMP openURLSelfImp = method_getImplementation(openURLMy); 
class_replaceMethod([UIApplication class], @selector(openURL:), openURLSelfImp, method_getTypeEncoding(openURL)); 
} 

//fake method, never run. 
- (BOOL)fake__openURL:(NSURL *)url 
{ 
abort(); 
return YES; 
} 

- (BOOL)openURLHooked:(NSURL *)url 
{ 
NSLog(@"openURL param:url=%@", [url absoluteString]); 
return [self fake__openURL:url]; 
} 

@end 

最後,在主appDelegate.m添加代碼

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [KHookObjectWrapper initialize]; 
    ... 
} 
相關問題