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.plistUIApplication

例:

@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 に答える