2

在我的应用程序中,我在我的应用程序中实现了一个私有方法AppDelegate来覆盖默认openURL:方法,以便在UIWebView. 但现在我也需要默认功能。

这是我所做的:

@implementation UIApplication (Private)

- (BOOL)customOpenURL:(NSURL*)url
{ 
    AppDelegate *MyWatcher = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    if (MyWatcher.currentViewController) {
        [MyWatcher.currentViewController handleURL:url];
        return YES;
    }
    return NO;
}

@end

- (void)applicationDidBecomeActive:(UIApplication *)application {  
    Method customOpenUrl = class_getInstanceMethod([UIApplication class], @selector(customOpenURL:));
    Method openUrl = class_getInstanceMethod([UIApplication class], @selector(openURL:));

   method_exchangeImplementations(openUrl, customOpenUrl);  
}

我还在handleURL:我的班级中实现了需要自定义打开 URL 处理的地方。但是,这阻碍了我的其他课程,我只想在 iTunes 中简单地打开 iTunes 链接。所以我不知道如何实现的是如何使用原始openURL:代替customOpenURL:.

4

3 回答 3

4

您可以直接继承UIApplication和覆盖openURL:。请务必更改您的原则类Info.plist以使用您的UIApplication子类。

例子:

@interface ECApplication : UIApplication

@end

@implementation ECApplication

- (BOOL)openURL:(NSURL*)url
{

    AppDelegate *MyWatcher = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    if (MyWatcher.currentViewController) {
        [MyWatcher.currentViewController handleURL:url];
        return YES;
    }
    return NO;
}

@end

然后,在您的Info.plist文件中,查找 Principle Class 键,并将值更改为ECApplication(或您为子类命名的任何名称)。

于 2012-04-14T21:49:10.340 回答
2

您可以将原始实现设置为其他方法,然后调用它:

@implementation UIApplication (Private)
- (BOOL)originalOpenURL:(NSURL*)url 
{
     return NO;
}

- (BOOL)customOpenURL:(NSURL*)url
{
     if (/* some condition */)
     {
        // your code
     }
     else
     {
        return [self originalOpenURL: url];
     }
}

@end

- (void)applicationDidBecomeActive:(UIApplication *)application {  
     Method customOpenUrl = class_getInstanceMethod([UIApplication class], @selector(customOpenURL:));
     Method openUrl = class_getInstanceMethod([UIApplication class], @selector(openURL:));
     Method originalOpenUrl = class_getInstanceMethod([UIApplication class], @selector(originalOpenURL:));

     method_exchangeImplementations(openUrl, originalOpenUrl); 
     method_exchangeImplementations(openUrl, customOpenUrl);  
}

注意:这只是一个直接回答您的问题的解决方案。解决这个问题的更清晰的方法是@edc1591 建议的方法。您可以openURL:使用[super openURL:url].

于 2012-04-14T22:33:24.497 回答
0

Krizz 指出的方法仅适用于第一个应用程序启动,如果您碰巧打开一个将您重定向到另一个应用程序(即:Facebook 应用程序)的 URL,它会在您的应用程序恢复时与实现混淆。添加一个标志以确保仅在第一个应用程序启动时调用 method_exchangeImplementations 似乎有效。

于 2015-06-22T18:00:48.577 回答