2011-06-17 38 views
0

我遇到了應用程序的問題。 我正在構建一個WebApp的應用程序。 因此,該應用程序在服務器上運行,並與UIWebview進行交互。ApplicationDidEnterBackground和UIWebview

所以讓我解釋一下我在這裏想要達到的目標。 在網頁上我有幾個JavaScript函數,我與這些功能進行交互trought的stringByEvaluatingJavaScriptFromString 例如: 代碼:

[webView stringByEvaluatingJavaScriptFromString:@"tagMe()"]; 

和服務器將執行此命令並執行以下操作

它設置器的URLPrefix到ServerReply://(),我抓住這個與

- (BOOL)webViewUIWebView *)webView shouldStartLoadWithRequestNSURLRequest *)request navigationTypeUIWebViewNavigationType)navigation Type 

因此,如果URL有一個前綴ServerReply://它運行在我的應用程序的功能。

到目前爲止一切都很好,但當用戶按下HOME按鈕或他得到一個電話。該ApplicationDidEnterBackground方法將被調用,我想調用另一個JS功能

代碼:

[webView stringByEvaluatingJavaScriptFromString:@"gettingClosed()"]; 

,然後服務器應該給我帶前綴的SaveClientData一個URL://(somestring)

所以該應用程序關閉,這是行不通的.... 我的代碼是這樣的

代碼:

//AppDelegate.m 

    - (void)applicationDidEnterBackground:(UIApplication *)application { 
    [webViewController killTrigger]; 
} 

//webViewController. m 

-(void)killTrigger{ 

[webView stringByEvaluatingJavaScriptFromString:@"gettingClosed()"]; 

} 

,這不工作,但如果我這樣做 代碼:

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    [webViewController killTrigger]; 
} 

//webViewController. m 

-(void)killTrigger{ 

NSLog(@"killTrigger got called"); 

} 

當我離開應用程序我得到的日誌消息...

是有可能這樣做[webView的stringByEvaluatingJavaScriptFromString: @「gettingCl osed()」];如果我的應用移動到背景?還是有不同的方法來獲得相同的結果......?

TNX提前,

巴特

回答

0

我也有類似的情況,並有一些奇怪的行爲。我還沒有解決問題,但我有一些發現。我會與你分享,所以也許你可以在此發展並找到解決方案。

我觀察到,通常執行applicationDidEnterBackground調用的JS代碼(以及applicationWillResignActive調用的代碼)。

爲了測試這個,我爲所有的JS代碼設置了一個全局計數器,我在進入BG之前遞增它,並且在後臺檢查它的狀態(檢查它我使用了一個骯髒的解決方法,我基本上創建了一個新的名爲cntr _#{counter value})的文件,所以我假定JS函數被調用(因爲計數器遞增)。

但是,在增加計數器之前,我的JS函數還會發送一個XMPP消息。當我嗅探網絡流量時,發現XMPP消息在應用恢復後立即發送。現在有兩種可能性:或者向BG的轉換沒有創建XMPP連接的可能性(我認爲這不合理),要麼XMPP函數異步發生並且其執行被推遲。

更新。

我發現我用於XMPP的JS庫實際上是異步的,並且在其隊列中調用flush可以解決丟失的XMPP消息的問題。希望這可以幫助你。

1

我知道這個問題很舊,但我仍想發佈一個解決方案。我有一個類似的問題:當我的應用程序進入後臺時,我想關閉一個websocket,但是在這可能會通過之前,似乎iOS暫停了該線程。這個問題的解決是註冊後臺任務:

- (void)applicationDidEnterBackground 
{ 
    self.cleanupBackgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     [[UIApplication sharedApplication] endBackgroundTask:self.cleanupBackgroundTaskIdentifier]; 
     self.cleanupBackgroundTaskIdentifier = UIBackgroundTaskInvalid; 
    }]; 

    [self.remoteWebView stringByEvaluatingJavaScriptFromString:@"websocket.close();"]; 
    [self performSelector:@selector(cleanupBackgroundTaskTimeout) withObject:nil afterDelay:10.0]; 
} 

- (void)cleanupBackgroundTaskTimeout 
{ 
    [[UIApplication sharedApplication] endBackgroundTask:self.cleanupBackgroundTaskIdentifier]; 
} 

這是告訴我們要繼續在後臺運行的iOS,然後關閉WebSocket的。然後,我們給websocket足夠的時間關閉(在這種情況下爲10秒),然後結束後臺任務。

請注意,你傳遞給beginBackgroundTaskWithExpirationHandler:塊是是在後臺執行的代碼,調用此方法只是告訴你的應用程序不應該立刻暫停的iOS。

另外,請注意,無法保證您能夠獲得額外的後臺工作時間,並且您必須及時撥打endBackgroundTask:(通常爲10分鐘),否則iOS會終止您的應用程序。

相關問題