我正在试图找出是否可以跟踪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我希望在某些网站上进行一些与性能相关的测试。
答案 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中的链接,则可以执行此操作。