2016-07-26 7 views
0

Hallo Ich bin im Begriff, altes Projekt, das AFNetworking 1.2.1 und AFRaptureXMLOperation zu AFNetworking 3.1 zu erfüllen, um IPv6-Anforderung von Apple zu erfüllen. Aber weil AFRaptureXMLOperation keine Unterstützung für AFNetworking ist 3.1 Gibt es sowieso zum Konvertieren und Parsen von JSON, XML? Jede Hilfe ist sehr zu schätzen. Vielen Dank!AFNetworking 3.x Migration und XML-Parser

dies mein ApiClient.h

#import <AFNetworking.h> 
#import <AFRaptureXMLRequestOperation.h> 
#import <RXMLElement.h> 
#import <Realm/Realm.h> 

@class Stamp; 

@interface ApiClient : AFHTTPClient 

+(BOOL)isScanner; 
+(BOOL)isWithoutFacebook; 

typedef void (^ApiClientSuccess)(id responseObject); 
typedef void (^ApiClientFailure)(NSError *error); 
typedef void (^ApiClientProgressCompletion)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations); 

+ (ApiClient *)sharedInstance; 

- (void)reportAPIIssueURL:(NSString *)url payload:(NSString *)payload message:(NSString *)message; 

//informations 
- (void)getSingpostContentsOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)getSendReceiveItemsOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)getPayItemsOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)getShopItemsOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)getServicesItemsOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)getSingPostAppsItemsOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)getOffersItemsOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)getSingpostAnnouncementSuccess:(ApiClientSuccess)success failure:(ApiClientFailure)failure; 

//calculate postage 
- (void)calculateSingaporePostageForFromPostalCode:(NSString *)fromPostalCode andToPostalCode:(NSString *)toPostalCode andWeight:(NSString *)weightInGrams onSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)calculateOverseasPostageForCountryCode:(NSString *)countryCode andWeight:(NSString *)weightInGrams andItemTypeCode:(NSString *)itemTypeCode andDeliveryCode:(NSString *)deliveryCode onSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 

//postal codes 
- (void)findPostalCodeForBuildingNo:(NSString *)buildingNo andStreetName:(NSString *)streetName onSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)findPostalCodeForLandmark:(NSString *)landmark onSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)findPostalCodeForWindowsDeliveryNo:(NSString *)windowsDeliveryNo andType:(NSString *)type andPostOffice:(NSString *)postOffice onSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 

//locations 
- (void)getPostOfficeLocationsOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)getSamLocationsOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)getPostingBoxLocationsOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)getPostalAgentLocationsOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)getSingPostAgentLocationsOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)getPopStationLocationsOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 

- (void)getLocationsUpdatesOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)getLocationsUpdatesDetails:(NSArray *)array 
          success:(ApiClientSuccess)success 
          failure:(ApiClientFailure)failure; 

//tracking 
- (void)getItemTrackingDetailsForTrackingNumber:(NSString *)trackingNumber onSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)batchUpdateTrackedItems:(NSArray *)trackedItems onSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure withProgressCompletion:(ApiClientProgressCompletion)progressCompletion; 

//notifications 
- (void)registerAPNSToken:(NSString *)apnsToken onSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)subscribeNotificationForTrackingNumber:(NSString *)trackingNumber onSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)subscribeNotificationForTrackingNumberArray:(NSArray *)trackingNumberArray onSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)unsubscribeNotificationForTrackingNumber:(NSString *)trackingNumber onSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)unsubscribeNotificationForTrackingNumberArray:(NSArray *)trackingNumberArray onSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 

//philately 
- (void)getStampsOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void)getImagesOfStamp:(Stamp*)stamp onSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 

//misc 
- (void)getMaintananceStatusOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 

//feedback 
- (void)postFeedbackMessage:(NSString *)message subject:(NSString *)subject onSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 

//App update checking 
- (void)checkAppUpdateWithAppVer:(NSString *)appVer andOSVer:(NSString *)osVer; 

//Ad Banner 
-(void) getAdvertisementWithId : (NSString *)locationMasterId Count:(NSString *)count onSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
-(void) incrementClickCountWithId: (NSString *)locationId onSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 

//Tracking Labeling 
- (void) facebookLoginOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void) isFirstTime:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void) registerTrackingNunmbers: (NSArray *)numbers WithLabels : (NSArray *)labels TrackDetails : (NSArray *) details onSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void) registerTrackingNunmbersNew: (NSArray *)numbers WithLabels : (NSArray *)labels TrackDetails : (RLMResults *) details onSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void) getAllTrackingNunmbersOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 
- (void) deleteAllTrackingNunmbersOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure; 


@property (nonatomic) NSString * serverToken; 
@property (nonatomic,retain) RLMResults * allTrackingItem; 
@property (nonatomic,retain) NSString * fbToken; 
@property (nonatomic,retain) NSString * fbID; 

@property (nonatomic, readonly) BOOL hasRegisteredProfileId; 
@property (nonatomic) NSString *notificationProfileID; 

@end 

Top line of My ApiClient.m

