From 848e8bc2225ad9fff00dcd47447ce683375b3c71 Mon Sep 17 00:00:00 2001 From: Dane Springmeyer Date: Fri, 26 Jul 2013 14:11:12 -0700 Subject: [PATCH] add page on iOS --- iOS.md | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 iOS.md diff --git a/iOS.md b/iOS.md new file mode 100644 index 0000000..3560296 --- /dev/null +++ b/iOS.md @@ -0,0 +1,54 @@ +# Mapnik on iOS + +Mapnik runs natively on iOS since v2.2.0. Previous versions of the code would run fine on iOS, but the build system was not adapted to easily produce binaries, so in reality v2.2.0 is the first version to support iOS. + +A Mapnik iOS SDK [is available](http://mapnik.org/download/) that includes everything in a single place to leverage Mapnik on iOS: + +It includes: + + - Mapnik as a static library (`libmapnik.a`) + - All Mapnik headers + - All libraries and headers of all Mapnik dependencies + - Mapnik datasource input plugins compiled statically into `libmapnik.a` + +Gochas: + +1) Supporting reading images + +If you need Mapnik to support reading images, then you need to compile the image readers directly into your app because otherwise they will not be available. Specifically what this means is that if you want Mapnik to be able to load PNG's and you are using Mapnik v2.2.0 then you need to: + + - Grab this [cpp file](https://github.com/mapnik/mapnik/blob/v2.2.0/src/png_reader.cpp) + - Comment out these [two lines](https://github.com/mapnik/mapnik/blob/v2.2.0/src/png_reader.cpp#L93-L94) + - Drop the `png_reader.cpp` into your project code folder and then + - Include it in your `.mm` file like: `#import "../png_reader.cpp"` + - At app startup (like in `viewDidLoad`) call `register_image_reader("png",mapnik::create_png_reader);` + - If you want to support reading images from a in memory stream also do `register_image_reader("png",mapnik::create_png_reader2);` + +2) Profiling + +If you want to use the `Time profiler` in Instruments.app to profile your app using Mapnik by default what you see will be something like this when inspecting the call graph: + + + +Where `mapnik-test` is the name of the app and notice the actual symbol names are missing. This makes it impossible to know which functions are being called. + +To fix this you need to know several things and then you willbe equipped to set up Instruments to get access to your function symbols (and the ones inside Mapnik). + + - Check whether your Profile `scheme` (as xcode calls different build variants) is being build as debug or release. Both will work for profiling as far as symbols go. To know the scheme go to the Xcode menu and choose `Product > Scheme > Edit Scheme` and then on the left side of the drawer choose "Profile" then note whether the "Build Configuration" is Release or Debug for your given app and destination device. + + - Find your XCode `DerivedData` folder, which is where builds actually go. It is normally at `~/Library/Developer/Xcode/DerivedData` + + - Recommended: clear out all the data inside `DerivedData`. This makes it easier, once you do another build, to see exactly which folder gets created. + + - Go back to Xcode and actually profile your app by choosing `Product > Profile`. Then it will run, launch Instruments, and you should use the app to trigger meaningful work then stop the profiling run. + + - Now, finally, to get the symbol names to show up in Instruments go to `File > Re-Symbolicate Document...` and you will be brought to a window like this: + + + + - Search for your app by name and notice the `???` in the `dSYM` column which is an indication that the symbols are missing because the app is not yet associated with a `.dSYM` file. So now hit the `Locate` button and browse to `~/Library/Developer/Xcode/DerivedData//Build/Products// +