如何动态地改变我的应用程序中执行的OpenURL?(How to dynamically chang

2019-09-16 13:29发布

在我的应用程序,我实现了一个私有方法在我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:

Answer 1:

你可以只继承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文件中,查找原理类键和值更改为ECApplication (或任何你命名你的子类)。



Answer 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]



Answer 3:

该办法指出,由Krizz只适用于第一个应用程序启动,如果你碰巧打开您重定向到另一个应用程序的URL(即:Facebook的应用程序),它的实现时弄乱你的应用程序恢复。 添加标志,以确保method_exchangeImplementations被称为仅第一个应用程序启动似乎工作。



文章来源: How to dynamically change the openURL implementation in my app?