2012-05-25 5 views
0

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

AppStore 또는 jailbroken 장치를 타겟팅합니까? jailbroken 장치에 대한 솔루션이 있습니다. –

+0

AppStore. 그러나 만약 당신이 jailbroken 하나를 게시 할 수있는 훌륭한 것입니다! – justderb

답변

1

일반적으로 불가능합니다.

로드 할 페이지에서 할 수있는 일은 응용 프로그램의 URL 스키마로 리디렉션하여 응용 프로그램을 시작하는 것입니다. 이 문제에 대한 자세한 내용은 -[UIApplicationDelegate application:openURL:sourceApplication:annotation:] 방법을 참조하십시오.

귀하의 응용 프로그램이 이러한 URL 스키마를 통해 활성화를 거부 할 수 있다고 생각하지 않으므로 응용 프로그램이 활성화 될 것입니다. 어쩌면 위의 메소드 (부울 값)의 반환 값을 사용할 수 있습니다. 테스트해야합니다.

또한이 방법은 사용자가 여는 페이지에 대한 액세스 권한이 있으므로 리디렉션을 추가 할 수 있다고 가정합니다.

+0

정확하게 광산이 아닌 페이지를 테스트하고 있습니다 ... 어쨌든 Safari 웹 페이지에 자바 스크립트를 삽입하여 로딩이 완료되면 다시 앱으로 리디렉션합니까? – justderb

+0

나는 XSS 공격을 근본적으로하고 있기 때문에 그렇지 않다. – Joost

+0

이것은 보안 관점에서 의미가 있습니다 .... 아마도 이것 때문에 어느 쪽이든 방법이 없다고 생각할 것입니다. – justderb

0

아니요, 불가능합니다. 그러나 자신의 응용 프로그램 내에서 UIWebView에서 링크를 여는 경우이 작업을 수행 할 수 있습니다.

2

그래서 내가 jailbroken iOS (매우 지루한 "불가능"대신)에 대해 어떻게했는지 보려면 다음과 같이하십시오. 기본적으로 사파리를 연결하여 페이지가있을 때 호출되는 특정 메소드에 액세스합니다. 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 */ 
} 
+0

흥미 롭습니다. 게시 해 주셔서 감사합니다. – justderb

+0

문제 없습니다. 언젠가는 도움이되기를 바랍니다. –

관련 문제