I'm finding that MKMapView userLocation returns the wrong location on iOS 5.0.1 but the right location for iOS 4.2.1. Both the blue dot and the value passed to delegate method didUpdateUserLocation are consistent with property userLocation (and hence also wrong on iOS5).
Oddly the wrong location is consistently just off Regents Circus in London (60 miles away from my actual location).
These results are from running on an iPhone 3GS and iPhone 4, both with Location Services enabled.
Anyone experience similar strangeness?
Just to rule this out, are you building these off the simulator using Xcode 4.2? If so you may have set the schema you are using to have a default location. If you open Edit Schema you can check it out under Options.
Is there anyway to test the navigation functionality in MonoTouch using the iPhone simulator? Or will I need to write a wrapper class with timer events?
If you have the current beta version you can simulate other positions as well. There are buttons in XCode to choose from some predefined positions or your own positions.
In the simulator there is a menu item called 'Debug' -> 'Location' where you can choose your positions as well.
You should also be able to create a whole list of positions which are simulated.
While Debugging in XCode:
Location simulation
Now you can test your location-based features in your app without leaving your desk. You can now select from preset locations and routes within the iOS Simulator and pick a custom latitude and longitude with accuracy while you're running your simulated app.
Source: http://developer.apple.com/technologies/ios5/
I don't know much about mono touch but I do know that in the simulator there is no way to test a locationManager without a wrapper class as you suggested. The delegate methods will never be called because the pseudo position is always fixed.
I have integrated the myAnnotationview custiomed api in to my project.And i have added some address on it.I want to test it from iphone simulator.Is it possible?How can i achieve it?Do i need to ON anything in Simulator?
Thanks
I'm not sure what the problem is or what you hope to achieve. You can add a custom annotation to a specific location specifying the coordinate using CLLocationCoordinate2DMake( , );
If you are interested in your current address, use CLLocationManager for the specific location. On the simulator on a MKMapView your current location is always Infinite Loop at San Jose, California.
I'm looking since quite a long time something like a CLLocationManager simulator that would enable me to simulate GPS positions (CLLocation instances that could be retrieved through the CLLocationManager standard delegate mechanism) along a predefined route for instance (with a KML or GPX file
as input, or whatever, but KML would be nice ;).
Something like this is available on the Android emulator and I was wondering if anything like this would exist for the iPhone simulator.
At least this would be great and would speed up testing on the simulator instead of having to drive for real.... :/
If nothing like this exists, what would be your approach to fake such behavior and implement the simulator in such a way that the client is not impacted? (No code change in the delegate of the CLLocationManager for instance.)
Thanks for your links, hints, approaches...
You can't inject the simulator, but you can subclass CoreLocation:
http://code.google.com/p/dlocation/
which subclasses CoreLocationDelegate to return real data on a device and data from a text file when on the simulator.
More info here
Testing CoreLocation on iPhone Simulator
HTH
I think the best approach is to take control from the CLLocationManager by implementing your own category for it and simulate your expected behavior.
I put a description of this approach here :
Testing CoreLocation on iPhone Simulator
I want to allow users to set the GPS information on the iPhone Simulator via GUI.
But I'm not sure how to archieve this - it seems that this tool called iSimulate does this somehow by installing an own SDK. But I can't figure out how they "override" / "hack" the simulator by that.
Thanks!
Added a second answer since there are now integrated features in Xcode (≥4.2). There are two ways to simulate location updates:
In the iOS Simulator, under "Debug/Location" you're able to specify a constant latitude/longitude or select several predefined profiles like "City Run" or "Freeway Drive".
In Xcode there's a new location icon in the debugger, right next to the Step Out button. It lets you select several hardcoded cities worldwide and add a custom GPX file to your project. The nice thing about location simulation in Xcode is that it also works on the device (just don't forget to turn it off again otherwise your auto timezone will be wrong!). The custom GPX file is nice, too, although it sometimes crashes Xcode if the GPX file is not recognized. Make sure you use <wpt> tags only:
<?xml version="1.0"?>
<gpx version="1.1" creator="Xcode">
<wpt lat="47.52789018096815" lon="7.385249894876031"></wpt>
<wpt lat="47.52720984945248" lon="7.382647784661411"></wpt>
...
</gpx>
As far as I know, iSimulate is not employing any hacks. It is code that runs within your app on the Simulator which communicates with a device over the network. When it receives messages from the device (touches, GPS, acceleration) it simulates those events by calling your app's code as though the system had triggered them.
For example, to receive GPS location updates you must create an instance of CLLocationManager and then configure one of your classes to be its delegate. Well, on the iPhone Simulator you can instead start code that sends fake messages to your delegate instead. If you just call a delegate's method like this:
[delegate locationManager:nil didUpdateToLocation:newLocation fromLocation:oldLocation];
Your code won't have to know that the location update is fake. If you want to get fancy, you could create a new class that implements all the public methods of CLLocationManager but which sends fake messages instead. (Since Objective-C is dynamically typed, it won't need to be a subclass, as long as it responds to all the messages you send.)
As a side note, you can use these compiler macros to keep code simulator-only:
#if TARGET_IPHONE_SIMULATOR
locationManager = (id)[[MyFakeLocationManager alloc] init];
#else
locationManager = [[CLLocationManager alloc] init];
#endif
The iOS Simulator has full location simulation built in. From the "Debug" menu, you can explore your various location options.
Original answer posted while under NDA.
Check out the bottom right entry on this page. I'm under the NDA so I can't say anything except that it has saved me significant gas money. :)
1: http://developer.apple.com/technologies/ios5/
You might wanna check out my FTLocationSimulator at http://github.com/futuretap/FTLocationSimulator
It reads a KML file generated by Google Earth to provide continuous location updates. It also updates the blue userLocation dot in a MKMapView with the simulated location updates.
In Xcode 4.2 we can simulate . There is a location symbol on the debug area (while you run the app). There are some predefined locations . Also we can add new GPX files
Hy stephanos,
The information of the GPS cannot be changed. It is protected and I don't believe that iSimulate can change it.
As far as I know, iSimulate is a tool to send commands from a device to the iPhone simulator, like accelerometer, touches, orientation, etc, including the current GPS location.
The SDK of iSimulate works with the app. You have to install the app in the device and add the sdk to your project, so you don't need to buld and run your app to the device all the time that you would be doing normally.
Cheers,
VFN
Check out https://github.com/100grams/CoreLocationUtils
Just to extend #Ortwin Gentz answer:
If you need further config of every gps point in your gpx file. Take a look at this page:
http://www.topografix.com/gpx_manual.asp
It tells you exactly how you can provide further details like speed and height of a specific point.