在我的应用程序,我实现了一个私有方法在我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:
你可以只继承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
(或任何你命名你的子类)。
您可以将原来的执行设置其他一些方法,然后叫它:
@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]
该办法指出,由Krizz只适用于第一个应用程序启动,如果你碰巧打开您重定向到另一个应用程序的URL(即:Facebook的应用程序),它的实现时弄乱你的应用程序恢复。 添加标志,以确保method_exchangeImplementations被称为仅第一个应用程序启动似乎工作。