#import "ApiClient.h" 
#import "EntityLocation.h" 
#import "Stamp.h" 
#import <SSKeychain.h> 
#import "UIAlertView+Blocks.h" 
#import "NSDictionary+Additions.h" 
#import <sys/sysctl.h> 
#import "DeliveryStatus.h" 
#import "Parcel.h" 

#import <AFNetworking/AFNetworking.h> 

@implementation ApiClient 
@synthesize serverToken; 
@synthesize fbToken; 
@synthesize allTrackingItem; 
@synthesize fbID; 

@synthesize notificationProfileID = _notificationProfileID; 

static BOOL isProduction = YES; 
static BOOL isScanner = YES; 
static BOOL isWithoutFacebook = NO; 

+(BOOL)isScanner { 
    return isScanner; 
} 

+(BOOL)isWithoutFacebook { 
    return isWithoutFacebook; 
} 

#define SINGPOST_BASE_URL (isProduction ? SINGPOST_PRODUCTION_BASE_URL:SINGPOST_UAT_BASE_URL) 
#define CMS_BASE_URL  (isProduction ? CMS_PRODUCTION_BASE_URL:CMS_UAT_BASE_URL) 
#define CMS_BASE_URL_V4  (isProduction ? CMS_PRODUCTION_BASE_URL_V4:CMS_UAT_BASE_URL_V4) 
#define AD_BASE_URL   (isProduction ? AD_PRODUCTION_BASE_URL : AD_UAT_BASE_URL) 

//Development 
static NSString *const SINGPOST_UAT_BASE_URL = @"https://uatesb1.singpost.com"; 
static NSString *const CMS_UAT_BASE_URL = @"http://27.109.106.170/mobile2/"; 
static NSString *const CMS_UAT_BASE_URL_V4 = @"http://27.109.106.170/mobile2/v5/"; 
static NSString *const AD_UAT_BASE_URL = @"https://uat.mysam.sg/restful-services/advertisementServices/"; 

//Production 
static NSString *const SINGPOST_PRODUCTION_BASE_URL = @"https://prdesb1.singpost.com"; 
static NSString *const CMS_PRODUCTION_BASE_URL = @"http://mobile.singpost.com/mobile2/"; 
static NSString *const CMS_PRODUCTION_BASE_URL_V4 = @"http://mobile.singpost.com/mobile2/v5/"; 
static NSString *const AD_PRODUCTION_BASE_URL = @"https://www.mysam.sg/restful-services/advertisementServices/"; 

static NSString *const APP_ID = @"M00002"; 
static NSString *const OS = @"ios"; 

//Tracking testing URL 
//static NSString * const TRACKING_TEST_URL = @"https://prdesb1.singpost.com/ma/GetItemTrackingDetailsCentralTnT"; 
//static NSString * const TRACKING_TEST_URL = @"https://uatesb1.singpost.com/ma/GetItemTrackingDetailsCentralTnT"; 

#pragma mark - Shared singleton instance 

+ (ApiClient *)sharedInstance { 
    static ApiClient *sharedInstance = nil; 
    static dispatch_once_t oncePredicate; 
    dispatch_once(&oncePredicate, ^{ 
     sharedInstance = [[self alloc] initWithBaseURL:[NSURL URLWithString:SINGPOST_BASE_URL]]; 
    }); 

    return sharedInstance; 
} 

- (id)initWithBaseURL:(NSURL *)url 
{ 
    if ((self = [super initWithBaseURL:url])) { 
     [AFJSONRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"text/html"]]; 
    } 

    return self; 
} 

#pragma mark - Properties 

- (BOOL)hasRegisteredProfileId 
{ 
    return [[self notificationProfileID] length] > 0; 
} 

- (NSString *)notificationProfileID 
{ 
    if (!_notificationProfileID) { 
     _notificationProfileID = [SSKeychain passwordForService:KEYCHAIN_SERVICENAME account:@"SETTINGS_PROFILEID"]; 
    } 
    return _notificationProfileID; 
} 

- (void)setNotificationProfileID:(NSString *)inNotificationProfileID 
{ 
    if (inNotificationProfileID.length > 0) { 
     _notificationProfileID = inNotificationProfileID; 
     [SSKeychain setPassword:_notificationProfileID forService:KEYCHAIN_SERVICENAME account:@"SETTINGS_PROFILEID"]; 
    } 
} 

und einige meiner ApiClient.m dass Parse Json und XML

#pragma mark - API calls 

#pragma mark - Informations 

- (void)getSingpostContentsOnSuccess:(ApiClientSuccess)success onFailure:(ApiClientFailure)failure { 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"singpost-contents.php" 
                       relativeToURL:[NSURL URLWithString:CMS_BASE_URL]]]; 
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
     if (success) 
      success(JSON); 
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { 
     if (failure) 
      failure(error); 
     [self reportAPIIssueURL:[request.URL absoluteString] payload:nil message:[error description]]; 
    }]; 
    [self enqueueHTTPRequestOperation:operation]; 
} 

für xml:

