A little late to the game, but I come bearing code. I've tinkered with PinchMedia, Flurry, and Localytics and had settled on Flurry. Most features were a wash between the three, with a few minor differences, e.g.
At the time I compared them, I don't think Localytics had any compelling API features that the others didn't have.
As I recall, the other big defining feature was how long it took for stats to register on their respective web sites. It's been awhile since I compared them (way before the Flurry/PinchMedia merge), but from what I remember Localytics was the fastest, Flurry was decent but not real time, and Pinch Media was the slowest.
For me it came down to personal preference. Flurry's exception reporting sealed the deal (also before Apple started collecting crash reports for us).
To make it easier to switch between the analytics libraries, I cobbled together a set of #define macros (see below). To use them, you can define a single preprocessor constant (USE_PINCH_MEDIA, USE_FLURRY, or USE_LOCALYTICS). If none of them are defined, the macros are no-ops with a logging statement. This makes it easy to disable analytics in your Debug build and turn it on in your Release or Distribution builds. You could even make different configurations for each service, but I didn't go that far.
John
/**
* Analytics Macros
*
* START_ANALYTICS
* END_ANALYTICS
*
* EVENT_ANALYTICS(eventName)
* EVENT_ANALYTICS_START_CUSTOM(eventName, params) --> param events only on Flurry Analytics
*
* EVENT_ANALYTICS_START(eventName) --> timed events only on Pinch Media
* EVENT_ANALYTICS_END(eventName)
*
* REPORT_ERROR_TO_ANALYTICS(errorName, errorMessage, e) --> error logs only on Flurry Analytics
*/
#if defined(USE_PINCH_MEDIA)
#import "Beacon.h"
#define API_KEY (@"...")
#define ANALYTICS_NAME @"PinchMedia"
#endif
#if defined(USE_FLURRY)
#import "FlurryAPI.h"
#define API_KEY (@"...")
#define ANALYTICS_NAME @"Flurry Analytics"
#endif
#if defined(USE_LOCALYTICS)
#import "LocalyticsSession.h"
#define API_KEY (@"...")
#define ANALYTICS_NAME @"Localytics"
#endif
//
// Declare Pinch Media macros.
//
#if defined(USE_PINCH_MEDIA)
#define START_ANALYTICS \
NSLog(@"Initializing PinchMedia.");\
[Beacon initAndStartBeaconWithApplicationCode:API_KEY useCoreLocation:YES useOnlyWiFi:NO];
#define END_ANALYTICS [Beacon endBeacon];
#define EVENT_ANALYTICS(eventName)\
NSLog(@"PINCHMEDIA: Event '%@'.", eventName);\
[[Beacon shared] startSubBeaconWithName:eventName timeSession:NO];
#define EVENT_ANALYTICS_START(eventName)\
NSLog(@"PINCHMEDIA: Timed event '%@'.", eventName);\
[[Beacon shared] startSubBeaconWithName:eventName timeSession:YES];
#define EVENT_ANALYTICS_START_CUSTOM(eventName, params)\
NSLog(@"PINCHMEDIA: Custom event '%@' (params not supported: %@).", eventName, params);\
[[Beacon shared] startSubBeaconWithName:eventName timeSession:NO];
#define EVENT_ANALYTICS_END(eventName)\
NSLog(@"PINCHMEDIA: End of timed event '%@'.", eventName);\
[[Beacon shared] endSubBeaconWithName:eventName];
#define REPORT_ERROR_TO_ANALYTICS(errorName, errorMessage, e)\
NSLog(@"PINCHMEDIA: Error Reporting not supported: '%@' (%@) - %@", errorName, errorMessage, e);
#endif
//
// Declare Flurry Analytics macros.
//
#if defined(USE_FLURRY)
#define START_ANALYTICS \
NSLog(@"Initializing Flurry Analytics.");\
[FlurryAPI startSession: API_KEY];\
[FlurryAPI setSessionReportsOnCloseEnabled:YES];
#define END_ANALYTICS
#define EVENT_ANALYTICS(eventName)\
NSLog(@"FLURRY: Event '%@'.", eventName);\
[FlurryAPI logEvent:eventName];
#define EVENT_ANALYTICS_START(eventName)\
NSLog(@"FLURRY: Event '%@' (event duration not supported).", eventName);\
[FlurryAPI logEvent:eventName];
#define EVENT_ANALYTICS_START_CUSTOM(eventName, params)\
NSLog(@"FLURRY: Event with params '%@' %@.", eventName, params);\
[FlurryAPI logEvent:eventName withParameters: params];
#define EVENT_ANALYTICS_END(eventName)
#define REPORT_ERROR_TO_ANALYTICS(errorName, errorMessage, e)\
NSLog(@"FLURRY: Error Reported: '%@' (%@) - %@", errorName, errorMessage, e);\
#endif
//
// Declare Localytics macros.
//
#if defined(USE_LOCALYTICS)
#define START_ANALYTICS \
NSLog(@"Initializing Localytics.");\
[[LocalyticsSession sharedLocalyticsSession] startSession:API_KEY];
#define END_ANALYTICS \
[[LocalyticsSession sharedLocalyticsSession] close];\
[[LocalyticsSession sharedLocalyticsSession] upload];
#define EVENT_ANALYTICS(eventName)\
NSLog(@"LOCALYTICS: Event '%@'.", eventName);\
[[LocalyticsSession sharedLocalyticsSession] tagEvent:eventName];
#define EVENT_ANALYTICS_START(eventName)\
NSLog(@"LOCALYTICS: Event '%@' (event duration not supported).", eventName);\
[[LocalyticsSession sharedLocalyticsSession] tagEvent:eventName];
#define EVENT_ANALYTICS_START_CUSTOM(eventName, params)\
NSLog(@"LOCALYTICS: Custom event '%@' (params not supported: %@).", eventName, params);\
[[LocalyticsSession sharedLocalyticsSession] tagEvent:eventName];
#define EVENT_ANALYTICS_END(eventName)
#define REPORT_ERROR_TO_ANALYTICS(errorName, errorMessage, e)\
NSLog(@"LOCALYTICS: Error Reporting not supported: '%@' (%@) - %@", errorName, errorMessage, e);
#endif
//
// Blank out definitions if neither framework is enabled.
//
#if !defined(USE_PINCH_MEDIA) && !defined(USE_FLURRY) && !defined(USE_LOCALYTICS)
#define START_ANALYTICS\
NSLog(@"No analytics frameworks enabled.");
#define END_ANALYTICS
#define EVENT_ANALYTICS(eventName)\
NSLog(@"No-op analytics for event: '%@'.", eventName);
#define EVENT_ANALYTICS_START(eventName)\
NSLog(@"No-op analytics for timed event: '%@'.", eventName);
#define EVENT_ANALYTICS_START_CUSTOM(eventName, params)\
NSLog(@"No-op analytics for custom event: '%@' %@.", eventName, params);
#define EVENT_ANALYTICS_END(eventName)\
NSLog(@"No-op analytics for timed event completion: '%@'.", eventName);
#define REPORT_ERROR_TO_ANALYTICS(errorName, errorMessage, e)\
NSLog(@"No-op analytics for Error Reporting: '%@' (%@) - %@", errorName, errorMessage, e);
#endif