0

我试图弄清楚是否可以跟踪 Safari 何时完成加载页面请求。我调用 Safari 以使用以下代码打开:

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

但是,由于我的应用程序进入后台,它可能会被挂起(并且无法执行代码)。这甚至可以在 Xcode 4 中完成吗?

编辑

我这样做的原因是因为UIWebView 和 Safari 不在同一级别运行,我想在某些网站上做一些与性能相关的测试。

4

3 回答 3

2

所以,如果你想看看我是如何为越狱的 iOS 做的(而不是非常无聊的“不可能”):我基本上挂钩了 safari 以访问页面完成加载时调用的特定方法。使用 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

这一般是不可能的。

您可以做的一件事是从要加载的页面,重定向到您的应用程序的 URL 方案,这将启动您的应用程序。有关此问题的更多信息,请查看-[UIApplicationDelegate application:openURL:sourceApplication:annotation:]方法。

我不认为您的应用程序可以通过这样的 URL 方案拒绝激活,因此这意味着您的应用程序将变为活动状态。也许可以使用上述方法的返回值(这是一个布尔值),您必须对其进行测试。

此方法还假定您可以访问您正在打开的页面,以便您可以添加重定向。

于 2012-05-25T19:16:03.537 回答
0

不,这是不可能的。但是,如果您在自己的应用程序中打开 UIWebView 中的链接,则可以执行此操作。

于 2012-05-25T19:11:15.243 回答