我必须在我的应用中实现版本检查器。该应用程序将检查服务器的版本(手动设置)。事实上,服务器不会在JSON
或XML
中返回响应。它以简单的text/html
返回,我不熟悉。
例如。如果应用需要更新,它将返回如下响应。
<checkversion>
<update>TRUE</update>
<status>MINOR</status>
<alert></alert>
<version>1.0.0</version>
<ituneslink>0</ituneslink>
</checkversion>
否则,它将返回如下响应。
<checkversion>
<update>FALSE</update>
</checkversion>
在查看了this和this等类似的SO帖子后,我设法以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 :(得分: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];
}
这就是我解决它的方式。
答案 1 :(得分:0)
请尝试以下代码:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager new];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];