2013-07-26 6 views
3

Javascript 스 니펫의 실행 엔진으로 보이지 않는 UIWebView를 사용하고 있습니다. what certain pages suggest과는 반대로 일 필요는 없습니다. 단순히 UIWebView에서 자바 스크립트 실행 일시 중지

UIWebView* myJSExecutor = [UIWebView new]; 

로 죽은 선언 된 경우뿐만 아니라 그것을 던져 어떤 stringByEvaluatingJavaScriptFromString:, 그것은 심지어 바탕 화면에 alert() 거품 실행! 책임의 한계와 법적 고지 (뭔가가있어하지 않는 것이 자주 할 싶습니다) : iOS 만 5+ 이제

테스트, 나는 보통의 웹 페이지 콘텐츠와 UIWebView 또 다른 일반적으로 볼 수 있고, 나는 자바 스크립트의 실행을 중지 에 원하는 : 타이머 및 DOM 이벤트에 대한 작업이 중지됩니다. 나는 removeFromSuperviewstopLoading으로 설정하고 delegate = nil으로 설정하면 트릭을 수행 할 수 있다고 생각했습니다. 하지만 UIWebView를 다시보기 뷰에 추가하자마자 타이머가 항상 실행되고 있음을 알 수 있습니다.

나는 나의 요구 사항의 정신 분열증을 이해합니다. 나는 한 손으로 (일부 관측과는 반대로) 배경에서 일하는 것을 고맙게 생각하지만, 다른 한편으로는 그것을 중단하고 싶다. 그러나 여전히 그것을 일시 중지 할 수있는 개인적인 방법이 있는지 물어보고 싶습니다. iOS 용 Safari는 브라우저 탭을 백그라운드에서 일시 중지 할 수 있습니다. 슬픈 부정적인 증거 :(하지 그냥 직접 JavaScriptCore는 호출 할 수 있다면

답변

1

당신은? 전체의 UIWebView가 필요하십니까 할 수있는, 할 수없는 iOS 용 크롬. 이것은 당신이 더 이상 제어 할 것

- (NSString *)runJS:(NSString *)aJSString 
{ 
    JSContextRef ctx = JSGlobalContextCreate(NULL); 
    JSStringRef scriptJS = JSStringCreateWithUTF8CString([aJSString UTF8String]); 
    JSValueRef exception = NULL; 
    JSValueRef result = JSEvaluateScript([self JSContext], scriptJS, NULL, NULL, 0, &exception); 
    JSGlobalContextRelease(ctx); 
    ... 

전체 JS 런타임은,하지만 불행히도 나는 전체 컨텍스트를 해제 이외의 타이머의 실행을 중지 할 수있는 API를 찾을 수 없습니다했습니다. 사용하는 방법에 대한보다 완전한 예를 들어

당신이 경우 JavaScriptCore는이 https://github.com/jfahrenkrug/AddressBookSpy/blob/master/AddressBookSpy/AddressBookSpy/ABSEngine.m

+0

불행히도 전체 UIWebView가 필요합니다. +1 JavaScriptCore 힌트. –

3

참조 보기 미친 짓을하다가, 나는 생각이있다.

자바 스크립트를 일시 중지하는 유일한 방법은 async=false과 함께 경고를 표시하거나 확인하거나 메시지를 보내거나 아약스 요청을 보내는 것입니다.

UIWebView가 숨겨져있을 때 경고가 숨겨져 있습니까? 그렇다면 동결하려는 경우 경고를 보낼 수 있습니다. 사용자가보기를 다시 표시하면 사용자가이를 취소해야합니다.

[web stringByEvaluatingJavaScriptFromString:@"alert('Press OK to continue...')"]; 

또는 프로그래밍 방식으로 해제 할 수 있습니다. 이 모든 제안은 문제가 될 것이라는 점에 동의 할 거라고 확신하지만 생각입니다.

+0

_ "UIWebView가 숨겨져있을 때 경고가 숨겨져 있습니까?"_ ** 불행히도 NO **. 가시성에 관계없이 경고가 나타나거나 (슈퍼) 뷰 컨텍스트가 전혀 없습니다.나는 그 질문에 썼다. 그러나 'async = false'_로 아약스 요청을 보내면서 우리는 생각하게 만들었다. +1. 현재로서는 최우선 순위는 아니지만 작동한다면 다시 연락 할 것을 약속드립니다. –

+0

나는 우리에게 특별한 요구 사항 (전체'UIWebView '필요, 페이지 내용에 대한 통제권이 없음)을 감안할 때 이것이 유일한 제안이기 때문에 현상금을 제공하고 있습니다. @PavelZdenek이 말했듯이,'alert'는 작동하지 않을 것이지만, 작업 대기열에서 더 긴급한 작업을 마친 후에는 동기식'XMLHttpRequest'를 시도 할 것입니다. –

1

이것은 분명 할 수도 있지만 UIWebView에서 실행중인 JS를 편집 할 수있는 경우 JS에 'paused'라는 전역 변수를 저장하고 타이머가 실행 중일 때이를 확인할 수 없습니까? [: @ "= 사실 일시 정지,"웹보기 stringByEvaluatingJavaScriptFromString을] 당신이 웹보기를 제거 할 때, 당신은 다시 뷰에 추가 할 때 세트 = 거짓 일시 정지

var paused = false; 
var thread = setInterval(function() { 
    if(!paused) { 
     // normal timer checking etc 
    } 
}, 300); 

은 그럼 그냥 화재.

+0

불행히도 나는 페이지 내용을 통제하지 않습니다. 그것은 웹 브라우저이기 때문에 저자는 타이머에 대해 무엇이든 할 수 있습니다. 하지만 네, 우리는 "막 다른 골목"이론 중 하나를 확인합니다 :) –

관련 문제