DIY Uber

22
Iter 13 Julio, 2016 Salvador Rodríguez Dávila @srdzdv

Transcript of DIY Uber

Page 1: DIY Uber

Iter13 Julio, 2016

Salvador Rodríguez Dávila @srdzdv

Page 2: DIY Uber

Contenido

1. ¿Por qué iter? 2. Arquitectura 3. frameworks 4. google maps sdk 5. websockets 6. parse 7. openpay

Page 3: DIY Uber

¿Por qué iter?

Precio ecología equidad

Page 4: DIY Uber

Arquitectura

iOSAndroid WebApp

WebSockets

Parse Server

MongoDB

Heroku

Page 5: DIY Uber

frameworks

1. Google Maps SDK 2. Parse 3. PubNub 4. Fabric

Page 6: DIY Uber

CLLocationmanager @autoreleasepool { @try { // Init locationManager to start getting Current position locationManager = [[CLLocationManager alloc] init]; // Set the delegate locationManager.delegate = self; // Request location authorization [locationManager requestAlwaysAuthorization]; [locationManager requestWhenInUseAuthorization]; // Set an accuracy level. locationManager.desiredAccuracy = kCLLocationAccuracyBest; // Specify the type of activity your app is currently performing locationManager.activityType = CLActivityTypeAutomotiveNavigation; // Enable background location updates locationManager.allowsBackgroundLocationUpdates = YES; // Start location updates [locationManager startUpdatingLocation]; } @catch (NSException *exception){ UIAlertController *simpleAlert = [UIAlertController alertControllerWithTitle:@"Iter necesita permisos de ubicación" message:@"Por favor habilita los servicios de ubicación de tu dispositivo para continuar." preferredStyle:UIAlertControllerStyleAlert]; [simpleAlert addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:nil]]; [self presentViewController:simpleAlert animated:YES completion:nil]; } } // autoreleasepool

Inicializar location manager

Page 7: DIY Uber

CLLocationmanager

// This method gets called everytime the device changes geographical position. It updates various global location variables - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations { CLLocation *newLocation = [locations lastObject]; currentLongitud = newLocation.coordinate.longitude; currentLatitude = newLocation.coordinate.latitude; //NSLog(@"Current Position: LONG: %f, LAT: %f", newLocation.coordinate.longitude, newLocation.coordinate.latitude); camera = [GMSCameraPosition cameraWithLatitude:currentLatitude longitude:currentLongitud zoom:15]; greenMarker.position = CLLocationCoordinate2DMake(currentLatitude, currentLongitud); confirmedChoferMarker.position = CLLocationCoordinate2DMake(currentLatitude, currentLongitud); if (currentTrip) { NSDate* eventDate = newLocation.timestamp; NSTimeInterval howRecent = [eventDate timeIntervalSinceNow]; if (fabs(howRecent) < 15.0) { // increase time to more than one second GMSCameraUpdate *locationUpdate = [GMSCameraUpdate setTarget:newLocation.coordinate zoom:15]; [self.mapView animateWithCameraUpdate:locationUpdate]; } } }

did update locations

Page 8: DIY Uber

google maps sdk

• Maps SDK for iOS • Maps Geocoding API • Maps Directions API

Page 9: DIY Uber

google maps sdk// // MainUserViewController.h // ITER // // Created by Salvador Rodriguez on 2/24/16. // Copyright © 2016 Nieu. All rights reserved. //

#import <UIKit/UIKit.h> #import <PubNub/PubNub.h> #import <Parse/Parse.h> #import <ParseUI/ParseUI.h>

@import GoogleMaps;

@interface MainUserViewController : UIViewController <CLLocationManagerDelegate, PNObjectEventListener, PFLogInViewControllerDelegate, PFSignUpViewControllerDelegate, GMSMapViewDelegate, UITextFieldDelegate>

@property (strong, nonatomic) IBOutlet GMSMapView *mapView;

@property (strong, nonatomic) IBOutlet UILabel *viajeEnProgresoStatusLabel; @property (nonatomic) PubNub *clientUser; @property (strong, nonatomic) IBOutlet UIButton *pedirCocheButton; @property (strong, nonatomic) IBOutlet UIImageView *direccionFinalTextViewContainerView; @property (strong, nonatomic) IBOutlet UIView *destinationContainerView;

@property (strong, nonatomic) IBOutlet UITextField *finalAddressTextField; @property (strong, nonatomic) IBOutlet UIButton *updateCurrentLocationButton; @property (strong, nonatomic) IBOutlet UILabel *currentAddressLabel; @property (strong, nonatomic) IBOutlet UIImageView *buscandoCocheCercanoAlert; @property (strong, nonatomic) IBOutlet UIActivityIndicatorView *buscandoCocheSpinner; @property (strong, nonatomic) IBOutlet UIActivityIndicatorView *leftBuscandoCocheSpinner; @property (strong, nonatomic) IBOutlet UIImageView *originAddressContainverView; @property (strong, nonatomic) IBOutlet UIView *originAddressAllContainerView;

@property (strong, nonatomic) IBOutlet UIView *confirmarViajeButtonView;

@property (strong, nonatomic) IBOutlet UIButton *confirmarViajeButton; @property (strong, nonatomic) IBOutlet UIButton *confirmarBacktoMainButton;

@property(strong, nonatomic) NSURLSession *markerSession; @property (strong, nonatomic) IBOutlet UIImageView *tripResumeRiderView;

@end

Page 10: DIY Uber

google maps sdk

- (void)viewDidLoad { // Init Google Maps View self.mapView.delegate = self; // Init Google Maps Camera Object with device's currrent location camera = [GMSCameraPosition cameraWithLatitude:currentLatitude longitude:currentLongitud zoom:14]; // default = 15 [self.mapView setCamera:camera]; // Creates a marker in the center of the map. greenMarker = [[GMSMarker alloc] init]; greenMarker.icon = [UIImage imageNamed:@"centerPositionMapDot"]; greenMarker.map = self.mapView; destinationMarker = [[GMSMarker alloc] init]; // Driver marker init chofer1Marker = [[GMSMarker alloc] init]; chofer1Marker.icon = [UIImage imageNamed:@"basicCarIconBlack"]; chofer1Marker.map = self.mapView; }

Inicializar Mapa y custom markers

Page 11: DIY Uber

google maps sdk

<key>NSLocationAlwaysUsageDescription</key> <string>iter necesita acceso a tu ubicación para poder funcionar correctamente. Gracias.</string> <key>NSLocationWhenInUseUsageDescription</key> <string>iter necesita acceso a tu ubicación para poder funcionar correctamente. Gracias.</string>

Inicializar location manager

info.plist

Page 12: DIY Uber

google maps sdk

// This method receives a 2D coordinte and uses the reverseGeocodeCoordinate to get the street address from the coordinate. // It also updates the userpickup lat & lng global variables - (void)getCurrentUserAddressForCoordinate:(CLLocationCoordinate2D)geoCodeCoordinate { if (debug==1) { NSLog(@"Running %@ '%@'", self.class, NSStringFromSelector(_cmd)); } // Set User long & lat for pickup userPickupLatitude = geoCodeCoordinate.latitude; userPickupLongitud = geoCodeCoordinate.longitude; GMSGeocoder *geocoder = [[GMSGeocoder alloc] init]; [geocoder reverseGeocodeCoordinate:geoCodeCoordinate completionHandler:^(GMSReverseGeocodeResponse *geocodeResponse, NSError *error){ if (!error) { GMSAddress *addressResponse = [geocodeResponse firstResult]; NSArray *addressLineArray = addressResponse.lines; self.riderOriginAddressTextField.text = addressLineArray[0]; [self validateCurrentLocationIsActiveForCity:addressResponse.locality]; } }]; }

google Maps Geocoding API

Page 13: DIY Uber

google maps sdk// NSURL Session config = [NSURLSessionConfiguration defaultSessionConfiguration]; config.URLCache = [[NSURLCache alloc] initWithMemoryCapacity:2 * 1024 * 1024 diskCapacity:10 * 1024 * 1024 diskPath:@"DirectionData"]; self.markerSession = [NSURLSession sessionWithConfiguration:config]; NSString *urlString = [NSString stringWithFormat: @"%@?origin=%f,%f&destination=%f,%f&sensor=true&key=%@", @"https://maps.googleapis.com/maps/api/directions/json", self.originCoordinate.latitude, self.originCoordinate.longitude, self.destinationCoordinate.latitude, self.destinationCoordinate.longitude, [[NSBundle mainBundle] objectForInfoDictionaryKey:@"GMSServerAPIKey"]]; NSURL *directionsURL = [NSURL URLWithString:urlString]; NSURLSessionDataTask *directionsTask = [self.markerSession dataTaskWithURL:directionsURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *e) { NSError *error = nil; jsonDirections = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error]; double distance = [jsonDirections[@"routes"][0][@"legs"][0][@"distance"][@"value"] doubleValue]; double duration = [jsonDirections[@"routes"][0][@"legs"][0][@"duration"][@"value"] doubleValue]; distance = distance*0.001; NSLog(@"DISTANCE IN KILOMETERS: %f", distance); duration = duration*0.0166667; NSLog(@"DURATION IN MINUTES: %f", duration); }];

google Maps directions API

Page 14: DIY Uber

websockets

Información en tiempo real

Page 15: DIY Uber

websockets// Initialize PubNub NSString *pubnubPublishKey = @“pub-key-here"; NSString *pubnubSubscribeKey = @“sub-key-here"; /* Instantiate PubNub */ PNConfiguration *configuration = [PNConfiguration configurationWithPublishKey:pubnubPublishKey subscribeKey:pubnubSubscribeKey]; configuration.keepTimeTokenOnListChange = NO; configuration.catchUpOnSubscriptionRestore = NO; configuration.restoreSubscription = NO; self.client = [PubNub clientWithConfiguration:configuration];

inicializar

Page 16: DIY Uber

websockets#pragma MARK - PUBNUB PUBNUB PUBNUB // PubNub Receive Messages - (void)client:(PubNub *)client didReceiveMessage:(PNMessageResult *)message { // Validate that message comes from driver channel and its recipient is current user. Channel trip confirm if ([message.data.subscribedChannel isEqual:pubnubDriverChannel] && [message.data.message[@"user"] isEqualToString:[PFUser currentUser].objectId]) { NSDictionary *messageTypeReceived = message.data.message; if ([messageTypeReceived[@"message"] isEqualToString:@"onTrip"]) {

// Send Local Notification UILocalNotification *localNotification = [[UILocalNotification alloc] init]; localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:01]; localNotification.alertBody = @"Tu Viaje Iter ha Comenzado. ¡Buen viaje!"; localNotification.timeZone = [NSTimeZone defaultTimeZone]; localNotification.soundName = UILocalNotificationDefaultSoundName;; [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];

[self riderOnTrip]; } else if ([message.data.subscribedChannel isEqual:pubnubCityChannel]) { NSString *receivedLatitudeString = message.data.message[@"lat"]; NSString *receivedLongitudString = message.data.message[@"lng"]; double receivedLatitude = [receivedLatitudeString doubleValue]; double receivedLongitud = [receivedLongitudString doubleValue]; chofer1Marker.position = CLLocationCoordinate2DMake(receivedLatitude, receivedLongitud); }

} }

