如何判断Safari何时加载网页

时间:2012-05-25 19:08:38

标签: objective-c ios macos

我正在试图找出是否可以跟踪Safari何时加载页面请求。我使用此代码调用Safari打开:

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

但是,由于我的应用程序转到后台,可能是suspended (and not able to execute code)。这甚至可以在Xcode 4中完成吗?

修改

我之所以这样做是因为the UIWebView and Safari are not running at the same level我希望在某些网站上进行一些与性能相关的测试。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

一般情况下这是不可能的。

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

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

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

答案 2 :(得分:0)

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