#pragma mark - Calculate Postage 

- (void)calculateSingaporePostageForFromPostalCode:(NSString *)fromPostalCode 
            andToPostalCode:(NSString *)toPostalCode 
             andWeight:(NSString *)weightInGrams 
             onSuccess:(ApiClientSuccess)success 
             onFailure:(ApiClientFailure)failure { 
    NSString *xml = [NSString stringWithFormat:@"<SingaporePostalInfoDetailsRequest xmlns=\"http://singpost.com/paw/ns\">" 
        "<ToPostalCode>%@</ToPostalCode>" 
        "<FromPostalCode>%@</FromPostalCode>" 
        "<Weight>%@</Weight>" 
        "<DeliveryServiceName></DeliveryServiceName>" 
        "</SingaporePostalInfoDetailsRequest>", toPostalCode, fromPostalCode, weightInGrams]; 

    NSMutableURLRequest *request = [self requestWithMethod:@"POST" path:@"ma/FilterSingaporePostalInfo" parameters:nil]; 
    [request addValue:@"application/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
    [request addValue:[NSString stringWithFormat:@"%ld", [xml length]] forHTTPHeaderField:@"Content-Length"]; 
    [request setHTTPBody:[xml dataUsingEncoding:NSUTF8StringEncoding]]; 

    AFRaptureXMLRequestOperation *operation = [AFRaptureXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, RXMLElement *XMLElement) { 
     if (success) 
      success(XMLElement); 
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, RXMLElement *XMLElement) { 
     if (failure) 
      failure(error); 
     [self reportAPIIssueURL:[request.URL absoluteString] payload:xml message:[error description]]; 
    }]; 

    [self enqueueHTTPRequestOperation:operation]; 
} 
+0

Wir haben einige der Probleme in http://stackoverflow.com/ skizzierte a/38574520/1271826. Ich denke, du musst selbst einen Stich machen. Wir helfen Ihnen gerne weiter, wenn Sie Probleme haben, wir sind wirklich, aber wir sind nicht hier, um Ihren Code für Sie zu schreiben. Also, machen Sie einen Schritt nach dem anderen, finden Sie heraus, wie Sie eine Anfrage in AFNetworking 3.x machen können. Dann finde heraus, wie man 'NSXMLParser' verwendet. Etc. Aber diese Frage ist zu weit wie es jetzt steht. – Rob

+0

Danke für Ihre Hilfe. Ich probiere es immer noch in der Vorlage von AFNetworking 3.x. Die Klassenverwendung ist AFURLSessionManager anstelle von AFTHTPSesssionManager. Wann man jedes benutzt. Ich habe eine Frage in Bezug auf diese http://stackoverflow.com/questions/38602385/afnetworking-3-x-what-is-the-different-between-afhttpessionmanager-and-furlses –

Antwort

1

Ich würde vorschlagen, TABXML für XML-Parsing zu verwenden, da es der schnellere ist. Dies ist die API github Verbindung TBXML Parser

Dies ist eine Funktion, die ich verwendet, um XML-Daten mit TBXML Parser zu bekommen, kann es Ihnen helfen, mehr zu verstehen. u brauchen nur

#import "TBXML+HTTP.h" 
#import "TBXML.h" 


-(void)loadnews:(TBXMLElement *)element{ 

    TBXMLElement *item = [TBXML childElementNamed:@"item" parentElement:element]; 

    do { 
     TBXMLElement *titre = [TBXML childElementNamed:@"title" parentElement:item]; 
     TBXMLElement *desc = [TBXML childElementNamed:@"description" parentElement:item]; 





     TBXMLElement *imgitem = [TBXML childElementNamed:@"enclosure" parentElement:item]; 


     News *myitem=[[News alloc] init]; 
     myitem.titre=[TBXML textForElement:titre]; 
     myitem.desc=[TBXML textForElement:desc]; 


     if(imgitem){ 
      myitem.img=[TBXML valueOfAttributeNamed:@"url" forElement:imgitem]; 

     } 
     else { 
      [email protected]"noimg"; 

     } 












     [self.mytabnews addObject:myitem]; 



    } while ((item = item->nextSibling)); 

    //[self.tablenews performSelectorOnMainThread:@selector(reloadData) 
    //  withObject:nil 
    // waitUntilDone:NO];} 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.tablenews reloadData]; 
    }); 
} 

Und für Json Parsing mit AFnetworking 3.x importieren diese Funktion können Sie helfen:

-(void) loadevents{ 

     NSString *path = @"yourapilinkhere"; 
     NSString *escapedPath = [path stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; 

     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 



[manager GET:escapedPath parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) { 
      //NSLog(@"JSON: %@", responseObject); 
    }]; 
+0

Vielen Dank für Ihre Informationen. Ich versuche deine. Wissen Sie, wie XML-Anfrage zu senden und XML-Antwort mit AFNetworking 3.x wie in dieser Frage http://stackoverflow.com/questions/38596162/send-post-request-with-xml-body-and-recieve-xml erhalten -Antwort-mit-afnetworking-3-x –