recibir mensajes

Page 17: DIY Uber

websockets

// Send new destination to Driver [self.clientUser publish:@{@"message": @"rdrNewDestination", @"destinationLat":destinationLatString, @"userDestinationPlace":destinationFormattedAddress, @"destinationLng":destinationLngString} toChannel:pubnubDriverChannel compressed:YES withCompletion:nil];

publicar mensajes

Page 18: DIY Uber

parse

Persistencia Sesiones

base de datos centralizada Restauración de estados

cloud code push notifications

Page 19: DIY Uber

parse

[PFUser logInWithUsernameInBackground:self.usernameTextField.text password:self.passwordTextField.text block:^(PFUser *loggedUser, NSError *error){ if (!error) { NSLog(@"***USER LOGIN SUCCEEDED***"); IterRiderInitialViewController *iterRiderInitialViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"IterRiderInitialViewController"]; [self presentViewController:iterRiderInitialViewController animated:YES completion:nil]; } else { NSLog(@"LOG IN ERROR: %@", error);

} }];

Page 20: DIY Uber

openpay

Page 21: DIY Uber

openpayOPCard *card = [[OPCard alloc]init]; card.holderName = @"Juan Escamilla"; card.number = @"4111111111111111"; card.expirationMonth = @"08"; card.expirationYear = @"19"; card.cvv2 = @"132";

Openpay *openpay = [[Openpay alloc] initWithMerchantId:MERCHANT_ID apyKey:API_KEY isProductionMode:NO]; [openpay createTokenWithCard:card success:^(OPToken *token) {

} failure:^(NSError *error) {

}];

Page 22: DIY Uber