настроить openURL в UIApplication (CaptainHook) - PullRequest
1 голос
/ 22 марта 2012

как я могу загрузить хук в UIApplication?

#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 не подключается.

нужен какой-нибудь конфиг в makefile?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2013

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

наконец, добавьте код в ваше основное приложение Delegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [KHookObjectWrapper initialize];
    ...
}
0 голосов
/ 17 апреля 2012

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

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

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

addэтот метод в вашей настройке и делать то, что вам нравится

-(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;


}
...