From a8a2d6df88f666902052c8f3cae625c9182b9e7f Mon Sep 17 00:00:00 2001 From: Daryll Herberger Date: Fri, 2 May 2014 16:48:33 -0700 Subject: [PATCH 1/6] Adding logic to rely off of existing lat/long information before the CLGeocoder when resolving an establishment place. Resolves many known-geolocation-to-unknown-address issues. --- .../SPGooglePlacesAutocompletePlace.m | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m index bf8e434..09a03f0 100644 --- a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m +++ b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m @@ -9,6 +9,8 @@ #import "SPGooglePlacesAutocompletePlace.h" #import "SPGooglePlacesPlaceDetailQuery.h" +#import + @interface SPGooglePlacesAutocompletePlace() @property (nonatomic, retain, readwrite) NSString *name; @property (nonatomic, retain, readwrite) NSString *reference; @@ -48,10 +50,37 @@ - (void)resolveEstablishmentPlaceToPlacemark:(SPGooglePlacesPlacemarkResultBlock if (error) { block(nil, nil, error); } else { + if ([placeDictionary objectForKey:@"geometry"]) { + CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(360.0f, 360.0f); + + NSDictionary *location = [[placeDictionary objectForKey:@"geometry"] objectForKey:@"location"]; + + if ([location objectForKey:@"lat"] && [location objectForKey:@"lng"]) { + CGFloat latitude = 360.0f; + CGFloat longitude = 360.0f; + + if ([location objectForKey:@"lat"]) { + latitude = [[location objectForKey:@"lat"] floatValue]; + } + + if ([location objectForKey:@"lng"]) { + longitude = [[location objectForKey:@"lng"] floatValue]; + } + + coordinate = CLLocationCoordinate2DMake(latitude, longitude); + } + + if (CLLocationCoordinate2DIsValid(coordinate)) { + MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:nil]; + block(placemark, self.name, error); + return; + } + } + NSString *addressString = [placeDictionary objectForKey:@"formatted_address"]; - [[self geocoder] geocodeAddressString:addressString completionHandler:^(NSArray *placemarks, NSError *error) { + [geocoder geocodeAddressString:addressString completionHandler:^(NSArray *placemarks, NSError *error) { if (error) { - block(nil, nil, error); + SPPresentAlertViewWithErrorAndTitle(error, @"Could not map selected Place"); } else { CLPlacemark *placemark = [placemarks onlyObject]; block(placemark, self.name, error); From 5adcbe0ef9daa8b82b8ec2801eba1d2390d57780 Mon Sep 17 00:00:00 2001 From: Daryll Herberger Date: Wed, 30 Jul 2014 13:24:59 -0700 Subject: [PATCH 2/6] Updating libaray to use new 'place_id' field, per Google's deprecation warning for 'id' and 'reference' --- .../SPGooglePlacesAutocompletePlace.m | 4 ++-- .../SPGooglePlacesPlaceDetailQuery.h | 2 +- .../SPGooglePlacesPlaceDetailQuery.m | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m index bf8e434..bfd6283 100644 --- a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m +++ b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m @@ -24,7 +24,7 @@ + (SPGooglePlacesAutocompletePlace *)placeFromDictionary:(NSDictionary *)placeDi SPGooglePlacesAutocompletePlace *place = [[[self alloc] init] autorelease]; place.name = [placeDictionary objectForKey:@"description"]; place.reference = [placeDictionary objectForKey:@"reference"]; - place.identifier = [placeDictionary objectForKey:@"id"]; + place.identifier = [placeDictionary objectForKey:@"place_id"]; place.type = SPPlaceTypeFromDictionary(placeDictionary); return place; } @@ -43,7 +43,7 @@ - (CLGeocoder *)geocoder { - (void)resolveEstablishmentPlaceToPlacemark:(SPGooglePlacesPlacemarkResultBlock)block { SPGooglePlacesPlaceDetailQuery *query = [SPGooglePlacesPlaceDetailQuery query]; - query.reference = self.reference; + query.placeIdentifier = self.identifier; [query fetchPlaceDetail:^(NSDictionary *placeDictionary, NSError *error) { if (error) { block(nil, nil, error); diff --git a/SPGooglePlacesAutocomplete/SPGooglePlacesPlaceDetailQuery.h b/SPGooglePlacesAutocomplete/SPGooglePlacesPlaceDetailQuery.h index 0b9aec5..0b48a7b 100644 --- a/SPGooglePlacesAutocomplete/SPGooglePlacesPlaceDetailQuery.h +++ b/SPGooglePlacesAutocomplete/SPGooglePlacesPlaceDetailQuery.h @@ -28,7 +28,7 @@ /*! A textual identifier that uniquely identifies a place, returned from a Place search request. */ -@property (nonatomic, retain) NSString *reference; +@property (nonatomic, retain) NSString *placeIdentifier; /*! Indicates whether or not the Place request came from a device using a location sensor (e.g. a GPS) to determine the location sent in this request. This value must be either true or false. Defaults to YES. diff --git a/SPGooglePlacesAutocomplete/SPGooglePlacesPlaceDetailQuery.m b/SPGooglePlacesAutocomplete/SPGooglePlacesPlaceDetailQuery.m index 558dd9c..a633933 100644 --- a/SPGooglePlacesAutocomplete/SPGooglePlacesPlaceDetailQuery.m +++ b/SPGooglePlacesAutocomplete/SPGooglePlacesPlaceDetailQuery.m @@ -14,7 +14,7 @@ @interface SPGooglePlacesPlaceDetailQuery() @implementation SPGooglePlacesPlaceDetailQuery -@synthesize reference, sensor, key, language, resultBlock; +@synthesize placeIdentifier, sensor, key, language, resultBlock; + (SPGooglePlacesPlaceDetailQuery *)query { return [[[self alloc] init] autorelease]; @@ -37,15 +37,15 @@ - (NSString *)description { - (void)dealloc { [googleConnection release]; [responseData release]; - [reference release]; + [placeIdentifier release]; [key release]; [language release]; [super dealloc]; } - (NSString *)googleURLString { - NSMutableString *url = [NSMutableString stringWithFormat:@"https://maps.googleapis.com/maps/api/place/details/json?reference=%@&sensor=%@&key=%@", - reference, SPBooleanStringForBool(sensor), key]; + NSMutableString *url = [NSMutableString stringWithFormat:@"https://maps.googleapis.com/maps/api/place/details/json?placeid=%@&sensor=%@&key=%@", + placeIdentifier, SPBooleanStringForBool(sensor), key]; if (language) { [url appendFormat:@"&language=%@", language]; } From d5dec5d2a7556fc16e7d013de192f60570d1cba9 Mon Sep 17 00:00:00 2001 From: Daryll Herberger Date: Wed, 8 Oct 2014 14:08:36 -0700 Subject: [PATCH 3/6] Updating SPGooglePlacesAutocompletePlace logic to rely on placeIdentifier instead of the less-reliable geocoder for retrieving additional place detail --- .../SPGooglePlacesAutocompletePlace.m | 45 +++++-------------- 1 file changed, 10 insertions(+), 35 deletions(-) diff --git a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m index 6629d8b..73f0092 100644 --- a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m +++ b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m @@ -43,46 +43,19 @@ - (CLGeocoder *)geocoder { return geocoder; } -- (void)resolveEstablishmentPlaceToPlacemark:(SPGooglePlacesPlacemarkResultBlock)block { +- (void)resolveReferenceIdentifierToPlacemark:(SPGooglePlacesPlacemarkResultBlock)block { SPGooglePlacesPlaceDetailQuery *query = [SPGooglePlacesPlaceDetailQuery query]; query.placeIdentifier = self.identifier; [query fetchPlaceDetail:^(NSDictionary *placeDictionary, NSError *error) { if (error) { block(nil, nil, error); } else { - if ([placeDictionary objectForKey:@"geometry"]) { - CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(360.0f, 360.0f); - - NSDictionary *location = [[placeDictionary objectForKey:@"geometry"] objectForKey:@"location"]; - - if ([location objectForKey:@"lat"] && [location objectForKey:@"lng"]) { - CGFloat latitude = 360.0f; - CGFloat longitude = 360.0f; - - if ([location objectForKey:@"lat"]) { - latitude = [[location objectForKey:@"lat"] floatValue]; - } - - if ([location objectForKey:@"lng"]) { - longitude = [[location objectForKey:@"lng"] floatValue]; - } - - coordinate = CLLocationCoordinate2DMake(latitude, longitude); - } - - if (CLLocationCoordinate2DIsValid(coordinate)) { - MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:nil]; - block(placemark, self.name, error); - return; - } - } - NSString *addressString = [placeDictionary objectForKey:@"formatted_address"]; - [geocoder geocodeAddressString:addressString completionHandler:^(NSArray *placemarks, NSError *error) { + [[self geocoder] geocodeAddressString:addressString completionHandler:^(NSArray *placemarks, NSError *error) { if (error) { - SPPresentAlertViewWithErrorAndTitle(error, @"Could not map selected Place"); + block(nil, nil, error); } else { - CLPlacemark *placemark = [placemarks onlyObject]; + CLPlacemark *placemark = [placemarks firstObject]; block(placemark, self.name, error); } }]; @@ -95,18 +68,20 @@ - (void)resolveGecodePlaceToPlacemark:(SPGooglePlacesPlacemarkResultBlock)block if (error) { block(nil, nil, error); } else { - CLPlacemark *placemark = [placemarks onlyObject]; + CLPlacemark *placemark = [placemarks firstObject]; block(placemark, self.name, error); } }]; } - (void)resolveToPlacemark:(SPGooglePlacesPlacemarkResultBlock)block { - if (type == SPPlaceTypeGeocode) { + if (self.identifier.length > 0) { + // If there is already a Google Place API reference number, there should + // not be a need to attempt to geocode using the (inexact) address. + [self resolveReferenceIdentifierToPlacemark:block]; + } else { // Geocode places already have their address stored in the 'name' field. [self resolveGecodePlaceToPlacemark:block]; - } else { - [self resolveEstablishmentPlaceToPlacemark:block]; } } From ee56da4a2f8cfaa4d72f9de1eb60364027e690a5 Mon Sep 17 00:00:00 2001 From: Daryll Herberger Date: Wed, 12 Nov 2014 16:27:07 -0800 Subject: [PATCH 4/6] Re-adding logic to rely on place detail geometry>location>lat/lng values before falling back to formatted address geocoding. Also improving error reporting and fixing warnings due to type conversion issues and logical errors. --- .../SPGooglePlacesAutocompletePlace.m | 54 ++++++++++++++++--- .../SPGooglePlacesAutocompleteQuery.m | 2 +- .../SPGooglePlacesAutocompleteUtilities.h | 7 +-- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m index 73f0092..24ded8b 100644 --- a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m +++ b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m @@ -50,15 +50,55 @@ - (void)resolveReferenceIdentifierToPlacemark:(SPGooglePlacesPlacemarkResultBloc if (error) { block(nil, nil, error); } else { - NSString *addressString = [placeDictionary objectForKey:@"formatted_address"]; - [[self geocoder] geocodeAddressString:addressString completionHandler:^(NSArray *placemarks, NSError *error) { - if (error) { - block(nil, nil, error); + if (placeDictionary) { + NSString *placeAddress = [placeDictionary objectForKey:@"formatted_address"]; + NSDictionary *placeGeometryDictionary = [placeDictionary objectForKey:@"geometry"]; + NSDictionary *placeLocationDictionary = nil; + NSNumber *latitude = nil; + NSNumber *longitude = nil; + + if (placeGeometryDictionary) { + placeLocationDictionary = [placeGeometryDictionary objectForKey:@"location"]; + } + + if (placeLocationDictionary) { + latitude = [placeLocationDictionary objectForKey:@"lat"]; + longitude = [placeLocationDictionary objectForKey:@"lng"]; + } + + if (latitude && longitude) { + CLLocation *placeLocation = [[CLLocation alloc] initWithLatitude:[latitude doubleValue] longitude:[longitude doubleValue]]; + [[self geocoder] reverseGeocodeLocation:placeLocation completionHandler:^(NSArray *placemarks, NSError *error) { + if (error) { + block(nil, nil, error); + } else { + CLPlacemark *placemark = [placemarks firstObject]; + block(placemark, self.name, error); + } + }]; + } else if (placeAddress) { + [[self geocoder] geocodeAddressString:placeAddress completionHandler:^(NSArray *placemarks, NSError *error) { + if (error) { + block(nil, nil, error); + } else { + CLPlacemark *placemark = [placemarks firstObject]; + block(placemark, self.name, error); + } + }]; } else { - CLPlacemark *placemark = [placemarks firstObject]; - block(placemark, self.name, error); + NSString *errorDomain = [[NSBundle mainBundle] bundleIdentifier]; + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey:NSLocalizedString(@"Could not resolve place.", nil) }; + error = [[NSError alloc] initWithDomain:errorDomain code:-1 userInfo:userInfo]; + + block(nil, self.name, error); } - }]; + } else { + NSString *errorDomain = [[NSBundle mainBundle] bundleIdentifier]; + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey:NSLocalizedString(@"Could not resolve place.", nil) }; + error = [[NSError alloc] initWithDomain:errorDomain code:-1 userInfo:userInfo]; + + block(nil, self.name, error); + } } }]; } diff --git a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteQuery.m b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteQuery.m index 2faf0f1..44c7b04 100644 --- a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteQuery.m +++ b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteQuery.m @@ -53,7 +53,7 @@ - (NSString *)googleURLString { [input stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], SPBooleanStringForBool(sensor), key]; if (offset != NSNotFound) { - [url appendFormat:@"&offset=%u", offset]; + [url appendFormat:@"&offset=%lu", (unsigned long)offset]; } if (location.latitude != -1) { [url appendFormat:@"&location=%f,%f", location.latitude, location.longitude]; diff --git a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteUtilities.h b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteUtilities.h index e10ab95..5829233 100644 --- a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteUtilities.h +++ b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteUtilities.h @@ -11,10 +11,11 @@ @class CLPlacemark; -typedef enum { +typedef NS_ENUM(NSInteger, SPGooglePlacesAutocompletePlaceType) { + SPPlaceTypeUnknown = -1, SPPlaceTypeGeocode = 0, - SPPlaceTypeEstablishment -} SPGooglePlacesAutocompletePlaceType; + SPPlaceTypeEstablishment = 1 +}; typedef void (^SPGooglePlacesPlacemarkResultBlock)(CLPlacemark *placemark, NSString *addressString, NSError *error); typedef void (^SPGooglePlacesAutocompleteResultBlock)(NSArray *places, NSError *error); From ad63207bdf4796db9d260dbc72fcab8f7a8668c0 Mon Sep 17 00:00:00 2001 From: Daryll Herberger Date: Wed, 12 Nov 2014 16:37:01 -0800 Subject: [PATCH 5/6] Updating project to use ARC, fixing remaining project warnings --- Default-568h@2x.png | Bin 0 -> 18594 bytes .../project.pbxproj | 10 +- .../contents.xcworkspacedata | 7 ++ .../SPGooglePlacesAutocomplete.xccheckout | 41 +++++++++ .../UserInterfaceState.xcuserstate | Bin 0 -> 16902 bytes .../WorkspaceSettings.xcsettings | 10 ++ .../SPGooglePlacesAutocomplete.xcscheme | 86 ++++++++++++++++++ .../xcschemes/xcschememanagement.plist | 22 +++++ SPGooglePlacesAutocomplete/AppDelegate.m | 9 +- .../SPGooglePlacesAutocompletePlace.m | 10 +- .../SPGooglePlacesAutocompleteQuery.m | 13 +-- .../SPGooglePlacesAutocompleteUtilities.m | 2 - ...SPGooglePlacesAutocompleteViewController.m | 20 ++-- .../SPGooglePlacesPlaceDetailQuery.m | 13 +-- 14 files changed, 188 insertions(+), 55 deletions(-) create mode 100644 Default-568h@2x.png create mode 100644 SPGooglePlacesAutocomplete.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 SPGooglePlacesAutocomplete.xcodeproj/project.xcworkspace/xcshareddata/SPGooglePlacesAutocomplete.xccheckout create mode 100644 SPGooglePlacesAutocomplete.xcodeproj/project.xcworkspace/xcuserdata/dherberger.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 SPGooglePlacesAutocomplete.xcodeproj/project.xcworkspace/xcuserdata/dherberger.xcuserdatad/WorkspaceSettings.xcsettings create mode 100644 SPGooglePlacesAutocomplete.xcodeproj/xcuserdata/dherberger.xcuserdatad/xcschemes/SPGooglePlacesAutocomplete.xcscheme create mode 100644 SPGooglePlacesAutocomplete.xcodeproj/xcuserdata/dherberger.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/Default-568h@2x.png b/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/SPGooglePlacesAutocomplete.xcodeproj/project.pbxproj b/SPGooglePlacesAutocomplete.xcodeproj/project.pbxproj index 1a2e66f..716eec3 100644 --- a/SPGooglePlacesAutocomplete.xcodeproj/project.pbxproj +++ b/SPGooglePlacesAutocomplete.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 31CA0C591A14344C0082C552 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 31CA0C581A14344C0082C552 /* Default-568h@2x.png */; }; 9C4A632215B64A3F00E15FBA /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C4A632115B64A3F00E15FBA /* UIKit.framework */; }; 9C4A632415B64A3F00E15FBA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C4A632315B64A3F00E15FBA /* Foundation.framework */; }; 9C4A632615B64A3F00E15FBA /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C4A632515B64A3F00E15FBA /* CoreGraphics.framework */; }; @@ -28,6 +29,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 31CA0C581A14344C0082C552 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 9C4A631D15B64A3F00E15FBA /* SPGooglePlacesAutocomplete.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SPGooglePlacesAutocomplete.app; sourceTree = BUILT_PRODUCTS_DIR; }; 9C4A632115B64A3F00E15FBA /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 9C4A632315B64A3F00E15FBA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -76,6 +78,7 @@ 9C4A631215B64A3F00E15FBA = { isa = PBXGroup; children = ( + 31CA0C581A14344C0082C552 /* Default-568h@2x.png */, 9C4A632715B64A3F00E15FBA /* SPGooglePlacesAutocomplete */, 9C4A632015B64A3F00E15FBA /* Frameworks */, 9C4A631E15B64A3F00E15FBA /* Products */, @@ -172,7 +175,7 @@ 9C4A631415B64A3F00E15FBA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0450; + LastUpgradeCheck = 0610; ORGANIZATIONNAME = "Stephen Poletto"; }; buildConfigurationList = 9C4A631715B64A3F00E15FBA /* Build configuration list for PBXProject "SPGooglePlacesAutocomplete" */; @@ -202,6 +205,7 @@ 9C4A63A615B6C01100E15FBA /* location.png in Resources */, 9C4A63A715B6C01100E15FBA /* location@2x.png in Resources */, 9C4A63AE15B6C0DB00E15FBA /* locateButton.png in Resources */, + 31CA0C591A14344C0082C552 /* Default-568h@2x.png in Resources */, 9C4A63AF15B6C0DB00E15FBA /* locateButton@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -258,6 +262,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 6.0; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; @@ -285,6 +290,7 @@ 9C4A633615B64A3F00E15FBA /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_OBJC_ARC = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "SPGooglePlacesAutocomplete/SPGooglePlacesAutocomplete-Prefix.pch"; INFOPLIST_FILE = "SPGooglePlacesAutocomplete/SPGooglePlacesAutocomplete-Info.plist"; @@ -297,6 +303,7 @@ 9C4A633715B64A3F00E15FBA /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_OBJC_ARC = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "SPGooglePlacesAutocomplete/SPGooglePlacesAutocomplete-Prefix.pch"; INFOPLIST_FILE = "SPGooglePlacesAutocomplete/SPGooglePlacesAutocomplete-Info.plist"; @@ -325,6 +332,7 @@ 9C4A633715B64A3F00E15FBA /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/SPGooglePlacesAutocomplete.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/SPGooglePlacesAutocomplete.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..09df3f9 --- /dev/null +++ b/SPGooglePlacesAutocomplete.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/SPGooglePlacesAutocomplete.xcodeproj/project.xcworkspace/xcshareddata/SPGooglePlacesAutocomplete.xccheckout b/SPGooglePlacesAutocomplete.xcodeproj/project.xcworkspace/xcshareddata/SPGooglePlacesAutocomplete.xccheckout new file mode 100644 index 0000000..d9a769f --- /dev/null +++ b/SPGooglePlacesAutocomplete.xcodeproj/project.xcworkspace/xcshareddata/SPGooglePlacesAutocomplete.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 88E4F410-3060-491C-8448-75312C7744AE + IDESourceControlProjectName + SPGooglePlacesAutocomplete + IDESourceControlProjectOriginsDictionary + + 3BAC43AA9CAA0E6DDD799DA562082A4246A801B0 + github.com:vertigo/SPGooglePlacesAutocomplete.git + + IDESourceControlProjectPath + SPGooglePlacesAutocomplete.xcodeproj + IDESourceControlProjectRelativeInstallPathDictionary + + 3BAC43AA9CAA0E6DDD799DA562082A4246A801B0 + ../.. + + IDESourceControlProjectURL + github.com:vertigo/SPGooglePlacesAutocomplete.git + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + 3BAC43AA9CAA0E6DDD799DA562082A4246A801B0 + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 3BAC43AA9CAA0E6DDD799DA562082A4246A801B0 + IDESourceControlWCCName + SPGooglePlacesAutocomplete + + + + diff --git a/SPGooglePlacesAutocomplete.xcodeproj/project.xcworkspace/xcuserdata/dherberger.xcuserdatad/UserInterfaceState.xcuserstate b/SPGooglePlacesAutocomplete.xcodeproj/project.xcworkspace/xcuserdata/dherberger.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..76f1fc1f49d245ee30eacd0b8876619d18036669 GIT binary patch literal 16902 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 Xj4CJ(q(+G2#81ft@iX+h;EMkTRwzyR literal 0 HcmV?d00001 diff --git a/SPGooglePlacesAutocomplete.xcodeproj/project.xcworkspace/xcuserdata/dherberger.xcuserdatad/WorkspaceSettings.xcsettings b/SPGooglePlacesAutocomplete.xcodeproj/project.xcworkspace/xcuserdata/dherberger.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..659c876 --- /dev/null +++ b/SPGooglePlacesAutocomplete.xcodeproj/project.xcworkspace/xcuserdata/dherberger.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,10 @@ + + + + + HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges + + SnapshotAutomaticallyBeforeSignificantChanges + + + diff --git a/SPGooglePlacesAutocomplete.xcodeproj/xcuserdata/dherberger.xcuserdatad/xcschemes/SPGooglePlacesAutocomplete.xcscheme b/SPGooglePlacesAutocomplete.xcodeproj/xcuserdata/dherberger.xcuserdatad/xcschemes/SPGooglePlacesAutocomplete.xcscheme new file mode 100644 index 0000000..6405a57 --- /dev/null +++ b/SPGooglePlacesAutocomplete.xcodeproj/xcuserdata/dherberger.xcuserdatad/xcschemes/SPGooglePlacesAutocomplete.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SPGooglePlacesAutocomplete.xcodeproj/xcuserdata/dherberger.xcuserdatad/xcschemes/xcschememanagement.plist b/SPGooglePlacesAutocomplete.xcodeproj/xcuserdata/dherberger.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..58677dc --- /dev/null +++ b/SPGooglePlacesAutocomplete.xcodeproj/xcuserdata/dherberger.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + SPGooglePlacesAutocomplete.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 9C4A631C15B64A3F00E15FBA + + primary + + + + + diff --git a/SPGooglePlacesAutocomplete/AppDelegate.m b/SPGooglePlacesAutocomplete/AppDelegate.m index dd1f14a..48362af 100644 --- a/SPGooglePlacesAutocomplete/AppDelegate.m +++ b/SPGooglePlacesAutocomplete/AppDelegate.m @@ -14,18 +14,13 @@ @implementation AppDelegate @synthesize window; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; + self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; - SPGooglePlacesAutocompleteViewController *viewController = [[[SPGooglePlacesAutocompleteViewController alloc] init] autorelease]; + SPGooglePlacesAutocompleteViewController *viewController = [[SPGooglePlacesAutocompleteViewController alloc] init]; self.window.rootViewController = viewController; [self.window makeKeyAndVisible]; return YES; } -- (void)dealloc { - [window release]; - [super dealloc]; -} - @end diff --git a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m index 24ded8b..74f8dac 100644 --- a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m +++ b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompletePlace.m @@ -23,7 +23,7 @@ @implementation SPGooglePlacesAutocompletePlace @synthesize name, reference, identifier, type; + (SPGooglePlacesAutocompletePlace *)placeFromDictionary:(NSDictionary *)placeDictionary { - SPGooglePlacesAutocompletePlace *place = [[[self alloc] init] autorelease]; + SPGooglePlacesAutocompletePlace *place = [[self alloc] init]; place.name = [placeDictionary objectForKey:@"description"]; place.reference = [placeDictionary objectForKey:@"reference"]; place.identifier = [placeDictionary objectForKey:@"place_id"]; @@ -125,12 +125,4 @@ - (void)resolveToPlacemark:(SPGooglePlacesPlacemarkResultBlock)block { } } -- (void)dealloc { - [name release]; - [reference release]; - [identifier release]; - [geocoder release]; - [super dealloc]; -} - @end diff --git a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteQuery.m b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteQuery.m index 44c7b04..2a526fe 100644 --- a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteQuery.m +++ b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteQuery.m @@ -18,7 +18,7 @@ @implementation SPGooglePlacesAutocompleteQuery @synthesize input, sensor, key, offset, location, radius, language, types, resultBlock; + (SPGooglePlacesAutocompleteQuery *)query { - return [[[self alloc] init] autorelease]; + return [[self alloc] init]; } - (id)init { @@ -39,15 +39,6 @@ - (NSString *)description { return [NSString stringWithFormat:@"Query URL: %@", [self googleURLString]]; } -- (void)dealloc { - [googleConnection release]; - [responseData release]; - [input release]; - [key release]; - [language release]; - [super dealloc]; -} - - (NSString *)googleURLString { NSMutableString *url = [NSMutableString stringWithFormat:@"https://maps.googleapis.com/maps/api/place/autocomplete/json?input=%@&sensor=%@&key=%@", [input stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], @@ -71,8 +62,6 @@ - (NSString *)googleURLString { } - (void)cleanup { - [googleConnection release]; - [responseData release]; googleConnection = nil; responseData = nil; self.resultBlock = nil; diff --git a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteUtilities.m b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteUtilities.m index 894e743..7335ff2 100644 --- a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteUtilities.m +++ b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteUtilities.m @@ -32,7 +32,6 @@ BOOL SPEnsureGoogleAPIKey() { userHasProvidedAPIKey = NO; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"API Key Needed" message:@"Please replace kGoogleAPIKey with your Google API key." delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil]; [alert show]; - [alert release]; } return userHasProvidedAPIKey; } @@ -40,7 +39,6 @@ BOOL SPEnsureGoogleAPIKey() { void SPPresentAlertViewWithErrorAndTitle(NSError *error, NSString *title) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil]; [alert show]; - [alert release]; } extern BOOL SPIsEmptyString(NSString *string) { diff --git a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteViewController.m b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteViewController.m index d959b89..7f6da4f 100644 --- a/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteViewController.m +++ b/SPGooglePlacesAutocomplete/SPGooglePlacesAutocompleteViewController.m @@ -36,13 +36,6 @@ - (void)viewDidUnload { [super viewDidUnload]; } -- (void)dealloc { - [selectedPlaceAnnotation release]; - [mapView release]; - [searchQuery release]; - [super dealloc]; -} - - (IBAction)recenterMapToUserLocation:(id)sender { MKCoordinateRegion region; MKCoordinateSpan span; @@ -71,7 +64,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N static NSString *cellIdentifier = @"SPGooglePlacesAutocompleteCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (!cell) { - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease]; + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } cell.textLabel.font = [UIFont fontWithName:@"GillSans" size:16.0]; @@ -97,7 +90,6 @@ - (void)recenterMapToPlacemark:(CLPlacemark *)placemark { - (void)addPlacemarkAnnotationToMap:(CLPlacemark *)placemark addressString:(NSString *)address { [self.mapView removeAnnotation:selectedPlaceAnnotation]; - [selectedPlaceAnnotation release]; selectedPlaceAnnotation = [[MKPointAnnotation alloc] init]; selectedPlaceAnnotation.coordinate = placemark.location.coordinate; @@ -137,12 +129,16 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath - (void)handleSearchForSearchString:(NSString *)searchString { searchQuery.location = self.mapView.userLocation.coordinate; searchQuery.input = searchString; + + __weak SPGooglePlacesAutocompleteViewController *weakSelf = self; + [searchQuery fetchPlaces:^(NSArray *places, NSError *error) { + __strong SPGooglePlacesAutocompleteViewController *strongSelf = weakSelf; + if (error) { SPPresentAlertViewWithErrorAndTitle(error, @"Could not fetch Places"); } else { - [searchResultPlaces release]; - searchResultPlaces = [places retain]; + strongSelf->searchResultPlaces = places; [self.searchDisplayController.searchResultsTableView reloadData]; } }]; @@ -193,7 +189,7 @@ - (MKAnnotationView *)mapView:(MKMapView *)mapViewIn viewForAnnotation:(id Date: Wed, 12 Nov 2014 16:40:13 -0800 Subject: [PATCH 6/6] Standardizing error domain and codes with other NSError instances used in the project --- .../UserInterfaceState.xcuserstate | Bin 16902 -> 19417 bytes .../SPGooglePlacesAutocompletePlace.m | 6 ++---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/SPGooglePlacesAutocomplete.xcodeproj/project.xcworkspace/xcuserdata/dherberger.xcuserdatad/UserInterfaceState.xcuserstate b/SPGooglePlacesAutocomplete.xcodeproj/project.xcworkspace/xcuserdata/dherberger.xcuserdatad/UserInterfaceState.xcuserstate index 76f1fc1f49d245ee30eacd0b8876619d18036669..8b44429d7afd7d68d9841d29cda41a4596ea3bf5 100644 GIT binary patch delta 10539 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 SN61yk18!gaZ^L(bi~j=y>}Br& delta 9424 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