Update AFNetworking from version 1.2.1 to 3.1.0

2019-07-22 05:09发布

Iam about to update our post project in Objective C to meet the new Apple requirement for support Ipv6 only. My AFNetworking libray is now 1.2.1. I doubt it is the problem. I want to update to latest version support IPv6 but when running pod install I get this error

[!] Unable to satisfy the following requirements:

  • AFNetworking (~> 3.1.0) required by Podfile
  • AFNetworking (= 3.1.0) required by Podfile.lock
  • AFNetworking (~> 1.2.1) required by AFRaptureXMLRequestOperation (1.0.2)

Here is my complete pod file

platform :ios, '7.0'

def shared_pods
    pod 'RaptureXML'
    pod 'Realm'
end

def ios_pods

    pod 'AFRaptureXMLRequestOperation'
    pod 'GoogleAnalytics-iOS-SDK', '~> 3.0.9'
    pod 'KGModal', '~> 0.0.1'
    pod 'MagicalRecord'
    pod 'MHNatGeoViewControllerTransition', '~> 1.0'
    pod 'SVProgressHUD', '~> 1.0'
    pod 'UALogger', '~> 0.2.3'
    pod 'Reachability', '~> 3.1.1'
    pod 'RegexKitLite', '~> 4.0'
    pod 'SSKeychain', '~> 1.2.1'
    pod 'TTTAttributedLabel'
    pod 'TPKeyboardAvoiding', '~> 1.1'
    pod 'UIAlertView+Blocks', '~> 0.7'
    pod 'UIActivityIndicator-for-SDWebImage', '~> 1.0.3'
    pod 'SevenSwitch', '~> 1.3.0'
    pod 'ZXingObjC', '~> 3.0'
    pod 'DeviceUtil', '~> 1.2'
end

Is there any way to use AFRaptureXMLRequestOperation with AFNetworking 3.0? or any other solution? Any help is much appreciate. Thanks

1条回答
ら.Afraid
2楼-- · 2019-07-22 05:37

AFRaptureXMLRequestOperation subclasses AFHTTPRequestOperation, but this class no longer exists in AFNetworking 3.x. You will not be able to use AFRaptureXMLRequestOperation with AFNetworking 3.x.

If you're just parsing XML response with AFNetworking 3.x, you can use AFXMLParserResponseSerializer. It returns a NSXMLParser.

So, set the delegate for that responseObject, and then call parse on it:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"application/rss+xml"];  // this line is only needed if parsing RSS feed

[manager GET:@"https://developer.apple.com/news/rss/news.rss" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    NSXMLParser *parser = responseObject;
    parser.delegate = self;
    self.titles = [NSMutableArray array];
    [parser parse];
    NSLog(@"%@", self.titles);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    NSLog(@"%@", error);
}];

You'll have to write your own NSXMLParserDelegate code, though. So, to parse the titles out of the XML of Apple's RSS feed, I added two properties:

@property (nonatomic, strong) NSMutableArray *titles;
@property (nonatomic, strong) NSMutableString *elementValue;

And then implemented the following NSXMLParserDelegate methods:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {
    if ([elementName isEqualToString:@"title"]) {
        self.elementValue = [NSMutableString string];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    [self.elementValue appendString:string];
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    if ([elementName isEqualToString:@"title"]) {
        [self.titles addObject:self.elementValue];
        self.elementValue = nil;
    }
}
查看更多
登录 后发表回答