2012-03-22 10 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]; 
    ... 
} 
関連する問題