Lag din egen webtjeneste for en iOS-app, del tre

I del en av seriene våre om hvordan du oppretter webtjenesteendend for iGlobe-appen, opprettet vi webdatabasen, webtjenesteendenden og iOS-frontend (Storyboard). Del to fokuserte på å koble til nettjenesten og hente faktiske data. Nå vil du se hvordan du lager koder, som er det brukerne vil bytte ut for å vinne poeng. Noen av disse metodene bruker vi senere i opplæringen. I denne delen av iOS6 / iOS7-veiledningen vil vi fokusere på å lage et digitalt objekt (dvs. koder) som skal utveksles.

For å opprette tagger, må vi ha en klasse for å inneholde taginformasjonen vår. Så lag en ny NSObject underklasse kalt Tag og utforsk dens .h-fil:

 #import @interface Tag: NSObject {NSNumber * rglatitude; NSNumber * rglongitude; NSString * originUdid; NSString * destintyUdid; NSString * rgcountry; NSString * avsender; NSString * mottaker; } @ eiendom (ikke-atomisk, kopi) NSString * destintyUdid; @ eiendom (ikke-atomisk, kopi) NSNumber * rglatitude; @ eiendom (ikke-atomisk, kopi) NSNumber * rglongitude; @ eiendom (ikke-atomisk, kopi) NSString * originUdid; @ eiendom (ikke-atomisk, kopi) NSString * rgcountry; @ eiendom (ikke-atomisk, kopi) NSString * avsender; @ eiendom (ikke-atomisk, kopi) NSString * mottaker; - (id) initWithOriginUdid: (NSString *) oudid rglatitude: (NSNumber *) lati rglongitude: (NSNumber *) longi; - (id) initWithSender: (NSString *) senderi receiver: (NSString *) receiveri rglatitude: (NSNumber *) lati rglongitude: (NSNumber *) longi rgcountry: (NSString *) rgcountri; - (id) initWithOriginUdid: (NSString *) oudid destintyUdid: (NSString *) dudid rglatitude: (NSNumber *) lati rglongitude: (NSNumber *) longi rgcountry: (NSString *) rgcountri; @slutt 

og dens .m-fil:

 #import "Tag.h" @implementation Tag @synthesize originUdid, destintyUdid, sender, receiver; @synthesize rglatitude, rglongitude, rgcountry; // hittil ubrukte - (id) initWithOriginUdid: (NSString *) oudid rglatitude: (NSNumber *) lati rglongitude: (NSNumber *) longi {NSLog (@ "TAG INIT"); hvis ((self = super init) == null) returnerer null; self.rglatitude = lati; self.rglongitude = longi; self.originUdid = oudid; return self; } - (id) initWithSender: (NSString *) senderi receiver: (NSString *) receiveri rglatitude: (NSNumber *) lati rglongitude: (NSNumber *) longi rgcountry: (NSString *) rgcountri {NSLog (@ "TAG INIT OF TYPE SENDER MOTTAKER "); hvis ((self = super init) == null) returnerer null; self.receiver = receiveri; self.rglatitude = lati; self.rglongitude = longi; self.sender = senderi; self.rgcountry = rgcountri; return self; } - (id) initWithOriginUdid: (NSString *) oudid destintyUdid: (NSString *) dudid rglatitude: (NSNumber *) lati rglongitude: (NSNumber *) longi rgcountry: (NSString *) rgcountri {NSLog (@) TAG IN " hvis ((self = super init) == null) returnerer null; self.destintyUdid = dudid; self.rglatitude = lati; self.rglongitude = longi; self.originUdid = oudid; self.rgcountry = rgcountri; return self; } @slutt 

