2013-05-10 101 views
0

我正在開發一個iOS應用程序,我正在實施推送通知。由於網絡原因,應用程序UI掛起,iOS

AppDelegate,更具體的didRegisterForRemoteNotificationsWithDeviceToken功能,以後我的推送通知登記,我做一個HTTP POST請求發送到我的服務器的用戶憑據(cfuuid,OS等)和推送令牌。

當服務器應用程序一切順利。 但是,如果由於任何原因服務器無法訪問,應用程序的UI會掛起大約30秒(直到連接超時),我唯一看到的就是一個白色屏幕。

我怎麼會從UI中的「網絡」分開?我想通過使用另一個線程的答案。

到底我能做到這一點?我在didRegisterForRemoteNotificationsWithDeviceToken中唯一做的是使用ASIHTTPRequest庫將憑據發送到服務器。

需要在不同的線程所要執行的代碼如下所示:

NSString *jsonString; 
    //jsonString = [[NSString alloc] initWithFormat:@"{\"deviceUUID\":\"%@\",\"os\":\"ios\", \"active\":\"%d\", \"pushToken\":\"%@\"}",deviceUUID,active,token]; 
    jsonString = [[NSString alloc] initWithFormat:@"{\"deviceUUID\":\"%@\",\"os\":\"ios\", \"pushToken\":\"%@\"}",deviceUUID,token]; 
    NSLog(@"%@",jsonString); 

    //NSString *urlStr= [[NSString alloc] initWithFormat:CITYINFO_SERVER_URL,@"push_notifications/register"]; 
    NSString *urlStr= [[NSString alloc] initWithFormat:CITYINFO_SERVER_URL,@"register.php"]; 

    //send json file , using ASIHttpClass 
    NSURL *url = [NSURL URLWithString:urlStr]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    request.timeOutSeconds = TIME_OUT_SECONDS; 
    [request setRequestMethod:@"PUT"]; 

    //NSString *credentials= [self encodeCredentials]; 
    //[request addRequestHeader:@"Authorization" value:[[NSString alloc] initWithFormat:@"Basic %@",credentials]]; 
    [request addRequestHeader:@"Content-Type" value:@"application/json; charset=utf-8"]; 


    [request appendPostData:[jsonString dataUsingEncoding:NSUTF8StringEncoding]]; 
    [request startSynchronous]; 

    if([request responseStatusCode]==200){ 
     NSLog(@"Server reached. Response Status : 200"); 
     return true; 
    } else { 
     NSLog(@"Server could not be reached"); 
     return false; 
+0

try [request startAsynchronous];而不是[request startSynchronous]; – Bonnie 2013-05-10 09:16:00

回答

0

而是發送同步要求只發送異步要求

[request startAsynchronous]; 

並調用它一定的時間間隔後擊中服務的方法從委託方法。

1
[request startSynchronous]; 

從不。做。同步。聯網。在主線上。


它移動到另一個線程,甚至更好,使請求異步。

0

使用[request startAsynchronous];

,而不是[request startSynchronous];

0

我想,你是發送設備令牌服務器使用主線程,請使用輔助線程實現此功能

試試這個代碼: -

[self performSelectorInBackground:@selector(pushNotifictionJson) withObject:nil]; 



-(void) pushNotifictionJson 
{ 
    NSString *jsonString; 
    //jsonString = [[NSString alloc] initWithFormat:@"{\"deviceUUID\":\"%@\",\"os\":\"ios\", \"active\":\"%d\", \"pushToken\":\"%@\"}",deviceUUID,active,token]; 
    jsonString = [[NSString alloc] initWithFormat:@"{\"deviceUUID\":\"%@\",\"os\":\"ios\", \"pushToken\":\"%@\"}",deviceUUID,token]; 
    NSLog(@"%@",jsonString); 

    //NSString *urlStr= [[NSString alloc] initWithFormat:CITYINFO_SERVER_URL,@"push_notifications/register"]; 
    NSString *urlStr= [[NSString alloc] initWithFormat:CITYINFO_SERVER_URL,@"register.php"]; 

    //send json file , using ASIHttpClass 
    NSURL *url = [NSURL URLWithString:urlStr]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    request.timeOutSeconds = TIME_OUT_SECONDS; 
    [request setRequestMethod:@"PUT"]; 

    //NSString *credentials= [self encodeCredentials]; 
    //[request addRequestHeader:@"Authorization" value:[[NSString alloc] initWithFormat:@"Basic %@",credentials]]; 
    [request addRequestHeader:@"Content-Type" value:@"application/json; charset=utf-8"]; 


    [request appendPostData:[jsonString dataUsingEncoding:NSUTF8StringEncoding]]; 
    [request startSynchronous]; 

    if([request responseStatusCode]==200){ 
     NSLog(@"Server reached. Response Status : 200"); 
     return true; 
    } else { 
     NSLog(@"Server could not be reached"); 
     return false; 
    } 
} 

和第二種方法

use [request startAsynchronous]; 

instead of [request startSynchronous]; 
相關問題