diff options
author | matthew <matthew> | 2008-12-02 15:28:39 +0000 |
---|---|---|
committer | matthew <matthew> | 2008-12-02 15:28:39 +0000 |
commit | ab85d92dfb86387c2e054c32e387f4d940c69098 (patch) | |
tree | 32e0f94b2ad17cb6c95fa222b6f816aab5d2d1fe | |
parent | cfa458edaa2c599aec5deaa9f0104d8c71528554 (diff) |
Show nice alert error if no network when reporting problem, or if user denies location fetch
-rw-r--r-- | iphone/FixMyStreet/Classes/FixMyStreetAppDelegate.m | 10 | ||||
-rw-r--r-- | iphone/FixMyStreet/Classes/InputTableViewController.h | 2 | ||||
-rw-r--r-- | iphone/FixMyStreet/Classes/InputTableViewController.m | 5 | ||||
-rwxr-xr-x | iphone/FixMyStreet/Classes/Reachability.h | 122 | ||||
-rwxr-xr-x | iphone/FixMyStreet/Classes/Reachability.m | 585 | ||||
-rw-r--r-- | iphone/FixMyStreet/FixMyStreet.xcodeproj/matthew.mode1v3 | 105 | ||||
-rw-r--r-- | iphone/FixMyStreet/FixMyStreet.xcodeproj/matthew.pbxuser | 975 | ||||
-rwxr-xr-x | iphone/FixMyStreet/FixMyStreet.xcodeproj/project.pbxproj | 46 | ||||
-rwxr-xr-x | iphone/FixMyStreet/Icon.png | bin | 10233 -> 2051 bytes | |||
-rw-r--r-- | iphone/FixMyStreet/MainViewController.xib | 2 | ||||
-rwxr-xr-x | iphone/FixMyStreet/MyCLController.h | 2 | ||||
-rwxr-xr-x | iphone/FixMyStreet/MyCLController.m | 3 |
12 files changed, 1691 insertions, 166 deletions
diff --git a/iphone/FixMyStreet/Classes/FixMyStreetAppDelegate.m b/iphone/FixMyStreet/Classes/FixMyStreetAppDelegate.m index 8ad133ac8..611acedf5 100644 --- a/iphone/FixMyStreet/Classes/FixMyStreetAppDelegate.m +++ b/iphone/FixMyStreet/Classes/FixMyStreetAppDelegate.m @@ -8,6 +8,7 @@ #import "FixMyStreetAppDelegate.h" #import "InputTableViewController.h" +#import "Reachability.h" @implementation FixMyStreetAppDelegate @@ -103,6 +104,15 @@ // Report stuff -(void)uploadReport { + // Check internet connection status + NetworkStatus internetConnectionStatus = [[Reachability sharedReachability] internetConnectionStatus]; + if (internetConnectionStatus == NotReachable) { + UIAlertView *v = [[UIAlertView alloc] initWithTitle:@"Reporting failed" message:@"You need to be connected to the internet to report a problem." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; + [v show]; + [v release]; + return; + } + [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; uploading = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; diff --git a/iphone/FixMyStreet/Classes/InputTableViewController.h b/iphone/FixMyStreet/Classes/InputTableViewController.h index a7b994676..effeafab5 100644 --- a/iphone/FixMyStreet/Classes/InputTableViewController.h +++ b/iphone/FixMyStreet/Classes/InputTableViewController.h @@ -38,6 +38,6 @@ //MyCLControllerDelegate -(void)newLocationUpdate:(CLLocation *)location; --(void)newError:(NSString *)text; +-(void)newLocationError:(NSString *)text; @end diff --git a/iphone/FixMyStreet/Classes/InputTableViewController.m b/iphone/FixMyStreet/Classes/InputTableViewController.m index 0ac2b693b..3ad127c58 100644 --- a/iphone/FixMyStreet/Classes/InputTableViewController.m +++ b/iphone/FixMyStreet/Classes/InputTableViewController.m @@ -289,7 +289,10 @@ [self enableSubmissionButton]; } --(void)newError:(NSString *)text { +-(void)newLocationError:(NSString *)text { + UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Location required" message:text delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; + [alert show]; + [alert release]; } // Buttons diff --git a/iphone/FixMyStreet/Classes/Reachability.h b/iphone/FixMyStreet/Classes/Reachability.h new file mode 100755 index 000000000..18beaea3e --- /dev/null +++ b/iphone/FixMyStreet/Classes/Reachability.h @@ -0,0 +1,122 @@ +/* + +File: Reachability.h +Abstract: SystemConfiguration framework wrapper. + +Version: 1.5 + +Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc. +("Apple") in consideration of your agreement to the following terms, and your +use, installation, modification or redistribution of this Apple software +constitutes acceptance of these terms. If you do not agree with these terms, +please do not use, install, modify or redistribute this Apple software. + +In consideration of your agreement to abide by the following terms, and subject +to these terms, Apple grants you a personal, non-exclusive license, under +Apple's copyrights in this original Apple software (the "Apple Software"), to +use, reproduce, modify and redistribute the Apple Software, with or without +modifications, in source and/or binary forms; provided that if you redistribute +the Apple Software in its entirety and without modifications, you must retain +this notice and the following text and disclaimers in all such redistributions +of the Apple Software. +Neither the name, trademarks, service marks or logos of Apple Inc. may be used +to endorse or promote products derived from the Apple Software without specific +prior written permission from Apple. Except as expressly stated in this notice, +no other rights or licenses, express or implied, are granted by Apple herein, +including but not limited to any patent rights that may be infringed by your +derivative works or by other works in which the Apple Software may be +incorporated. + +The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO +WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED +WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN +COMBINATION WITH YOUR PRODUCTS. + +IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR +DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF +CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF +APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Copyright (C) 2008 Apple Inc. All Rights Reserved. + +*/ + +#import <UIKit/UIKit.h> +#import <SystemConfiguration/SystemConfiguration.h> + +@class Reachability; + +@interface Reachability : NSObject { + +@private + BOOL _networkStatusNotificationsEnabled; + + NSString *_hostName; + NSString *_address; + + NSMutableDictionary *_reachabilityQueries; +} + +/* + An enumeration that defines the return values of the network state + of the device. + */ +typedef enum { + NotReachable = 0, + ReachableViaCarrierDataNetwork, + ReachableViaWiFiNetwork +} NetworkStatus; + + +// Set to YES to register for changes in network status. Otherwise reachability queries +// will be handled synchronously. +@property BOOL networkStatusNotificationsEnabled; +// The remote host whose reachability will be queried. +// Either this or 'addressName' must be set. +@property (nonatomic, retain) NSString *hostName; +// The IP address of the remote host whose reachability will be queried. +// Either this or 'hostName' must be set. +@property (nonatomic, retain) NSString *address; +// A cache of ReachabilityQuery objects, which encapsulate a SCNetworkReachabilityRef, a host or address, and a run loop. The keys are host names or addresses. +@property (nonatomic, assign) NSMutableDictionary *reachabilityQueries; + +// This class is intended to be used as a singleton. ++ (Reachability *)sharedReachability; + +// Is self.hostName is not nil, determines its reachability. +// If self.hostName is nil and self.address is not nil, determines the reachability of self.address. +- (NetworkStatus)remoteHostStatus; +// Is the device able to communicate with Internet hosts? If so, through which network interface? +- (NetworkStatus)internetConnectionStatus; +// Is the device able to communicate with hosts on the local WiFi network? (Typically these are Bonjour hosts). +- (NetworkStatus)localWiFiConnectionStatus; + +/* + When reachability change notifications are posted, the callback method 'ReachabilityCallback' is called + and posts a notification that the client application can observe to learn about changes. + */ +static void ReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void *info); + +@end + +@interface ReachabilityQuery : NSObject +{ +@private + SCNetworkReachabilityRef _reachabilityRef; + CFMutableArrayRef _runLoops; + NSString *_hostNameOrAddress; +} +// Keep around each network reachability query object so that we can +// register for updates from those objects. +@property (nonatomic) SCNetworkReachabilityRef reachabilityRef; +@property (nonatomic, retain) NSString *hostNameOrAddress; +@property (nonatomic) CFMutableArrayRef runLoops; + +- (void)scheduleOnRunLoop:(NSRunLoop *)inRunLoop; + +@end + diff --git a/iphone/FixMyStreet/Classes/Reachability.m b/iphone/FixMyStreet/Classes/Reachability.m new file mode 100755 index 000000000..c1f159c55 --- /dev/null +++ b/iphone/FixMyStreet/Classes/Reachability.m @@ -0,0 +1,585 @@ +/* + +File: Reachability.m +Abstract: SystemConfiguration framework wrapper. + +Version: 1.5 + +Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc. +("Apple") in consideration of your agreement to the following terms, and your +use, installation, modification or redistribution of this Apple software +constitutes acceptance of these terms. If you do not agree with these terms, +please do not use, install, modify or redistribute this Apple software. + +In consideration of your agreement to abide by the following terms, and subject +to these terms, Apple grants you a personal, non-exclusive license, under +Apple's copyrights in this original Apple software (the "Apple Software"), to +use, reproduce, modify and redistribute the Apple Software, with or without +modifications, in source and/or binary forms; provided that if you redistribute +the Apple Software in its entirety and without modifications, you must retain +this notice and the following text and disclaimers in all such redistributions +of the Apple Software. +Neither the name, trademarks, service marks or logos of Apple Inc. may be used +to endorse or promote products derived from the Apple Software without specific +prior written permission from Apple. Except as expressly stated in this notice, +no other rights or licenses, express or implied, are granted by Apple herein, +including but not limited to any patent rights that may be infringed by your +derivative works or by other works in which the Apple Software may be +incorporated. + +The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO +WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED +WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN +COMBINATION WITH YOUR PRODUCTS. + +IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR +DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF +CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF +APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Copyright (C) 2008 Apple Inc. All Rights Reserved. + +*/ + +#import <sys/socket.h> +#import <netinet/in.h> +#import <netinet6/in6.h> +#import <arpa/inet.h> +#import <ifaddrs.h> +#include <netdb.h> + +#import "Reachability.h" +#import <SystemConfiguration/SCNetworkReachability.h> + +static NSString *kLinkLocalAddressKey = @"169.254.0.0"; +static NSString *kDefaultRouteKey = @"0.0.0.0"; + +static Reachability *_sharedReachability; + +// A class extension that declares internal methods for this class. +@interface Reachability() +- (BOOL)isAdHocWiFiNetworkAvailableFlags:(SCNetworkReachabilityFlags *)outFlags; +- (BOOL)isNetworkAvailableFlags:(SCNetworkReachabilityFlags *)outFlags; +- (BOOL)isReachableWithoutRequiringConnection:(SCNetworkReachabilityFlags)flags; +- (SCNetworkReachabilityRef)reachabilityRefForHostName:(NSString *)hostName; +- (SCNetworkReachabilityRef)reachabilityRefForAddress:(NSString *)address; +- (BOOL)addressFromString:(NSString *)IPAddress address:(struct sockaddr_in *)outAddress; +- (void)stopListeningForReachabilityChanges; +@end + +@implementation Reachability + +@synthesize networkStatusNotificationsEnabled = _networkStatusNotificationsEnabled; +@synthesize hostName = _hostName; +@synthesize address = _address; +@synthesize reachabilityQueries = _reachabilityQueries; + ++ (Reachability *)sharedReachability +{ + if (!_sharedReachability) { + _sharedReachability = [[Reachability alloc] init]; + // Clients of Reachability will typically call [[Reachability sharedReachability] setHostName:] + // before calling one of the status methods. + _sharedReachability.hostName = nil; + _sharedReachability.address = nil; + _sharedReachability.networkStatusNotificationsEnabled = NO; + _sharedReachability.reachabilityQueries = [[NSMutableDictionary alloc] init]; + } + return _sharedReachability; +} + +- (void) dealloc +{ + [self stopListeningForReachabilityChanges]; + + [_sharedReachability.reachabilityQueries release]; + [_sharedReachability release]; + [super dealloc]; +} + +- (BOOL)isReachableWithoutRequiringConnection:(SCNetworkReachabilityFlags)flags +{ + // kSCNetworkReachabilityFlagsReachable indicates that the specified nodename or address can + // be reached using the current network configuration. + BOOL isReachable = flags & kSCNetworkReachabilityFlagsReachable; + + // This flag indicates that the specified nodename or address can + // be reached using the current network configuration, but a + // connection must first be established. + // + // If the flag is false, we don't have a connection. But because CFNetwork + // automatically attempts to bring up a WWAN connection, if the WWAN reachability + // flag is present, a connection is not required. + BOOL noConnectionRequired = !(flags & kSCNetworkReachabilityFlagsConnectionRequired); + if ((flags & kSCNetworkReachabilityFlagsIsWWAN)) { + noConnectionRequired = YES; + } + + return (isReachable && noConnectionRequired) ? YES : NO; +} + +// Returns whether or not the current host name is reachable with the current network configuration. +- (BOOL)isHostReachable:(NSString *)host +{ + if (!host || ![host length]) { + return NO; + } + + SCNetworkReachabilityFlags flags; + SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, [host UTF8String]); + BOOL gotFlags = SCNetworkReachabilityGetFlags(reachability, &flags); + + CFRelease(reachability); + + if (!gotFlags) { + return NO; + } + + return [self isReachableWithoutRequiringConnection:flags]; +} + +// This returns YES if the address 169.254.0.0 is reachable without requiring a connection. +- (BOOL)isAdHocWiFiNetworkAvailableFlags:(SCNetworkReachabilityFlags *)outFlags +{ + // Look in the cache of reachability queries for one that matches this query. + ReachabilityQuery *query = [self.reachabilityQueries objectForKey:kLinkLocalAddressKey]; + SCNetworkReachabilityRef adHocWiFiNetworkReachability = query.reachabilityRef; + + // If a cached reachability query was not found, create one. + if (!adHocWiFiNetworkReachability) { + + // Build a sockaddr_in that we can pass to the address reachability query. + struct sockaddr_in sin; + + bzero(&sin, sizeof(sin)); + sin.sin_len = sizeof(sin); + sin.sin_family = AF_INET; + // IN_LINKLOCALNETNUM is defined in <netinet/in.h> as 169.254.0.0 + sin.sin_addr.s_addr = htonl(IN_LINKLOCALNETNUM); + + adHocWiFiNetworkReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&sin); + + query = [[[ReachabilityQuery alloc] init] autorelease]; + query.hostNameOrAddress = kLinkLocalAddressKey; + query.reachabilityRef = adHocWiFiNetworkReachability; + + // Add the reachability query to the cache. + [self.reachabilityQueries setObject:query forKey:kLinkLocalAddressKey]; + } + + // If necessary, register for notifcations for the SCNetworkReachabilityRef on the current run loop. + // If an existing SCNetworkReachabilityRef was found in the cache, we can reuse it and register + // to receive notifications from it in the current run loop, which may be different than the run loop + // that was previously used when registering the SCNetworkReachabilityRef for notifications. + // -scheduleOnRunLoop: will schedule only if network status notifications are enabled in the Reachability instance. + // By default, they are not enabled. + [query scheduleOnRunLoop:[NSRunLoop currentRunLoop]]; + + SCNetworkReachabilityFlags addressReachabilityFlags; + BOOL gotFlags = SCNetworkReachabilityGetFlags(adHocWiFiNetworkReachability, &addressReachabilityFlags); + if (!gotFlags) { + // There was an error getting the reachability flags. + return NO; + } + + // Callers of this method might want to use the reachability flags, so if an 'out' parameter + // was passed in, assign the reachability flags to it. + if (outFlags) { + *outFlags = addressReachabilityFlags; + } + + return [self isReachableWithoutRequiringConnection:addressReachabilityFlags]; +} + +// ReachabilityCallback is registered as the callback for network state changes in startListeningForReachabilityChanges. +static void ReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void *info) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + // Post a notification to notify the client that the network reachability changed. + [[NSNotificationCenter defaultCenter] postNotificationName:@"kNetworkReachabilityChangedNotification" object:nil]; + + [pool release]; +} + +// Perform a reachability query for the address 0.0.0.0. If that address is reachable without +// requiring a connection, a network interface is available. We'll have to do more work to +// determine which network interface is available. +- (BOOL)isNetworkAvailableFlags:(SCNetworkReachabilityFlags *)outFlags +{ + ReachabilityQuery *query = [self.reachabilityQueries objectForKey:kDefaultRouteKey]; + SCNetworkReachabilityRef defaultRouteReachability = query.reachabilityRef; + + // If a cached reachability query was not found, create one. + if (!defaultRouteReachability) { + + struct sockaddr_in zeroAddress; + bzero(&zeroAddress, sizeof(zeroAddress)); + zeroAddress.sin_len = sizeof(zeroAddress); + zeroAddress.sin_family = AF_INET; + + defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress); + + ReachabilityQuery *query = [[[ReachabilityQuery alloc] init] autorelease]; + query.hostNameOrAddress = kDefaultRouteKey; + query.reachabilityRef = defaultRouteReachability; + + [self.reachabilityQueries setObject:query forKey:kDefaultRouteKey]; + } + + // If necessary, register for notifcations for the SCNetworkReachabilityRef on the current run loop. + // If an existing SCNetworkReachabilityRef was found in the cache, we can reuse it and register + // to receive notifications from it in the current run loop, which may be different than the run loop + // that was previously used when registering the SCNetworkReachabilityRef for notifications. + // -scheduleOnRunLoop: will schedule only if network status notifications are enabled in the Reachability instance. + // By default, they are not enabled. + [query scheduleOnRunLoop:[NSRunLoop currentRunLoop]]; + + SCNetworkReachabilityFlags flags; + BOOL gotFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags); + if (!gotFlags) { + return NO; + } + + BOOL isReachable = [self isReachableWithoutRequiringConnection:flags]; + + // Callers of this method might want to use the reachability flags, so if an 'out' parameter + // was passed in, assign the reachability flags to it. + if (outFlags) { + *outFlags = flags; + } + + return isReachable; +} + +// Be a good citizen and unregister for network state changes when the application terminates. +- (void)stopListeningForReachabilityChanges +{ + // Walk through the cache that holds SCNetworkReachabilityRefs for reachability + // queries to particular hosts or addresses. + NSEnumerator *enumerator = [self.reachabilityQueries objectEnumerator]; + ReachabilityQuery *reachabilityQuery; + + while (reachabilityQuery = [enumerator nextObject]) { + + CFArrayRef runLoops = reachabilityQuery.runLoops; + NSUInteger runLoopCounter, maxRunLoops = CFArrayGetCount(runLoops); + + for (runLoopCounter = 0; runLoopCounter < maxRunLoops; runLoopCounter++) { + CFRunLoopRef nextRunLoop = (CFRunLoopRef)CFArrayGetValueAtIndex(runLoops, runLoopCounter); + + SCNetworkReachabilityUnscheduleFromRunLoop(reachabilityQuery.reachabilityRef, nextRunLoop, kCFRunLoopDefaultMode); + } + + CFArrayRemoveAllValues(reachabilityQuery.runLoops); + } +} + +/* + Create a SCNetworkReachabilityRef for hostName, which lets us determine if hostName + is currently reachable, and lets us register to receive notifications when the + reachability of hostName changes. + */ +- (SCNetworkReachabilityRef)reachabilityRefForHostName:(NSString *)hostName +{ + if (!hostName || ![hostName length]) { + return NULL; + } + + // Look in the cache for an existing SCNetworkReachabilityRef for hostName. + ReachabilityQuery *cachedQuery = [self.reachabilityQueries objectForKey:hostName]; + SCNetworkReachabilityRef reachabilityRefForHostName = cachedQuery.reachabilityRef; + + if (reachabilityRefForHostName) { + return reachabilityRefForHostName; + } + + // Didn't find an existing SCNetworkReachabilityRef for hostName, so create one ... + reachabilityRefForHostName = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [hostName UTF8String]); + + NSAssert1(reachabilityRefForHostName != NULL, @"Failed to create SCNetworkReachabilityRef for host: %@", hostName); + + ReachabilityQuery *query = [[[ReachabilityQuery alloc] init] autorelease]; + query.hostNameOrAddress = hostName; + query.reachabilityRef = reachabilityRefForHostName; + + // If necessary, register for notifcations for the SCNetworkReachabilityRef on the current run loop. + // If an existing SCNetworkReachabilityRef was found in the cache, we can reuse it and register + // to receive notifications from it in the current run loop, which may be different than the run loop + // that was previously used when registering the SCNetworkReachabilityRef for notifications. + // -scheduleOnRunLoop: will schedule only if network status notifications are enabled in the Reachability instance. + // By default, they are not enabled. + [query scheduleOnRunLoop:[NSRunLoop currentRunLoop]]; + + // ... and add it to the cache. + [self.reachabilityQueries setObject:query forKey:hostName]; + return reachabilityRefForHostName; +} + +/* + Create a SCNetworkReachabilityRef for the IP address in addressString, which lets us determine if + the address is currently reachable, and lets us register to receive notifications when the + reachability of the address changes. + */ +- (SCNetworkReachabilityRef)reachabilityRefForAddress:(NSString *)addressString +{ + if (!addressString || ![addressString length]) { + return NULL; + } + + struct sockaddr_in address; + + BOOL gotAddress = [self addressFromString:addressString address:&address]; + if (!gotAddress) { + // The attempt to convert addressString to a sockaddr_in failed. + NSAssert1(gotAddress != NO, @"Failed to convert an IP address string to a sockaddr_in: %@", addressString); + return NULL; + } + + // Look in the cache for an existing SCNetworkReachabilityRef for addressString. + ReachabilityQuery *cachedQuery = [self.reachabilityQueries objectForKey:addressString]; + SCNetworkReachabilityRef reachabilityRefForAddress = cachedQuery.reachabilityRef; + + if (reachabilityRefForAddress) { + return reachabilityRefForAddress; + } + + // Didn't find an existing SCNetworkReachabilityRef for addressString, so create one. + reachabilityRefForAddress = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (struct sockaddr *)&address); + + NSAssert1(reachabilityRefForAddress != NULL, @"Failed to create SCNetworkReachabilityRef for address: %@", addressString); + + ReachabilityQuery *query = [[[ReachabilityQuery alloc] init] autorelease]; + query.hostNameOrAddress = addressString; + query.reachabilityRef = reachabilityRefForAddress; + + // If necessary, register for notifcations for the SCNetworkReachabilityRef on the current run loop. + // If an existing SCNetworkReachabilityRef was found in the cache, we can reuse it and register + // to receive notifications from it in the current run loop, which may be different than the run loop + // that was previously used when registering the SCNetworkReachabilityRef for notifications. + // -scheduleOnRunLoop: will schedule only if network status notifications are enabled in the Reachability instance. + // By default, they are not enabled. + [query scheduleOnRunLoop:[NSRunLoop currentRunLoop]]; + + // ... and add it to the cache. + [self.reachabilityQueries setObject:query forKey:addressString]; + return reachabilityRefForAddress; +} + +- (NetworkStatus)remoteHostStatus +{ + /* + If the current host name or address is reachable, determine which network interface it is reachable through. + If the host is reachable and the reachability flags include kSCNetworkReachabilityFlagsIsWWAN, it + is reachable through the carrier data network. If the host is reachable and the reachability + flags do not include kSCNetworkReachabilityFlagsIsWWAN, it is reachable through the WiFi network. + */ + + SCNetworkReachabilityRef reachabilityRef = nil; + if (self.hostName) { + reachabilityRef = [self reachabilityRefForHostName:self.hostName]; + + } else if (self.address) { + reachabilityRef = [self reachabilityRefForAddress:self.address]; + + } else { + NSAssert(self.hostName != nil && self.address != nil, @"No hostName or address specified. Cannot determine reachability."); + return NotReachable; + } + + if (!reachabilityRef) { + return NotReachable; + } + + SCNetworkReachabilityFlags reachabilityFlags; + BOOL gotFlags = SCNetworkReachabilityGetFlags(reachabilityRef, &reachabilityFlags); + if (!gotFlags) { + return NotReachable; + } + + BOOL reachable = [self isReachableWithoutRequiringConnection:reachabilityFlags]; + + if (!reachable) { + return NotReachable; + } + if (reachabilityFlags & ReachableViaCarrierDataNetwork) { + return ReachableViaCarrierDataNetwork; + } + + return ReachableViaWiFiNetwork; +} + +- (NetworkStatus)internetConnectionStatus +{ + /* + To determine if the device has an Internet connection, query the address + 0.0.0.0. If it's reachable without requiring a connection, first check + for the kSCNetworkReachabilityFlagsIsDirect flag, which tell us if the connection + is to an ad-hoc WiFi network. If it is not, the device can access the Internet. + The next thing to determine is how the device can access the Internet, which + can either be through the carrier data network (EDGE or other service) or through + a WiFi connection. + + Note: Knowing that the device has an Internet connection is not the same as + knowing if the device can reach a particular host. To know that, use + -[Reachability remoteHostStatus]. + */ + + SCNetworkReachabilityFlags defaultRouteFlags; + BOOL defaultRouteIsAvailable = [self isNetworkAvailableFlags:&defaultRouteFlags]; + if (defaultRouteIsAvailable) { + + if (defaultRouteFlags & kSCNetworkReachabilityFlagsIsDirect) { + + // The connection is to an ad-hoc WiFi network, so Internet access is not available. + return NotReachable; + } + else if (defaultRouteFlags & ReachableViaCarrierDataNetwork) { + return ReachableViaCarrierDataNetwork; + } + + return ReachableViaWiFiNetwork; + } + + return NotReachable; +} + +- (NetworkStatus)localWiFiConnectionStatus +{ + SCNetworkReachabilityFlags selfAssignedAddressFlags; + + /* + To determine if the WiFi connection is to a local ad-hoc network, + check the availability of the address 169.254.x.x. That's an address + in the self-assigned range, and the device will have a self-assigned IP + when it's connected to a ad-hoc WiFi network. So to test if the device + has a self-assigned IP, look for the kSCNetworkReachabilityFlagsIsDirect flag + in the address query. If it's present, we know that the WiFi connection + is to an ad-hoc network. + */ + // This returns YES if the address 169.254.0.0 is reachable without requiring a connection. + BOOL hasLinkLocalNetworkAccess = [self isAdHocWiFiNetworkAvailableFlags:&selfAssignedAddressFlags]; + + if (hasLinkLocalNetworkAccess && (selfAssignedAddressFlags & kSCNetworkReachabilityFlagsIsDirect)) { + return ReachableViaWiFiNetwork; + } + + return NotReachable; +} + +// Convert an IP address from an NSString to a sockaddr_in * that can be used to create +// the reachability request. +- (BOOL)addressFromString:(NSString *)IPAddress address:(struct sockaddr_in *)address +{ + if (!IPAddress || ![IPAddress length]) { + return NO; + } + + memset((char *) address, sizeof(struct sockaddr_in), 0); + address->sin_family = AF_INET; + address->sin_len = sizeof(struct sockaddr_in); + + int conversionResult = inet_aton([IPAddress UTF8String], &address->sin_addr); + if (conversionResult == 0) { + NSAssert1(conversionResult != 1, @"Failed to convert the IP address string into a sockaddr_in: %@", IPAddress); + return NO; + } + + return YES; +} + +@end + +@interface ReachabilityQuery () +- (CFRunLoopRef)startListeningForReachabilityChanges:(SCNetworkReachabilityRef)reachability onRunLoop:(CFRunLoopRef)runLoop; +@end + +@implementation ReachabilityQuery + +@synthesize reachabilityRef = _reachabilityRef; +@synthesize runLoops = _runLoops; +@synthesize hostNameOrAddress = _hostNameOrAddress; + +- (id)init +{ + self = [super init]; + if (self != nil) { + self.runLoops = CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL); + } + return self; +} + +- (void)dealloc +{ + CFRelease(self.runLoops); + [super dealloc]; +} + +- (BOOL)isScheduledOnRunLoop:(CFRunLoopRef)runLoop +{ + NSUInteger runLoopCounter, maxRunLoops = CFArrayGetCount(self.runLoops); + + for (runLoopCounter = 0; runLoopCounter < maxRunLoops; runLoopCounter++) { + CFRunLoopRef nextRunLoop = (CFRunLoopRef)CFArrayGetValueAtIndex(self.runLoops, runLoopCounter); + + if (nextRunLoop == runLoop) { + return YES; + } + } + + return NO; +} + +- (void)scheduleOnRunLoop:(NSRunLoop *)inRunLoop +{ + // Only register for network state changes if the client has specifically enabled them. + if ([[Reachability sharedReachability] networkStatusNotificationsEnabled] == NO) { + return; + } + + if (!inRunLoop) { + return; + } + + CFRunLoopRef runLoop = [inRunLoop getCFRunLoop]; + + // Notifications of status changes for each reachability query can be scheduled on multiple run loops. + // To support that, register for notifications for each runLoop. + // -isScheduledOnRunLoop: iterates over all of the run loops that have previously been used + // to register for notifications. If one is found that matches the passed in runLoop argument, there's + // no need to register for notifications again. If one is not found, register for notifications + // using the current runLoop. + if (![self isScheduledOnRunLoop:runLoop]) { + + CFRunLoopRef notificationRunLoop = [self startListeningForReachabilityChanges:self.reachabilityRef onRunLoop:runLoop]; + if (notificationRunLoop) { + CFArrayAppendValue(self.runLoops, notificationRunLoop); + } + } +} + +// Register to receive changes to the 'reachability' query so that we can update the +// user interface when the network state changes. +- (CFRunLoopRef)startListeningForReachabilityChanges:(SCNetworkReachabilityRef)reachability onRunLoop:(CFRunLoopRef)runLoop +{ + if (!reachability) { + return NULL; + } + + if (!runLoop) { + return NULL; + } + + SCNetworkReachabilityContext context = {0, self, NULL, NULL, NULL}; + SCNetworkReachabilitySetCallback(reachability, ReachabilityCallback, &context); + SCNetworkReachabilityScheduleWithRunLoop(reachability, runLoop, kCFRunLoopDefaultMode); + + return runLoop; +} + + +@end diff --git a/iphone/FixMyStreet/FixMyStreet.xcodeproj/matthew.mode1v3 b/iphone/FixMyStreet/FixMyStreet.xcodeproj/matthew.mode1v3 index de5043c50..cca3ba199 100644 --- a/iphone/FixMyStreet/FixMyStreet.xcodeproj/matthew.mode1v3 +++ b/iphone/FixMyStreet/FixMyStreet.xcodeproj/matthew.mode1v3 @@ -269,20 +269,22 @@ <string>080E96DDFE201D6D7F000001</string> <string>342F98AD0E951731006935E9</string> <string>29B97317FDCFA39411CA2CEA</string> + <string>29B97323FDCFA39411CA2CEA</string> <string>19C28FACFE9D520D11CA2CBB</string> <string>1C37FBAC04509CD000000102</string> + <string>1C08E77C0454961000C914BD</string> <string>1C37FABC05509CD000000102</string> <string>E2644B35053B69B200211256</string> </array> <key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key> <array> <array> - <integer>41</integer> - <integer>40</integer> + <integer>53</integer> + <integer>51</integer> </array> </array> <key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key> - <string>{{0, 0}, {243, 948}}</string> + <string>{{0, 174}, {243, 948}}</string> </dict> <key>PBXTopSmartGroupGIDs</key> <array/> @@ -321,7 +323,7 @@ <key>PBXProjectModuleGUID</key> <string>1CE0B20306471E060097A5F4</string> <key>PBXProjectModuleLabel</key> - <string>EditSubjectViewController.m</string> + <string>FixMyStreetAppDelegate.m</string> <key>PBXSplitModuleInNavigatorKey</key> <dict> <key>Split0</key> @@ -329,19 +331,70 @@ <key>PBXProjectModuleGUID</key> <string>1CE0B20406471E060097A5F4</string> <key>PBXProjectModuleLabel</key> - <string>EditSubjectViewController.m</string> + <string>FixMyStreetAppDelegate.m</string> <key>_historyCapacity</key> <integer>0</integer> <key>bookmark</key> - <string>34B318D00ECB8055000AD487</string> + <string>3442AADE0EE58B6A000B191D</string> <key>history</key> <array> - <string>34B318C60ECB8036000AD487</string> - <string>34B318CF0ECB8055000AD487</string> + <string>342592FC0EE4665E009430B7</string> + <string>342592FD0EE4665E009430B7</string> + <string>342592FE0EE4665E009430B7</string> + <string>3442AA940EE578F6000B191D</string> + <string>3442AAA80EE58AA8000B191D</string> + <string>3442AAAC0EE58AA8000B191D</string> + <string>3442AAD60EE58B6A000B191D</string> + <string>3442AAD70EE58B6A000B191D</string> + <string>3442AAD80EE58B6A000B191D</string> + <string>3442AAD90EE58B6A000B191D</string> + <string>3442AAAD0EE58AA8000B191D</string> </array> <key>prevStack</key> <array> - <string>34B318C80ECB8036000AD487</string> + <string>346099BC0ED46D9500B731FF</string> + <string>342593010EE4665E009430B7</string> + <string>342593020EE4665E009430B7</string> + <string>342593030EE4665E009430B7</string> + <string>342593040EE4665E009430B7</string> + <string>3442AA400EE576E1000B191D</string> + <string>3442AA410EE576E1000B191D</string> + <string>3442AA500EE577C7000B191D</string> + <string>3442AA510EE577C7000B191D</string> + <string>3442AA520EE577C7000B191D</string> + <string>3442AA530EE577C7000B191D</string> + <string>3442AA950EE578F6000B191D</string> + <string>3442AAAE0EE58AA8000B191D</string> + <string>3442AAAF0EE58AA8000B191D</string> + <string>3442AAB00EE58AA8000B191D</string> + <string>3442AAB10EE58AA8000B191D</string> + <string>3442AAB20EE58AA8000B191D</string> + <string>3442AAB30EE58AA8000B191D</string> + <string>3442AAB40EE58AA8000B191D</string> + <string>3442AAB50EE58AA8000B191D</string> + <string>3442AAB60EE58AA8000B191D</string> + <string>3442AAB70EE58AA8000B191D</string> + <string>3442AAB80EE58AA8000B191D</string> + <string>3442AAB90EE58AA8000B191D</string> + <string>3442AABA0EE58AA8000B191D</string> + <string>3442AABB0EE58AA8000B191D</string> + <string>3442AABC0EE58AA8000B191D</string> + <string>3442AABD0EE58AA8000B191D</string> + <string>3442AABE0EE58AA8000B191D</string> + <string>3442AABF0EE58AA8000B191D</string> + <string>3442AAC00EE58AA8000B191D</string> + <string>3442AAC10EE58AA8000B191D</string> + <string>3442AAC20EE58AA8000B191D</string> + <string>3442AAC30EE58AA8000B191D</string> + <string>3442AAC40EE58AA8000B191D</string> + <string>3442AAC50EE58AA8000B191D</string> + <string>3442AAC60EE58AA8000B191D</string> + <string>3442AAC70EE58AA8000B191D</string> + <string>3442AAC80EE58AA8000B191D</string> + <string>3442AADA0EE58B6A000B191D</string> + <string>3442AADB0EE58B6A000B191D</string> + <string>3442AADC0EE58B6A000B191D</string> + <string>3442AADD0EE58B6A000B191D</string> </array> </dict> <key>SplitCount</key> @@ -399,9 +452,9 @@ </array> <key>TableOfContents</key> <array> - <string>34B318B80ECB7EDB000AD487</string> + <string>3442AA130EE56513000B191D</string> <string>1CE0B1FE06471DED0097A5F4</string> - <string>34B318B90ECB7EDB000AD487</string> + <string>3442AA140EE56513000B191D</string> <string>1CE0B20306471E060097A5F4</string> <string>1CE0B20506471E060097A5F4</string> </array> @@ -535,6 +588,8 @@ <integer>5</integer> <key>WindowOrderList</key> <array> + <string>1C530D57069F1CE1000CFCEE</string> + <string>1C78EAAD065D492600B07095</string> <string>3477106F0E8BD7BA0051DFFD</string> <string>1CD10A99069EF8BA00B06720</string> <string>/Users/matthew/Projects/mySociety/iPhone/FixMyStreet/FixMyStreet.xcodeproj</string> @@ -570,7 +625,7 @@ <key>Frame</key> <string>{{0, 0}, {876, 236}}</string> <key>RubberWindowFrame</key> - <string>520 292 876 600 0 0 1920 1178 </string> + <string>542 318 876 600 0 0 1920 1178 </string> </dict> <key>Module</key> <string>PBXNavigatorGroup</string> @@ -598,7 +653,7 @@ <key>Frame</key> <string>{{0, 241}, {876, 318}}</string> <key>RubberWindowFrame</key> - <string>520 292 876 600 0 0 1920 1178 </string> + <string>542 318 876 600 0 0 1920 1178 </string> </dict> <key>Module</key> <string>PBXBuildResultsModule</string> @@ -621,14 +676,14 @@ <key>TableOfContents</key> <array> <string>3477106F0E8BD7BA0051DFFD</string> - <string>34B318BA0ECB7EDB000AD487</string> + <string>3442AA470EE576F9000B191D</string> <string>1CD0528F0623707200166675</string> <string>XCMainBuildResultsModuleGUID</string> </array> <key>ToolbarConfiguration</key> <string>xcode.toolbar.config.buildV3</string> <key>WindowString</key> - <string>520 292 876 600 0 0 1920 1178 </string> + <string>542 318 876 600 0 0 1920 1178 </string> <key>WindowToolGUID</key> <string>3477106F0E8BD7BA0051DFFD</string> <key>WindowToolIsVisible</key> @@ -741,13 +796,13 @@ <key>TableOfContents</key> <array> <string>1CD10A99069EF8BA00B06720</string> - <string>34B318BB0ECB7EDB000AD487</string> + <string>3442AA150EE56513000B191D</string> <string>1C162984064C10D400B95A72</string> - <string>34B318BC0ECB7EDB000AD487</string> - <string>34B318BD0ECB7EDB000AD487</string> - <string>34B318BE0ECB7EDB000AD487</string> - <string>34B318BF0ECB7EDB000AD487</string> - <string>34B318C00ECB7EDB000AD487</string> + <string>3442AA160EE56513000B191D</string> + <string>3442AA170EE56513000B191D</string> + <string>3442AA180EE56513000B191D</string> + <string>3442AA190EE56513000B191D</string> + <string>3442AA1A0EE56513000B191D</string> </array> <key>ToolbarConfiguration</key> <string>xcode.toolbar.config.debugV3</string> @@ -781,7 +836,7 @@ <key>PBXProjectModuleGUID</key> <string>1CDD528C0622207200134675</string> <key>PBXProjectModuleLabel</key> - <string>SettingsViewController.m</string> + <string>InputTableViewController.m</string> <key>StatusBarVisibility</key> <true/> </dict> @@ -837,8 +892,8 @@ <key>TableOfContents</key> <array> <string>1C530D57069F1CE1000CFCEE</string> - <string>34D15B6F0EB7306000741406</string> - <string>34D15B700EB7306000741406</string> + <string>3442AA9E0EE58992000B191D</string> + <string>3442AA9F0EE58992000B191D</string> <string>1CDD528C0622207200134675</string> <string>1CD0528E0623707200166675</string> </array> @@ -901,7 +956,7 @@ <key>TableOfContents</key> <array> <string>1C78EAAD065D492600B07095</string> - <string>3410B70A0ECB793300F84035</string> + <string>3442AA970EE578F6000B191D</string> <string>1C78EAAC065D492600B07095</string> </array> <key>ToolbarConfiguration</key> diff --git a/iphone/FixMyStreet/FixMyStreet.xcodeproj/matthew.pbxuser b/iphone/FixMyStreet/FixMyStreet.xcodeproj/matthew.pbxuser index d2c2c1c69..5ee2b4fde 100644 --- a/iphone/FixMyStreet/FixMyStreet.xcodeproj/matthew.pbxuser +++ b/iphone/FixMyStreet/FixMyStreet.xcodeproj/matthew.pbxuser @@ -10,9 +10,9 @@ }; 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1229, 3038}}"; - sepNavSelRange = "{6061, 0}"; - sepNavVisRange = "{4725, 3105}"; + sepNavIntBoundsRect = "{{0, 0}, {1229, 3248}}"; + sepNavSelRange = "{6036, 0}"; + sepNavVisRange = "{4319, 2853}"; sepNavWindowFrame = "{{130, 510}, {750, 558}}"; }; }; @@ -25,7 +25,7 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { activeBuildConfigurationName = Debug; activeExecutable = 347710680E8BD7AA0051DFFD /* FixMyStreet */; - activeSDKPreference = iphonesimulator2.1; + activeSDKPreference = iphonesimulator2.0; activeTarget = 1D6058900D05DD3D006BFB54 /* FixMyStreet */; addToTargets = ( 1D6058900D05DD3D006BFB54 /* FixMyStreet */, @@ -64,13 +64,27 @@ PBXBreakpointsDataSource_ContinueID, ); }; + PBXConfiguration.PBXFileTableDataSource3.PBXBookmarksDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXBookmarksDataSource_NameID; + PBXFileTableDataSourceColumnWidthsKey = ( + 200, + 200, + 861, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXBookmarksDataSource_LocationID, + PBXBookmarksDataSource_NameID, + PBXBookmarksDataSource_CommentsID, + ); + }; PBXConfiguration.PBXFileTableDataSource3.PBXErrorsWarningsDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXErrorsWarningsDataSource_LocationID; PBXFileTableDataSourceColumnWidthsKey = ( 20, 300, - 548, + 941, ); PBXFileTableDataSourceColumnsKey = ( PBXErrorsWarningsDataSource_TypeID, @@ -162,22 +176,88 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 248217288; - PBXWorkspaceStateSaveDate = 248217288; + PBXPerProjectTemplateStateSaveDate = 249914630; + PBXWorkspaceStateSaveDate = 249914630; }; perUserProjectItems = { - 3410B70B0ECB7DF800F84035 = 3410B70B0ECB7DF800F84035 /* PBXTextBookmark */; - 3410B70D0ECB7DF800F84035 = 3410B70D0ECB7DF800F84035 /* PBXTextBookmark */; - 3410B70E0ECB7DF800F84035 = 3410B70E0ECB7DF800F84035 /* PBXTextBookmark */; - 34B318B70ECB7EDB000AD487 /* PBXTextBookmark */ = 34B318B70ECB7EDB000AD487 /* PBXTextBookmark */; - 34B318C60ECB8036000AD487 /* PBXTextBookmark */ = 34B318C60ECB8036000AD487 /* PBXTextBookmark */; - 34B318C70ECB8036000AD487 /* PBXBookmark */ = 34B318C70ECB8036000AD487 /* PBXBookmark */; - 34B318C80ECB8036000AD487 /* PBXTextBookmark */ = 34B318C80ECB8036000AD487 /* PBXTextBookmark */; - 34B318C90ECB8036000AD487 /* PBXTextBookmark */ = 34B318C90ECB8036000AD487 /* PBXTextBookmark */; - 34B318CF0ECB8055000AD487 /* PBXTextBookmark */ = 34B318CF0ECB8055000AD487 /* PBXTextBookmark */; - 34B318D00ECB8055000AD487 /* PBXTextBookmark */ = 34B318D00ECB8055000AD487 /* PBXTextBookmark */; - 34BFCFF60ECB7E9C00325DF2 = 34BFCFF60ECB7E9C00325DF2 /* PBXTextBookmark */; - 34BFD0060ECB7EBC00325DF2 = 34BFD0060ECB7EBC00325DF2 /* PBXTextBookmark */; + 342592FC0EE4665E009430B7 = 342592FC0EE4665E009430B7 /* PlistBookmark */; + 342592FD0EE4665E009430B7 = 342592FD0EE4665E009430B7 /* PBXBookmark */; + 342592FE0EE4665E009430B7 = 342592FE0EE4665E009430B7 /* PBXBookmark */; + 342592FF0EE4665E009430B7 = 342592FF0EE4665E009430B7 /* PBXBookmark */; + 342593000EE4665E009430B7 = 342593000EE4665E009430B7 /* PBXTextBookmark */; + 342593010EE4665E009430B7 = 342593010EE4665E009430B7 /* PlistBookmark */; + 342593020EE4665E009430B7 = 342593020EE4665E009430B7 /* PBXBookmark */; + 342593030EE4665E009430B7 = 342593030EE4665E009430B7 /* PBXBookmark */; + 342593040EE4665E009430B7 = 342593040EE4665E009430B7 /* PBXBookmark */; + 342593050EE4665E009430B7 = 342593050EE4665E009430B7 /* PBXBookmark */; + 342593060EE4665E009430B7 = 342593060EE4665E009430B7 /* PBXTextBookmark */; + 3442AA120EE56513000B191D /* PBXTextBookmark */ = 3442AA120EE56513000B191D /* PBXTextBookmark */; + 3442AA3E0EE576E1000B191D /* PBXTextBookmark */ = 3442AA3E0EE576E1000B191D /* PBXTextBookmark */; + 3442AA3F0EE576E1000B191D /* PBXTextBookmark */ = 3442AA3F0EE576E1000B191D /* PBXTextBookmark */; + 3442AA400EE576E1000B191D /* PBXTextBookmark */ = 3442AA400EE576E1000B191D /* PBXTextBookmark */; + 3442AA410EE576E1000B191D /* PBXTextBookmark */ = 3442AA410EE576E1000B191D /* PBXTextBookmark */; + 3442AA420EE576E1000B191D /* PBXTextBookmark */ = 3442AA420EE576E1000B191D /* PBXTextBookmark */; + 3442AA450EE576F9000B191D /* PBXTextBookmark */ = 3442AA450EE576F9000B191D /* PBXTextBookmark */; + 3442AA460EE576F9000B191D /* PBXTextBookmark */ = 3442AA460EE576F9000B191D /* PBXTextBookmark */; + 3442AA4D0EE577C7000B191D /* PBXTextBookmark */ = 3442AA4D0EE577C7000B191D /* PBXTextBookmark */; + 3442AA4E0EE577C7000B191D /* PBXTextBookmark */ = 3442AA4E0EE577C7000B191D /* PBXTextBookmark */; + 3442AA4F0EE577C7000B191D /* PBXTextBookmark */ = 3442AA4F0EE577C7000B191D /* PBXTextBookmark */; + 3442AA500EE577C7000B191D /* PBXTextBookmark */ = 3442AA500EE577C7000B191D /* PBXTextBookmark */; + 3442AA510EE577C7000B191D /* PBXTextBookmark */ = 3442AA510EE577C7000B191D /* PBXTextBookmark */; + 3442AA520EE577C7000B191D /* PBXTextBookmark */ = 3442AA520EE577C7000B191D /* PBXTextBookmark */; + 3442AA530EE577C7000B191D /* PBXTextBookmark */ = 3442AA530EE577C7000B191D /* PBXTextBookmark */; + 3442AA540EE577C7000B191D /* PBXTextBookmark */ = 3442AA540EE577C7000B191D /* PBXTextBookmark */; + 3442AA940EE578F6000B191D /* PBXTextBookmark */ = 3442AA940EE578F6000B191D /* PBXTextBookmark */; + 3442AA950EE578F6000B191D /* PBXTextBookmark */ = 3442AA950EE578F6000B191D /* PBXTextBookmark */; + 3442AA960EE578F6000B191D /* PBXTextBookmark */ = 3442AA960EE578F6000B191D /* PBXTextBookmark */; + 3442AA990EE57914000B191D /* PBXTextBookmark */ = 3442AA990EE57914000B191D /* PBXTextBookmark */; + 3442AA9A0EE57922000B191D /* PBXTextBookmark */ = 3442AA9A0EE57922000B191D /* PBXTextBookmark */; + 3442AAA20EE58A03000B191D /* PBXTextBookmark */ = 3442AAA20EE58A03000B191D /* PBXTextBookmark */; + 3442AAA30EE58A03000B191D /* PBXTextBookmark */ = 3442AAA30EE58A03000B191D /* PBXTextBookmark */; + 3442AAA80EE58AA8000B191D /* PBXTextBookmark */ = 3442AAA80EE58AA8000B191D /* PBXTextBookmark */; + 3442AAA90EE58AA8000B191D /* PBXTextBookmark */ = 3442AAA90EE58AA8000B191D /* PBXTextBookmark */; + 3442AAAA0EE58AA8000B191D /* PBXTextBookmark */ = 3442AAAA0EE58AA8000B191D /* PBXTextBookmark */; + 3442AAAB0EE58AA8000B191D /* PBXTextBookmark */ = 3442AAAB0EE58AA8000B191D /* PBXTextBookmark */; + 3442AAAC0EE58AA8000B191D /* PBXBookmark */ = 3442AAAC0EE58AA8000B191D /* PBXBookmark */; + 3442AAAD0EE58AA8000B191D /* PBXTextBookmark */ = 3442AAAD0EE58AA8000B191D /* PBXTextBookmark */; + 3442AAAE0EE58AA8000B191D /* PBXTextBookmark */ = 3442AAAE0EE58AA8000B191D /* PBXTextBookmark */; + 3442AAAF0EE58AA8000B191D /* PBXTextBookmark */ = 3442AAAF0EE58AA8000B191D /* PBXTextBookmark */; + 3442AAB00EE58AA8000B191D /* PBXTextBookmark */ = 3442AAB00EE58AA8000B191D /* PBXTextBookmark */; + 3442AAB10EE58AA8000B191D /* PBXTextBookmark */ = 3442AAB10EE58AA8000B191D /* PBXTextBookmark */; + 3442AAB20EE58AA8000B191D /* PBXTextBookmark */ = 3442AAB20EE58AA8000B191D /* PBXTextBookmark */; + 3442AAB30EE58AA8000B191D /* PBXTextBookmark */ = 3442AAB30EE58AA8000B191D /* PBXTextBookmark */; + 3442AAB40EE58AA8000B191D /* PBXTextBookmark */ = 3442AAB40EE58AA8000B191D /* PBXTextBookmark */; + 3442AAB50EE58AA8000B191D /* PBXTextBookmark */ = 3442AAB50EE58AA8000B191D /* PBXTextBookmark */; + 3442AAB60EE58AA8000B191D /* PBXTextBookmark */ = 3442AAB60EE58AA8000B191D /* PBXTextBookmark */; + 3442AAB70EE58AA8000B191D /* PBXTextBookmark */ = 3442AAB70EE58AA8000B191D /* PBXTextBookmark */; + 3442AAB80EE58AA8000B191D /* PBXTextBookmark */ = 3442AAB80EE58AA8000B191D /* PBXTextBookmark */; + 3442AAB90EE58AA8000B191D /* PBXTextBookmark */ = 3442AAB90EE58AA8000B191D /* PBXTextBookmark */; + 3442AABA0EE58AA8000B191D /* PBXTextBookmark */ = 3442AABA0EE58AA8000B191D /* PBXTextBookmark */; + 3442AABB0EE58AA8000B191D /* PBXTextBookmark */ = 3442AABB0EE58AA8000B191D /* PBXTextBookmark */; + 3442AABC0EE58AA8000B191D /* PBXTextBookmark */ = 3442AABC0EE58AA8000B191D /* PBXTextBookmark */; + 3442AABD0EE58AA8000B191D /* PBXTextBookmark */ = 3442AABD0EE58AA8000B191D /* PBXTextBookmark */; + 3442AABE0EE58AA8000B191D /* PBXTextBookmark */ = 3442AABE0EE58AA8000B191D /* PBXTextBookmark */; + 3442AABF0EE58AA8000B191D /* PBXTextBookmark */ = 3442AABF0EE58AA8000B191D /* PBXTextBookmark */; + 3442AAC00EE58AA8000B191D /* PBXTextBookmark */ = 3442AAC00EE58AA8000B191D /* PBXTextBookmark */; + 3442AAC10EE58AA8000B191D /* PBXTextBookmark */ = 3442AAC10EE58AA8000B191D /* PBXTextBookmark */; + 3442AAC20EE58AA8000B191D /* PBXTextBookmark */ = 3442AAC20EE58AA8000B191D /* PBXTextBookmark */; + 3442AAC30EE58AA8000B191D /* PBXTextBookmark */ = 3442AAC30EE58AA8000B191D /* PBXTextBookmark */; + 3442AAC40EE58AA8000B191D /* PBXTextBookmark */ = 3442AAC40EE58AA8000B191D /* PBXTextBookmark */; + 3442AAC50EE58AA8000B191D /* PBXTextBookmark */ = 3442AAC50EE58AA8000B191D /* PBXTextBookmark */; + 3442AAC60EE58AA8000B191D /* PBXTextBookmark */ = 3442AAC60EE58AA8000B191D /* PBXTextBookmark */; + 3442AAC70EE58AA8000B191D /* PBXBookmark */ = 3442AAC70EE58AA8000B191D /* PBXBookmark */; + 3442AAC80EE58AA8000B191D /* PBXTextBookmark */ = 3442AAC80EE58AA8000B191D /* PBXTextBookmark */; + 3442AAC90EE58AA8000B191D /* PBXTextBookmark */ = 3442AAC90EE58AA8000B191D /* PBXTextBookmark */; + 3442AAD60EE58B6A000B191D /* PBXTextBookmark */ = 3442AAD60EE58B6A000B191D /* PBXTextBookmark */; + 3442AAD70EE58B6A000B191D /* PBXTextBookmark */ = 3442AAD70EE58B6A000B191D /* PBXTextBookmark */; + 3442AAD80EE58B6A000B191D /* PBXTextBookmark */ = 3442AAD80EE58B6A000B191D /* PBXTextBookmark */; + 3442AAD90EE58B6A000B191D /* PBXTextBookmark */ = 3442AAD90EE58B6A000B191D /* PBXTextBookmark */; + 3442AADA0EE58B6A000B191D /* PBXTextBookmark */ = 3442AADA0EE58B6A000B191D /* PBXTextBookmark */; + 3442AADB0EE58B6A000B191D /* PBXTextBookmark */ = 3442AADB0EE58B6A000B191D /* PBXTextBookmark */; + 3442AADC0EE58B6A000B191D /* PBXTextBookmark */ = 3442AADC0EE58B6A000B191D /* PBXTextBookmark */; + 3442AADD0EE58B6A000B191D /* PBXTextBookmark */ = 3442AADD0EE58B6A000B191D /* PBXTextBookmark */; + 3442AADE0EE58B6A000B191D /* PBXTextBookmark */ = 3442AADE0EE58B6A000B191D /* PBXTextBookmark */; + 346099BC0ED46D9500B731FF = 346099BC0ED46D9500B731FF /* PBXTextBookmark */; }; sourceControlManager = 347710780E8BD7BA0051DFFD /* Source Control */; userBuildSettings = { @@ -197,35 +277,734 @@ sepNavVisRange = "{0, 230}"; }; }; - 3410B70B0ECB7DF800F84035 /* PBXTextBookmark */ = { + 342592FC0EE4665E009430B7 /* PlistBookmark */ = { + isa = PlistBookmark; + fRef = 8D1107310486CEB800E47090 /* Info.plist */; + fallbackIsa = PBXBookmark; + isK = 0; + kPath = ( + ); + name = /Users/matthew/Projects/mySociety/iPhone/FixMyStreet/Info.plist; + rLen = 0; + rLoc = 2147483647; + }; + 342592FD0EE4665E009430B7 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 349A561E0ECB07DF0091BE4F /* Default.png */; + }; + 342592FE0EE4665E009430B7 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 34C17A530EB0C69700768D1C /* mysociety.png */; + }; + 342592FF0EE4665E009430B7 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 347710940E8BDA9B0051DFFD /* Icon.png */; + }; + 342593000EE4665E009430B7 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 123"; + rLen = 0; + rLoc = 6036; + rType = 0; + vrLen = 3253; + vrLoc = 4698; + }; + 342593010EE4665E009430B7 /* PlistBookmark */ = { + isa = PlistBookmark; + fRef = 8D1107310486CEB800E47090 /* Info.plist */; + fallbackIsa = PBXBookmark; + isK = 0; + kPath = ( + ); + name = /Users/matthew/Projects/mySociety/iPhone/FixMyStreet/Info.plist; + rLen = 0; + rLoc = 2147483647; + }; + 342593020EE4665E009430B7 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 347710940E8BDA9B0051DFFD /* Icon.png */; + }; + 342593030EE4665E009430B7 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 349A561E0ECB07DF0091BE4F /* Default.png */; + }; + 342593040EE4665E009430B7 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 34C17A530EB0C69700768D1C /* mysociety.png */; + }; + 342593050EE4665E009430B7 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 347710940E8BDA9B0051DFFD /* Icon.png */; + }; + 342593060EE4665E009430B7 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 123"; + rLen = 0; + rLoc = 6036; + rType = 0; + vrLen = 3298; + vrLoc = 8177; + }; + 3442AA120EE56513000B191D /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 3481BD500EACF81D00C78F66 /* SettingsViewController.m */; - name = "SettingsViewController.m: 167"; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 123"; + rLen = 0; + rLoc = 6036; + rType = 0; + vrLen = 3298; + vrLoc = 8177; + }; + 3442AA200EE575BA000B191D /* Reachability.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1229, 1722}}"; + sepNavSelRange = "{1145, 0}"; + sepNavVisRange = "{0, 2564}"; + }; + }; + 3442AA210EE575BA000B191D /* Reachability.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1229, 8204}}"; + sepNavSelRange = "{11113, 0}"; + sepNavVisRange = "{10058, 2234}"; + }; + }; + 3442AA3E0EE576E1000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3442AA200EE575BA000B191D /* Reachability.h */; + name = "Reachability.h: 23"; + rLen = 0; + rLoc = 1145; + rType = 0; + vrLen = 2615; + vrLoc = 0; + }; + 3442AA3F0EE576E1000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 123"; + rLen = 0; + rLoc = 6036; + rType = 0; + vrLen = 3298; + vrLoc = 8177; + }; + 3442AA400EE576E1000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 123"; + rLen = 0; + rLoc = 6036; + rType = 0; + vrLen = 3298; + vrLoc = 8177; + }; + 3442AA410EE576E1000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3442AA200EE575BA000B191D /* Reachability.h */; + name = "Reachability.h: 23"; + rLen = 0; + rLoc = 1145; + rType = 0; + vrLen = 2615; + vrLoc = 0; + }; + 3442AA420EE576E1000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 117"; + rLen = 0; + rLoc = 5369; + rType = 0; + vrLen = 2653; + vrLoc = 4215; + }; + 3442AA450EE576F9000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 117"; + rLen = 0; + rLoc = 5369; + rType = 0; + vrLen = 2653; + vrLoc = 4215; + }; + 3442AA460EE576F9000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 117"; + rLen = 0; + rLoc = 5369; + rType = 0; + vrLen = 2653; + vrLoc = 4215; + }; + 3442AA4D0EE577C7000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 108"; + rLen = 0; + rLoc = 4899; + rType = 0; + vrLen = 2667; + vrLoc = 4215; + }; + 3442AA4E0EE577C7000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3442AA200EE575BA000B191D /* Reachability.h */; + name = "Reachability.h: 23"; + rLen = 0; + rLoc = 1145; + rType = 0; + vrLen = 2241; + vrLoc = 2803; + }; + 3442AA4F0EE577C7000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3442AA210EE575BA000B191D /* Reachability.m */; + name = "Reachability.m: 416"; + rLen = 13; + rLoc = 17772; + rType = 0; + vrLen = 2158; + vrLoc = 17625; + }; + 3442AA500EE577C7000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 117"; + rLen = 0; + rLoc = 5369; + rType = 0; + vrLen = 2423; + vrLoc = 4215; + }; + 3442AA510EE577C7000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3442AA210EE575BA000B191D /* Reachability.m */; + name = "Reachability.m: 416"; + rLen = 13; + rLoc = 17772; + rType = 0; + vrLen = 2158; + vrLoc = 17625; + }; + 3442AA520EE577C7000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 108"; + rLen = 0; + rLoc = 4899; + rType = 0; + vrLen = 2667; + vrLoc = 4215; + }; + 3442AA530EE577C7000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3442AA200EE575BA000B191D /* Reachability.h */; + name = "Reachability.h: 23"; + rLen = 0; + rLoc = 1145; + rType = 0; + vrLen = 2241; + vrLoc = 2803; + }; + 3442AA540EE577C7000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3442AA210EE575BA000B191D /* Reachability.m */; + name = "Reachability.m: 260"; + rLen = 7; + rLoc = 11241; + rType = 0; + vrLen = 2312; + vrLoc = 10058; + }; + 3442AA940EE578F6000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3442AA210EE575BA000B191D /* Reachability.m */; + name = "Reachability.m: 255"; + rLen = 0; + rLoc = 11113; + rType = 0; + vrLen = 2234; + vrLoc = 10058; + }; + 3442AA950EE578F6000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3442AA210EE575BA000B191D /* Reachability.m */; + name = "Reachability.m: 255"; + rLen = 0; + rLoc = 11113; + rType = 0; + vrLen = 2234; + vrLoc = 10058; + }; + 3442AA960EE578F6000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 109"; + rLen = 0; + rLoc = 5022; + rType = 0; + vrLen = 2437; + vrLoc = 4215; + }; + 3442AA990EE57914000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 110"; + rLen = 0; + rLoc = 5112; + rType = 0; + vrLen = 2441; + vrLoc = 4215; + }; + 3442AA9A0EE57922000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 109"; + rLen = 0; + rLoc = 5022; + rType = 0; + vrLen = 2441; + vrLoc = 4215; + }; + 3442AAA20EE58A03000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347712730E8D367F0051DFFD /* InputTableViewController.m */; + rLen = 8; + rLoc = 4951; + rType = 0; + }; + 3442AAA30EE58A03000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347712730E8D367F0051DFFD /* InputTableViewController.m */; + name = "InputTableViewController.m: 141"; + rLen = 8; + rLoc = 4951; + rType = 0; + vrLen = 869; + vrLoc = 4486; + }; + 3442AAA80EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347712720E8D367F0051DFFD /* InputTableViewController.h */; + name = "InputTableViewController.h: 41"; + rLen = 0; + rLoc = 1277; + rType = 0; + vrLen = 1307; + vrLoc = 0; + }; + 3442AAA90EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347A021B0E93CDA200D716CB /* MyCLController.h */; + name = "MyCLController.h: 54"; + rLen = 0; + rLoc = 2701; + rType = 0; + vrLen = 1946; + vrLoc = 1415; + }; + 3442AAAA0EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347712730E8D367F0051DFFD /* InputTableViewController.m */; + name = "InputTableViewController.m: 279"; rLen = 6; - rLoc = 5463; + rLoc = 9813; rType = 0; - vrLen = 1907; - vrLoc = 4609; + vrLen = 2185; + vrLoc = 9035; }; - 3410B70D0ECB7DF800F84035 /* PBXTextBookmark */ = { + 3442AAAB0EE58AA8000B191D /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 349AFEAD0E925AAA008E83C1 /* EditSubjectViewController.m */; - name = "EditSubjectViewController.m: 32"; + fRef = 347A021C0E93CDA200D716CB /* MyCLController.m */; + name = "MyCLController.m: 108"; rLen = 0; - rLoc = 1011; + rLoc = 4200; rType = 0; - vrLen = 1673; - vrLoc = 51; + vrLen = 2026; + vrLoc = 3533; }; - 3410B70E0ECB7DF800F84035 /* PBXTextBookmark */ = { + 3442AAAC0EE58AA8000B191D /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 347710940E8BDA9B0051DFFD /* Icon.png */; + }; + 3442AAAD0EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 213"; + rLen = 195; + rLoc = 11213; + rType = 0; + vrLen = 2642; + vrLoc = 9332; + }; + 3442AAAE0EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 107"; + rLen = 0; + rLoc = 4883; + rType = 0; + vrLen = 2805; + vrLoc = 432; + }; + 3442AAAF0EE58AA8000B191D /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 3481BD500EACF81D00C78F66 /* SettingsViewController.m */; - name = "SettingsViewController.m: 167"; + fRef = 347712730E8D367F0051DFFD /* InputTableViewController.m */; + name = "InputTableViewController.m: 54"; + rLen = 0; + rLoc = 1686; + rType = 0; + vrLen = 1855; + vrLoc = 460; + }; + 3442AAB00EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347A021C0E93CDA200D716CB /* MyCLController.m */; + name = "MyCLController.m: 126"; + rLen = 0; + rLoc = 5054; + rType = 0; + vrLen = 1931; + vrLoc = 1415; + }; + 3442AAB10EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347A021B0E93CDA200D716CB /* MyCLController.h */; + name = "MyCLController.h: 27"; + rLen = 0; + rLoc = 1435; + rType = 0; + vrLen = 2010; + vrLoc = 1337; + }; + 3442AAB20EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347A021C0E93CDA200D716CB /* MyCLController.m */; + name = "MyCLController.m: 126"; + rLen = 0; + rLoc = 5054; + rType = 0; + vrLen = 1854; + vrLoc = 1492; + }; + 3442AAB30EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347712730E8D367F0051DFFD /* InputTableViewController.m */; + name = "InputTableViewController.m: 54"; + rLen = 0; + rLoc = 1686; + rType = 0; + vrLen = 1855; + vrLoc = 460; + }; + 3442AAB40EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347A021C0E93CDA200D716CB /* MyCLController.m */; + name = "MyCLController.m: 140"; + rLen = 8; + rLoc = 5550; + rType = 0; + vrLen = 1822; + vrLoc = 4428; + }; + 3442AAB50EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347712730E8D367F0051DFFD /* InputTableViewController.m */; + name = "InputTableViewController.m: 293"; + rLen = 11; + rLoc = 10403; + rType = 0; + vrLen = 2192; + vrLoc = 9684; + }; + 3442AAB60EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 213"; + rLen = 195; + rLoc = 11213; + rType = 0; + vrLen = 2642; + vrLoc = 9332; + }; + 3442AAB70EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347712730E8D367F0051DFFD /* InputTableViewController.m */; + name = "InputTableViewController.m: 292"; + rLen = 0; + rLoc = 10377; + rType = 0; + vrLen = 2200; + vrLoc = 9684; + }; + 3442AAB80EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347712720E8D367F0051DFFD /* InputTableViewController.h */; + name = "InputTableViewController.h: 41"; + rLen = 0; + rLoc = 1277; + rType = 0; + vrLen = 1307; + vrLoc = 0; + }; + 3442AAB90EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347A021B0E93CDA200D716CB /* MyCLController.h */; + name = "MyCLController.h: 54"; + rLen = 0; + rLoc = 2701; + rType = 0; + vrLen = 2098; + vrLoc = 1256; + }; + 3442AABA0EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347A021C0E93CDA200D716CB /* MyCLController.m */; + name = "MyCLController.m: 139"; + rLen = 8; + rLoc = 5506; + rType = 0; + vrLen = 1982; + vrLoc = 3494; + }; + 3442AABB0EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347712730E8D367F0051DFFD /* InputTableViewController.m */; + name = "InputTableViewController.m: 141"; + rLen = 8; + rLoc = 4951; + rType = 0; + vrLen = 2136; + vrLoc = 3895; + }; + 3442AABC0EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347A021B0E93CDA200D716CB /* MyCLController.h */; + name = "MyCLController.h: 54"; + rLen = 0; + rLoc = 2701; + rType = 0; + vrLen = 1799; + vrLoc = 1562; + }; + 3442AABD0EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347A021C0E93CDA200D716CB /* MyCLController.m */; + name = "MyCLController.m: 139"; + rLen = 8; + rLoc = 5506; + rType = 0; + vrLen = 2111; + vrLoc = 3589; + }; + 3442AABE0EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347712730E8D367F0051DFFD /* InputTableViewController.m */; + name = "InputTableViewController.m: 141"; + rLen = 8; + rLoc = 4951; + rType = 0; + vrLen = 2270; + vrLoc = 6349; + }; + 3442AABF0EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347712720E8D367F0051DFFD /* InputTableViewController.h */; + name = "InputTableViewController.h: 41"; + rLen = 0; + rLoc = 1277; + rType = 0; + vrLen = 1307; + vrLoc = 0; + }; + 3442AAC00EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347A021C0E93CDA200D716CB /* MyCLController.m */; + name = "MyCLController.m: 114"; + rLen = 0; + rLoc = 4515; + rType = 0; + vrLen = 2030; + vrLoc = 3533; + }; + 3442AAC10EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347712730E8D367F0051DFFD /* InputTableViewController.m */; + name = "InputTableViewController.m: 141"; + rLen = 8; + rLoc = 4951; + rType = 0; + vrLen = 2268; + vrLoc = 6349; + }; + 3442AAC20EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347A021C0E93CDA200D716CB /* MyCLController.m */; + name = "MyCLController.m: 114"; + rLen = 65; + rLoc = 4512; + rType = 0; + vrLen = 1979; + vrLoc = 3533; + }; + 3442AAC30EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347A021B0E93CDA200D716CB /* MyCLController.h */; + name = "MyCLController.h: 54"; + rLen = 0; + rLoc = 2701; + rType = 0; + vrLen = 1946; + vrLoc = 1415; + }; + 3442AAC40EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347A021C0E93CDA200D716CB /* MyCLController.m */; + name = "MyCLController.m: 114"; + rLen = 65; + rLoc = 4512; + rType = 0; + vrLen = 1979; + vrLoc = 3533; + }; + 3442AAC50EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347712730E8D367F0051DFFD /* InputTableViewController.m */; + name = "InputTableViewController.m: 279"; + rLen = 6; + rLoc = 9813; + rType = 0; + vrLen = 2185; + vrLoc = 9035; + }; + 3442AAC60EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347A021C0E93CDA200D716CB /* MyCLController.m */; + name = "MyCLController.m: 108"; + rLen = 0; + rLoc = 4200; + rType = 0; + vrLen = 2026; + vrLoc = 3533; + }; + 3442AAC70EE58AA8000B191D /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = 347710940E8BDA9B0051DFFD /* Icon.png */; + }; + 3442AAC80EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 213"; + rLen = 195; + rLoc = 11213; + rType = 0; + vrLen = 2642; + vrLoc = 9332; + }; + 3442AAC90EE58AA8000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3442AA200EE575BA000B191D /* Reachability.h */; + name = "Reachability.h: 23"; + rLen = 0; + rLoc = 1145; + rType = 0; + vrLen = 2564; + vrLoc = 0; + }; + 3442AAD60EE58B6A000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3442AA200EE575BA000B191D /* Reachability.h */; + name = "Reachability.h: 23"; + rLen = 0; + rLoc = 1145; + rType = 0; + vrLen = 2564; + vrLoc = 0; + }; + 3442AAD70EE58B6A000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347A021C0E93CDA200D716CB /* MyCLController.m */; + name = "MyCLController.m: 108"; + rLen = 0; + rLoc = 4200; + rType = 0; + vrLen = 2026; + vrLoc = 3533; + }; + 3442AAD80EE58B6A000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347A021B0E93CDA200D716CB /* MyCLController.h */; + name = "MyCLController.h: 54"; + rLen = 0; + rLoc = 2701; + rType = 0; + vrLen = 1945; + vrLoc = 1415; + }; + 3442AAD90EE58B6A000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347712730E8D367F0051DFFD /* InputTableViewController.m */; + name = "InputTableViewController.m: 279"; rLen = 6; - rLoc = 5463; + rLoc = 9813; + rType = 0; + vrLen = 2240; + vrLoc = 4906; + }; + 3442AADA0EE58B6A000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 3442AA200EE575BA000B191D /* Reachability.h */; + name = "Reachability.h: 23"; + rLen = 0; + rLoc = 1145; + rType = 0; + vrLen = 2564; + vrLoc = 0; + }; + 3442AADB0EE58B6A000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347A021C0E93CDA200D716CB /* MyCLController.m */; + name = "MyCLController.m: 108"; + rLen = 0; + rLoc = 4200; + rType = 0; + vrLen = 2026; + vrLoc = 3533; + }; + 3442AADC0EE58B6A000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347A021B0E93CDA200D716CB /* MyCLController.h */; + name = "MyCLController.h: 54"; + rLen = 0; + rLoc = 2701; + rType = 0; + vrLen = 1945; + vrLoc = 1415; + }; + 3442AADD0EE58B6A000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 347712730E8D367F0051DFFD /* InputTableViewController.m */; + name = "InputTableViewController.m: 279"; + rLen = 6; + rLoc = 9813; + rType = 0; + vrLen = 2240; + vrLoc = 4906; + }; + 3442AADE0EE58B6A000B191D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 133"; + rLen = 0; + rLoc = 6036; rType = 0; - vrLen = 1907; - vrLoc = 4609; + vrLen = 2853; + vrLoc = 4319; }; 344E0D540E91440500483FD6 /* imageCell.h */ = { uiCtxt = { @@ -309,6 +1088,16 @@ modificationTime = 246888798.9999011; state = 2; }; + 346099BC0ED46D9500B731FF /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */; + name = "FixMyStreetAppDelegate.m: 123"; + rLen = 0; + rLoc = 6036; + rType = 0; + vrLen = 3253; + vrLoc = 4698; + }; 347710680E8BD7AA0051DFFD /* FixMyStreet */ = { isa = PBXExecutable; activeArgIndices = ( @@ -351,33 +1140,33 @@ }; 347712720E8D367F0051DFFD /* InputTableViewController.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1229, 756}}"; - sepNavSelRange = "{612, 0}"; - sepNavVisRange = "{0, 1299}"; + sepNavIntBoundsRect = "{{0, 0}, {1229, 753}}"; + sepNavSelRange = "{1277, 0}"; + sepNavVisRange = "{0, 1307}"; sepNavWindowFrame = "{{153, 489}, {750, 558}}"; }; }; 347712730E8D367F0051DFFD /* InputTableViewController.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1229, 4760}}"; - sepNavSelRange = "{8842, 0}"; - sepNavVisRange = "{8672, 1722}"; + sepNavIntBoundsRect = "{{0, 0}, {1229, 4592}}"; + sepNavSelRange = "{9813, 6}"; + sepNavVisRange = "{4906, 2240}"; sepNavWindowFrame = "{{1082, 467}, {750, 558}}"; }; }; 347A021B0E93CDA200D716CB /* MyCLController.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1229, 1148}}"; - sepNavSelRange = "{1435, 0}"; - sepNavVisRange = "{1337, 2015}"; + sepNavSelRange = "{2701, 0}"; + sepNavVisRange = "{1415, 1945}"; sepNavWindowFrame = "{{15, 94}, {738, 1079}}"; }; }; 347A021C0E93CDA200D716CB /* MyCLController.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1229, 2520}}"; - sepNavSelRange = "{2695, 0}"; - sepNavVisRange = "{1912, 1673}"; + sepNavIntBoundsRect = "{{0, 0}, {1229, 2380}}"; + sepNavSelRange = "{4200, 0}"; + sepNavVisRange = "{3533, 2026}"; }; }; 3481BD1F0EACEE3300C78F66 /* EditingTableViewCell.h */ = { @@ -403,7 +1192,7 @@ }; 3481BD500EACF81D00C78F66 /* SettingsViewController.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1229, 2814}}"; + sepNavIntBoundsRect = "{{0, 0}, {1229, 2954}}"; sepNavSelRange = "{5463, 6}"; sepNavVisRange = "{4538, 1931}"; sepNavWindowFrame = "{{15, 94}, {738, 1079}}"; @@ -432,95 +1221,11 @@ 349AFEAD0E925AAA008E83C1 /* EditSubjectViewController.m */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1229, 1834}}"; - sepNavSelRange = "{337, 0}"; - sepNavVisRange = "{51, 1680}"; + sepNavSelRange = "{271, 0}"; + sepNavVisRange = "{0, 1607}"; sepNavWindowFrame = "{{61, 573}, {750, 558}}"; }; }; - 34B318B70ECB7EDB000AD487 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 349AFEAD0E925AAA008E83C1 /* EditSubjectViewController.m */; - name = "EditSubjectViewController.m: 11"; - rLen = 22; - rLoc = 246; - rType = 0; - vrLen = 1680; - vrLoc = 51; - }; - 34B318C60ECB8036000AD487 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 3481BD500EACF81D00C78F66 /* SettingsViewController.m */; - name = "SettingsViewController.m: 167"; - rLen = 6; - rLoc = 5463; - rType = 0; - vrLen = 1931; - vrLoc = 4538; - }; - 34B318C70ECB8036000AD487 /* PBXBookmark */ = { - isa = PBXBookmark; - fRef = 349AFEAD0E925AAA008E83C1 /* EditSubjectViewController.m */; - }; - 34B318C80ECB8036000AD487 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 3481BD500EACF81D00C78F66 /* SettingsViewController.m */; - name = "SettingsViewController.m: 167"; - rLen = 6; - rLoc = 5463; - rType = 0; - vrLen = 1931; - vrLoc = 4538; - }; - 34B318C90ECB8036000AD487 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 349AFEAD0E925AAA008E83C1 /* EditSubjectViewController.m */; - name = "EditSubjectViewController.m: 17"; - rLen = 0; - rLoc = 337; - rType = 0; - vrLen = 1680; - vrLoc = 51; - }; - 34B318CF0ECB8055000AD487 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 349AFEAD0E925AAA008E83C1 /* EditSubjectViewController.m */; - name = "EditSubjectViewController.m: 17"; - rLen = 0; - rLoc = 337; - rType = 0; - vrLen = 1680; - vrLoc = 51; - }; - 34B318D00ECB8055000AD487 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 349AFEAD0E925AAA008E83C1 /* EditSubjectViewController.m */; - name = "EditSubjectViewController.m: 17"; - rLen = 0; - rLoc = 337; - rType = 0; - vrLen = 1680; - vrLoc = 51; - }; - 34BFCFF60ECB7E9C00325DF2 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 349AFEAD0E925AAA008E83C1 /* EditSubjectViewController.m */; - name = "EditSubjectViewController.m: 11"; - rLen = 0; - rLoc = 248; - rType = 0; - vrLen = 1680; - vrLoc = 51; - }; - 34BFD0060ECB7EBC00325DF2 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 349AFEAD0E925AAA008E83C1 /* EditSubjectViewController.m */; - name = "EditSubjectViewController.m: 11"; - rLen = 22; - rLoc = 246; - rType = 0; - vrLen = 1680; - vrLoc = 51; - }; 34C17A8D0EB0CCD300768D1C /* AboutViewController.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {1229, 756}}"; diff --git a/iphone/FixMyStreet/FixMyStreet.xcodeproj/project.pbxproj b/iphone/FixMyStreet/FixMyStreet.xcodeproj/project.pbxproj index 3b3bcea2b..759918450 100755 --- a/iphone/FixMyStreet/FixMyStreet.xcodeproj/project.pbxproj +++ b/iphone/FixMyStreet/FixMyStreet.xcodeproj/project.pbxproj @@ -13,6 +13,8 @@ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765FC0DF74451002DB57D /* CoreGraphics.framework */; }; 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; }; + 3442AA220EE575BA000B191D /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 3442AA210EE575BA000B191D /* Reachability.m */; }; + 3442AA8F0EE578CF000B191D /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3442AA8E0EE578CF000B191D /* SystemConfiguration.framework */; }; 344E0D560E91440500483FD6 /* imageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 344E0D550E91440500483FD6 /* imageCell.m */; }; 344E0E5D0E918B1000483FD6 /* Report.m in Sources */ = {isa = PBXBuildFile; fileRef = 344E0E5C0E918B1000483FD6 /* Report.m */; }; 347710950E8BDA9B0051DFFD /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 347710940E8BDA9B0051DFFD /* Icon.png */; }; @@ -43,6 +45,9 @@ 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; }; 32CA4F630368D1EE00C91783 /* FixMyStreet_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FixMyStreet_Prefix.pch; sourceTree = "<group>"; }; 342F98AE0E951731006935E9 /* Root.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Root.plist; sourceTree = "<group>"; }; + 3442AA200EE575BA000B191D /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = "<group>"; }; + 3442AA210EE575BA000B191D /* Reachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Reachability.m; sourceTree = "<group>"; }; + 3442AA8E0EE578CF000B191D /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; 344E0D540E91440500483FD6 /* imageCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imageCell.h; path = Classes/imageCell.h; sourceTree = "<group>"; }; 344E0D550E91440500483FD6 /* imageCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = imageCell.m; path = Classes/imageCell.m; sourceTree = "<group>"; wrapsLines = 1; }; 344E0E5B0E918B1000483FD6 /* Report.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Report.h; path = Classes/Report.h; sourceTree = "<group>"; }; @@ -80,6 +85,7 @@ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 288765FD0DF74451002DB57D /* CoreGraphics.framework in Frameworks */, 347A02770E93D2A800D716CB /* CoreLocation.framework in Frameworks */, + 3442AA8F0EE578CF000B191D /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -99,6 +105,8 @@ 347A021C0E93CDA200D716CB /* MyCLController.m */, 1D3623240D0F684500981E51 /* FixMyStreetAppDelegate.h */, 1D3623250D0F684500981E51 /* FixMyStreetAppDelegate.m */, + 3442AA200EE575BA000B191D /* Reachability.h */, + 3442AA210EE575BA000B191D /* Reachability.m */, 3481BD1F0EACEE3300C78F66 /* EditingTableViewCell.h */, 3481BD200EACEE3300C78F66 /* EditingTableViewCell.m */, 349AFEAC0E925AAA008E83C1 /* EditSubjectViewController.h */, @@ -158,6 +166,7 @@ 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( + 3442AA8E0EE578CF000B191D /* SystemConfiguration.framework */, 347A02760E93D2A800D716CB /* CoreLocation.framework */, 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, 1D30AB110D05D00D00671497 /* Foundation.framework */, @@ -263,6 +272,7 @@ 3481BD210EACEE3300C78F66 /* EditingTableViewCell.m in Sources */, 3481BD510EACF81D00C78F66 /* SettingsViewController.m in Sources */, 34C17A8F0EB0CCD300768D1C /* AboutViewController.m in Sources */, + 3442AA220EE575BA000B191D /* Reachability.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -303,6 +313,38 @@ }; name = Release; }; + 346099980ED46A5D00B731FF /* Distribution AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = iphoneos2.1; + }; + name = "Distribution AppStore"; + }; + 346099990ED46A5D00B731FF /* Distribution AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CODE_SIGN_ENTITLEMENTS = Entitlements.plist; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: UK Citizens Online Democracy"; + COPY_PHASE_STRIP = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = FixMyStreet_Prefix.pch; + INFOPLIST_FILE = Info.plist; + PRODUCT_NAME = FixMyStreet; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = "74CF3CC5-0ADC-4BF7-A4F1-21B5B4804F9E"; + }; + name = "Distribution AppStore"; + }; 349A563F0ECB108A0091BE4F /* Distribution */ = { isa = XCBuildConfiguration; buildSettings = { @@ -331,7 +373,7 @@ GCC_PREFIX_HEADER = FixMyStreet_Prefix.pch; INFOPLIST_FILE = Info.plist; PRODUCT_NAME = FixMyStreet; - "PROVISIONING_PROFILE[sdk=iphoneos*]" = "E31FC695-9728-4004-B218-CE5B143A1A82"; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = "3A3A6AE0-D989-4F0B-A3B2-5C628CBC57DE"; }; name = Distribution; }; @@ -371,6 +413,7 @@ 1D6058940D05DD3E006BFB54 /* Debug */, 1D6058950D05DD3E006BFB54 /* Release */, 349A56400ECB108A0091BE4F /* Distribution */, + 346099990ED46A5D00B731FF /* Distribution AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -381,6 +424,7 @@ C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, 349A563F0ECB108A0091BE4F /* Distribution */, + 346099980ED46A5D00B731FF /* Distribution AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/iphone/FixMyStreet/Icon.png b/iphone/FixMyStreet/Icon.png Binary files differindex 74da930dd..87e437a18 100755 --- a/iphone/FixMyStreet/Icon.png +++ b/iphone/FixMyStreet/Icon.png diff --git a/iphone/FixMyStreet/MainViewController.xib b/iphone/FixMyStreet/MainViewController.xib index 121bbe018..9307bd96e 100644 --- a/iphone/FixMyStreet/MainViewController.xib +++ b/iphone/FixMyStreet/MainViewController.xib @@ -57,7 +57,7 @@ <object class="IBUIButton" id="323841673"> <reference key="NSNextResponder" ref="191373211"/> <int key="NSvFlags">292</int> - <string key="NSFrame">{{282, 377}, {18, 19}}</string> + <string key="NSFrame">{{272, 367}, {18, 19}}</string> <reference key="NSSuperview" ref="191373211"/> <bool key="IBUIOpaque">NO</bool> <bool key="IBUIClearsContextBeforeDrawing">NO</bool> diff --git a/iphone/FixMyStreet/MyCLController.h b/iphone/FixMyStreet/MyCLController.h index 6d8c4e1da..37dd54a3e 100755 --- a/iphone/FixMyStreet/MyCLController.h +++ b/iphone/FixMyStreet/MyCLController.h @@ -51,7 +51,7 @@ Copyright (C) 2008 Apple Inc. All Rights Reserved. @protocol MyCLControllerDelegate <NSObject> @required -(void)newLocationUpdate:(CLLocation *)location; --(void)newError:(NSString *)text; +-(void)newLocationError:(NSString *)text; @end diff --git a/iphone/FixMyStreet/MyCLController.m b/iphone/FixMyStreet/MyCLController.m index df2fa08f7..0e996e242 100755 --- a/iphone/FixMyStreet/MyCLController.m +++ b/iphone/FixMyStreet/MyCLController.m @@ -110,7 +110,8 @@ static MyCLController *sharedCLDelegate = nil; // can reset this for all apps by going to Settings > General > Reset > Reset Location Warnings. // case kCLErrorDenied: - [errorString appendFormat:@"%@\n", NSLocalizedString(@"LocationDenied", nil)]; + [self.locationManager stopUpdatingLocation]; + [self.delegate newLocationError:@"FixMyStreet needs your location to know where your problem is."]; break; // This error code is usually returned whenever the device has no data or WiFi connectivity, |