Dette er koden som vil opprette de individuelle kodene når du ringer dem. Det ideelle stedet å ringe en geotagg er fra en kartvisning, som nettopp er det vi vil lage - en MapViewController. Du finner dens .h-fil nedenfor:

 #import #import #import "SantiappsHelper.h" #import "Tag.h" #import #import "BumpClient.h" @class CLGeocoder; @class ModalViewController; @interface MapViewController: UIViewController {NSMutableData * mottatt_data; UIButton * bumpButton; } @ eiendom (ikke-atomisk, behold) IBOutlet MKMapView * mapView; @ eiendom (ikke-atomisk, beholde) CLGeocoder * reverseGeocoder; @ eiendom (ikke-atomisk, beholde) CLLocationManager * locationManager; @ eiendom (ikke-atomisk, beholde) IBOutlet UIBarButtonItem * getAddressButton; @ eiendom (ikke-atomisk, beholde) IBOutlet UIBarButtonItem * plotMeButton; @ eiendom (ikke-atomisk, beholde) IBOutlet UIButton * kjøpeMoreButton; @ eiendom (ikke-atomisk, beholde) NSArray * allUserTags; @ eiendom (ikke-atomisk, beholde) NSNumber * rglat; @ eiendom (ikke-atomisk, beholde) NSNumber * rglong; @ eiendom (ikke-atomisk, beholde) NSString * postUDID; 
 @ eiendom (ikke-atomisk, beholde) NSDate * postDate; @ eiendom (ikke-atomisk, beholde) NSString * land; @ eiendom (ikke-atomisk, beholde) NSString * post1; @ eiendom (ikke-atomisk, beholde) NSString * post2; @ eiendom (omskriv) BOOL ceroIsSingle; @ eiendom (ikke-atomisk, beholde) Merk * ​​nylig tagg; // iAds @ eiendom (ikke-atomisk, beholde) ADBannerView * adView; @property BOOL bannerIsVisible; // BUMP API @ eiendom (ikke-atomisk, beholde) IBOutlet UIImageView * bumpFourLogo; @ eiendom (ikke-atomisk, beholde) IBOutlet UIBarButtonItem * bumpToConnectButton; - (IBAction) startBumpButtonPress; - (void) postToFacebook; - (IBAction) reverseGeocodeCurrentLocation; - (IBAction) plotMeMethod; - (IBAction) buyMoreSelector; @end #import "MapViewController.h" #import "PlaceMarkViewController.h" #import "MapViewAnnotation.h" #import "ModalViewController.h" #import "InAppPurchaseManager.h" @implementering MapViewController // I app kjøpsmetode - ) buyMoreSelector {InAppPurchaseManager * purchase = InAppPurchaseManager alloc init; kjøpe loadStore; } # pragma CREATE SINGLE OR EXCHANGED TAGS // Utveksler og lager etikett med verdi 2 --- - (IBAction) startBumpButtonPress {self.ceroIsSingle = 1; self configureBump; 
 CLLocation * userLoc = self.mapView.userLocation.location; CLLocationCoordinate2D userCoordinate = userLoc.coordinate; self.rglat = NSNumber numberWithDouble: self.mapView.userLocation.location.coordinate.longitude; self.rglong = NSNumber numberWithDouble: self.mapView.userLocation.location.coordinate.longitude; // få den lagrede NSUserPrefs e-postidentifikator ... NSUserDefaults * prefs = NSUserDefaults standardUserDefaults; NSString * storeUserName = prefs objectForKey: @ "storageUser"; self.newlyTag = Tagg allokering initWithSender: storeUserName mottaker: nil rglatitude: self.rglat rglongitude: self.rglong rgcountry: nil; NSLog (@ "newTag ufullstendig:% @, % @, % @, % @, % @", self.newlyTag.sender, self.newlyTag.rglatitude, self.newlyTag.rglongitude, self.newlyTag.receiver, self.newlyTag .rgcountry); self postToFacebook; } # pragma SOSIALE NETTVERK ELLER PLOT // Plott kodene dine - (IBAction) plotMeMethod {// Når det kalles loop thru array fra vDL og plot ... NSLog (@ "Array allUserTags:% @", self.allUserTags); NSDiction * anEntry; for (anEntry in self.allUserTags) {// opprett en posisjonsvariabel CLLocationCoordinate2D location; location.latitude = anEntry objectForKey: @ "breddegrad" doubleValue; location.longitude = anEntry objectForKey: @ "longitude" doubleValue; // lagt til for å se om lokasjoner skrives ut NSLog (@ "koordlokasjon:% f, % f", location.latitude, location.longitude); // Legg merknaden til kartvisningen vår MapViewAnnotation * newAnnotation = MapViewAnnotation alloc initWithTitle: @ "Tag" andCoordinate: location; self.mapView addAnnotation: newAnnotation; 
 ny merknadsutgivelse; }} - (void) presentLogin {NSLog (@ "login"); NSUserDefaults * prefs = NSUserDefaults standardUserDefaults; if (! prefs stringForKey: @ "storageUser" &&! prefs stringForKey: @ "storagePass") {NSLog (@ "Ingen brukerprefs lagret"); // MEN VENT, før alt dette, kan du slå opp en visningskontroller for brukerregistrering UIStoryboard * sb = UIStoryboard storyboardWithName: @ "Storyboard" bundle: nil; ModalViewController * popupController = sb instantiateViewControllerWithIdentifier: @ "ModalViewController"; self presentViewController: popupController animert: INGEN fullføring: null; } annet {NSString * storageUser = NSString stringWithFormat: @ "Bruker:% @", prefs stringForKey: @ "storageUser"; NSString * storagePass = NSString stringWithFormat: @ "Bruker:% @", prefs stringForKey: @ "storagePass"; UIAlertView * internetAlert = UIAlertView alloc initWithTitle: storageUser melding: storagePass delegat: self CancelButtonTitle: @ "Cancel" otherButtonTitles: @ "Ok", nil; internetAlert show; }} - (void) viewDidAppear: (BOOL) animert {super viewDidAppear: YES; self performSelector: @selector (presentLogin) withObject: nil afterDelay: 1.5; } // Implementere viewDidLoad for å gjøre ytterligere oppsett etter lasting av visningen, typisk fra et nib. 
 - (void) viewDidLoad {super viewDidLoad; self.mapView.delegate = self; self.mapView.showsUserLocation = JA; // FÅ LAGRET BRUKER I BESTILLING TIL LAST-FETCH DATA NSUserDefaults * prefs = NSUserDefaults standardUserDefaults; // sjekk om plassering er aktivert BOOL locationAllowed = CLLocationManager locationServicesEnabled; if (locationAllowed == NO) {UIAlertView * alert = UIAlertView alloc initWithTitle: @ "Location Service Disabled" -melding: @ "For å aktivere på nytt, vennligst gå til Innstillinger og slå på Location Service for denne appen." delegat: nul avbrytButtonTitle: @ "OK" otherButtonTitles: nil; alarmshow; varselutgivelse; } // iAds self.adView = ADBannerView alloc initWithFrame: CGRectZero; self.adView.frame = CGRectOffset (self.adView.frame, 0, -50); self.adView.requiredContentSizeIdentifiers = NSSet setWithObjects: ADBannerContentSizeIdentifierPortrait, ADBannerContentSizeIdentifierLandscape, nil; self.adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifierPortrait; self.view addSubview: self.adView; self.adView.delegate = selv; self.bannerIsVisible = NEI; } #pragma iAd Delegate Methods - (void) bannerViewDidLoadAd: (ADBannerView *) banner {if (! self.bannerIsVisible) { 
 UIView beginAnimations: @ "animateAdBannerOn" -kontekst: NULL; // banner er usynlig nå og flyttet ut av skjermen på 50 px banner.frame = CGRectOffset (banner.frame, 0, 50); UIView commitAnimations; self.bannerIsVisible = JA; }} - (void) bannerView: (ADBannerView *) banner didFailToReceiveAdWithError: (NSError *) error {if (self.bannerIsVisible) {UIView beginAnimations: @ "animateAdBannerOff" context: NULL; // banner er synlig og vi flytter det ut av skjermen på grunn av tilkoblingsproblem banner.frame = CGRectOffset (banner.frame, 0, -50); UIView commitAnimations; self.bannerIsVisible = NEI; }} - (BOOL) bannerViewActionShouldBegin: (ADBannerView *) banner willLeaveApplication: (BOOL) willLeave {NSLog (@ "Bannervisningen begynner en annonsehandling"); BOOL shouldExecuteAction = JA; hvis (! willLeave && shouldExecuteAction) {// stopp alle interaktive prosesser i appen} returner shouldExecuteAction; } - (void) bannerViewActionDidFinish: (ADBannerView *) banner {// gjenoppta alt du har stoppet} - (void) viewDid Unload {super viewDidUnload; self.mapView = null; self.getAddressButton = null; // bumpConn stopBump; } - (void) didReceiveMemoryWarning {// Slipper visningen hvis den ikke har en tilsynsvisning. super didReceiveMemoryWarning; 
 // Slipp lagrede data, bilder osv. Som ikke er i bruk. } #pragma MAPVIEW DELEGATE METOODS - (void) mapView: (MKMapView *) mapView didUpdateUserLocation: (MKUserLocation *) userLocation {// Vi har beliggenhet, gjør din logikk for å stille inn kartområdet her. CLLocationCoordinate2D zoomLocation; zoomLocation = self.mapView.userLocation.coordinate; //NSLog(@"self.ciudad er null - en by ble ikke valgt, ved å bruke% g, % g ", zoomLocation.latitude, zoomLocation.longitude); CLLocationDistance synsDistance = 5000; // 5 kilometer MKCoordinateRegion adjustRegion = MKCoordinateRegionMakeWithDistance (zoomLocation, synligDistans, synligDistans); _mapView setRegion: adjustRegion animated: YES; } - (void) mapView: (MKMapView *) mapView didAddAnnotationViews: (NSArray *) visninger {// vi har mottatt vår nåværende beliggenhet, så aktiver "Get Current Address" -knappen self.getAddressButton setEnabled: YES; } #pragma BUMP METHODS - (void) quickAlert: (NSString *) titleText msgText: (NSString *) msgText {UIAlertView * alert = UIAlertView alloc initWithTitle: titleText message: msgText delegate: nil CancelButtonTitle: " nil; alarmshow; varselutgivelse; } - (void) configureBump {NSLog (@ "configureBump>"); BumpClient configureWithAPIKey: @ "9ed7d2fa665f462eb05d5f87d4c07124" og BrukerID: UIDevice currentDevice name; BumpClient sharedClient setMatchBlock: ^ (BumpChannelID-kanal) {NSLog (@ "Matchet med bruker:% @", BumpClient sharedClient userIDForChannel: channel); BumpClient sharedClient confirmMatch: YES onChannel: channel; }; NSLog (@ "setMatchBlock>"); BumpClient sharedClient setChannelConfirmedBlock: ^ (BumpChannelID-kanal) {NSLog (@ "Kanal med% @ bekreftet.", BumpClient sharedClient userIDForChannel: channel); //1.SEND USERNAME STORED as DATA >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> NSUserDefaults * prefs = NSUserDefaults standardUserDefaults; NSData * moveChunk = NSKeyedArchiver archivedDataWithRootObject: prefs stringForKey: @ "storageUser"; BumpClient sharedClient sendData: moveChunk toChannel: channel; }; NSLog (@ "setChannelConfirmedBlock>"); BumpClient sharedClient setDataReceivedBlock: ^ (BumpChannelID-kanal, NSData * data) {//2.RECEIVE DATA >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> NSString * dataReceived = NSKeyedUnarchiver unarchiveObjectWithData: data; NSLog (@ "Data mottatt fra% @:% @", BumpClient sharedClient userIDForChannel: channel, dataReceived); self quickAlert: @ "Data Got :)" msgText: dataReceived; }; NSLog (@ "setDataReceivedBlock>"); BumpClient sharedClient setConnectionStateChangedBlock: ^ (BOOL tilkoblet) {ifl (tilkoblet) {NSLog (@ "Bump tilkoblet ..."); } else {NSLog (@ "Bump koblet ut ..."); }}; NSLog (@ "setConnectionStateChangedBlock>"); BumpClient sharedClient setBumpEventBlock: ^ (bump_event 
 hendelse) {bytte (hendelse) {sak BUMP_EVENT_BUMP: NSLog (@ "Støt oppdaget."); gå i stykker; sak BUMP_EVENT_NO_MATCH: NSLog (@ "Ingen kamp."); gå i stykker; }}; NSLog (@ "setBumpEventBlock>"); } @slutt 

For å komplettere denne klassen, må du opprette et brukergrensesnitt ved å opprette en scene med underklasse UIViewController og legge til en MapView i den mellom navigasjonslinjen og tabulatorfeltet ( figur A ).

Figur A

Det er på tide å gå gjennom koden trinnvis. Du vil se litt ekstra kode som vi bruker i den endelige delen av denne opplæringen der vi legger til iAds og social.

Husk å legge MapKit og iAdKit til prosjektet i Målinnstillinger | Bygg faser | Koble biblioteker. MapViewController importerer MapKit-rammeverket, SantiappsHelper-klassen, Tag-klassen, iAD-rammeverket og en klasse som heter BumpClient, som er BumpAPI som vi vil legge til senere. I MapViewController bruker vi to nye klasser: InAppPurchaseManager og MapViewAnnotation. Vi bruker ikke klassen InAppPurchaseManager før senere.

La oss dekke klassene vi bruker i denne delen av opplæringen. Først MapViewAnnotation-klassen:

 #import #import @grensesnitt MapViewAnnotasjon: NSObject {NSString * title; CLLocationCoordinate2D-koordinat; } @ eiendom (ikke-atomisk, kopi) NSString * tittel; @ eiendom (ikke-atomisk, leseverdig) CLLocationCoordinate2D-koordinat; - (id) initWithTitle: (NSString *) ttl andCoordinate: (CLLocationCoordinate2D) c2d; @slutt 

og implementeringen ser slik ut:

 #import "MapViewAnnotation.h" @implementation MapViewAnnotation @synthesize title, coordinate; - (id) initWithTitle: (NSString *) ttl andCoordinate: (CLLocationCoordinate2D) c2d {super init; tittel = ttl; koordinat = c2d; return self; } @slutt 

Dette skaper en MKA-merknad ved å underklasse den og legge til en tittel og en faktisk koordinat. Til slutt lager vi en MapViewAnnotation med en tilpasset initialisator.

Følg med for del fire i serien vår.

© Copyright 2021 | pepebotifarra.com