在我的应用中,我已在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:
。
答案 0 :(得分: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
(或者您为子类命名的任何内容)。
答案 1 :(得分: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]
。
答案 2 :(得分:0)
Krizz指出的方法仅适用于第一个应用程序启动,如果您碰巧打开一个将您重定向到另一个应用程序(即Facebook应用程序)的URL,它会在您的应用程序恢复时与实现混淆。添加一个标志以确保仅在第一次应用启动时调用method_exchangeImplementations似乎有效。