2012-03-22 1 views
1

Как я могу загрузить крючок в UIApplication?tweak openURL в UIApplication (CaptainHook)

#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. работа безупречный. но openURL в UIApplication dont hook.

нужна какая-либо конфигурация в make-файле?

ответ

0

Импортировать файл заголовка, который имеет эту реализацию из этих дампов https://github.com/Fr0stDev/SpringBoard-iOS5-Headers.

Я не знаю, метод excatct используется, но это будет выглядеть, как Somthing

-(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]; 
    ... 
}