0

Safari がページ リクエストの読み込みを完了した時点を追跡できるかどうかを調べようとしています。このコードを使用して、Safari を呼び出して開きます。

// Open Safari
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.example.com/" description]]];

しかし、私のアプリはバックグラウンドに移行するため、一時停止される (コードを実行できない)可能性があります。これはXcode 4内でも可能ですか?

編集

これを行う理由は、UIWebView と Safari が同じレベルで実行されておらず、一部の Web サイトでパフォーマンス関連のテストを行いたいためです。

4

3 に答える 3

2

したがって、ジェイルブレイクされた iOS で私がどのようにそれを行ったかを確認したい場合 (非常に退屈な「不可能」ではなく): 私は基本的にサファリをフックして、ページの読み込みが終了したときに呼び出される特定のメソッドにアクセスできるようにしました。MobileSubstrate を使用する (動的ライブラリを挿入するときに com.apple.mobilesafari をフィルター処理する):

#import <substrate.h>
#import <UIKit/UIKit.h>

/* Some globals */
static IMP _orig_1, _orig_2;
static id tabController;

id _mod_1(id __self, SEL __cmd, CGRect frame, id tabDocument);
void _mod_2(id __self, SEL __cmd, id doc, BOOL error);


/* The library constructor */
__attribute__((constructor))
static void init()
{
    Class tabClass;

    tabClass = objc_getClass("TabController");

    MSHookMessageEx(tabClass, @selector(initWithFrame:tabDocument:),    
        (IMP)_mod_1, &_orig_1);
    MSHookMessageEx(tabClass, @selector(tabDocument:didFinishLoadingWithError:),
        (IMP)_mod_2, &_orig_2);
}


/* This hook merely captures the TabController of Safari. */
id _mod_1(id __self, SEL __cmd, CGRect frame, id tabDocument)
{
    __self = _orig_1(__self, __cmd, frame, tabDocument);
    tabController = __self;
    return __self;
}

/* This is called when the page loading is done */
void _mod_2(id __self, SEL __cmd, id doc, BOOL error)
{
    /* Make sure you always call the original method */
    _orig_2(__self, __cmd, doc, error);

    /* then do what you want */
}
于 2012-05-25T20:07:11.773 に答える
1

これは一般的にはありえません。

できることの 1 つは、読み込まれるページからアプリケーションの URL スキームにリダイレクトすることです。これにより、アプリケーションが起動します。この問題の詳細については、-[UIApplicationDelegate application:openURL:sourceApplication:annotation:]メソッドを参照してください。

あなたのアプリケーションがそのような URL スキームを介してアクティベーションを拒否できるとは思わないので、これはあなたのアプリケーションがアクティブになることを意味します。上記のメソッドの戻り値 (ブール値) を使用できる可能性があります。それをテストする必要があります。

この方法では、リダイレクトを追加できるように、開いているページにアクセスできることも前提としています。

于 2012-05-25T19:16:03.537 に答える
0

いいえ、これは不可能です。ただし、独自のアプリケーション内の UIWebView でリンクを開くと、これを行うことができます。

于 2012-05-25T19:11:15.243 に答える