2014-09-30 13 views
0

我必須在我的應用程序中實現版本檢查器。該應用程序將檢查服務器的版本(手動設置)。事情是,服務器既不返回JSONXML中的響應。它返回原始text/html,我不熟悉。用AFNetworking解析Content-Type文本/ html

例如。如果應用程序需要更新,它將返回如下響應。

<checkversion> 
    <update>TRUE</update> 
    <status>MINOR</status> 
    <alert></alert> 
    <version>1.0.0</version> 
    <ituneslink>0</ituneslink> 
</checkversion> 

否則,它將返回如下響應。

<checkversion> 
    <update>FALSE</update> 
</checkversion> 

看着有些相似,所以帖子如thisthis後,我設法得到的string格式的響應。以下是我的代碼片段。

- (void)slurpVersionChecker 
{ 
    NSString *versionURL = @"api"; 
    NSDictionary *params = @{@"api_key":@"key"}; 

    AFHTTPRequestOperationManager *requestManager = [AFHTTPRequestOperationManager manager]; 
    [requestManager setResponseSerializer:[AFHTTPResponseSerializer serializer]]; 
    [requestManager POST:versionURL parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; 
     NSLog(@"version: %@", string); 

    }failure:^(AFHTTPRequestOperation *operation, NSError *error){ 
     NSLog(@"failed to check version: %@", error); 
    }]; 

} 

問題是,我該如何解析每個響應?是否有任何方法可以通過responseObject直接解析響應而不將其轉換爲String

+0

這並不似乎是HTML。你的意思是說服務器返回Content-Type text/html的響應嗎? – 2014-09-30 14:54:01

+0

服務器返回的內容類型是謊言。這是服務器端的缺陷。如果可能的話,與Web服務提供商合作,讓他們解決這個問題。如果你不能修復這個缺陷,那麼你應該能夠把響應當作XML處理。 **警告**:盲目地將響應視爲XML,因爲服務器缺陷可能會變得脆弱。小心數據。 – 2014-09-30 14:58:22

+0

@jshier好吧,這證實了它,因爲這不是一個html標籤。是的,服務器返回Content-Type文本/ html。 – 2014-10-01 01:11:29

回答

0

好的。我已經設法解決這個問題,所以我不妨將解決方案發布給其他人。

這是我基本上做的。我使用XMLReader解析到NSDictionary的響應。因此,將庫添加到我的項目中,並在標題中導入XMLReader.h。然後,我只需要調用dictionaryForXMLDAta方法來使用它,它返回:

checkversion = { 
version: { 
    alert =  { 
     text = ""; 
    }; 
    ituneslink =  { 
     text = 0; 
    }; 
    status =  { 
     text = MINOR; 
    }; 
    text = ""; 
    update =  { 
     text = TRUE; 
    }; 
    version =  { 
     text = "1.0.0"; 
    }; 
} 

的NSDictionary的回報是不是漂亮,但。所以,我不得不使用objectForKey幾次來檢索值。

[requestManager POST:versionURL parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSData * data = (NSData *)responseObject; 
     NSError *error = nil; 
     NSDictionary *dict = [XMLReader dictionaryForXMLData:data 
                options:XMLReaderOptionsProcessNamespaces 
                 error:&error]; 
     NSDictionary *version = [dict objectForKey:@"checkversion"]; 
     update = [[version objectForKey:@"update"] objectForKey:@"text"]; 
     ... 
    } 

獎勵:如果有新的更新可用,我想通知用戶。因此,我檢查update變量是否等於TRUE,如果它是TRUE,它會將用戶鏈接到應用商店。

if([update isEqualToString:@"TRUE"]) { 
      number = [[version objectForKey:@"version"] objectForKey:@"text"]; 
      itunesURL = [[version objectForKey:@"ituneslink"] objectForKey:@"text"]; 

      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"New Version Available" message:nil delegate:self cancelButtonTitle:@"Not Now" otherButtonTitles:@"Download", nil]; 
      [alert show]; 

     } 

而這就是我如何解決它。

0

請嘗試以下代碼:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager new]; 
manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];