Skip to main content

Objective-C (iOS) (0.1.0)

You are reading documentation for an outdated version. Here’s the latest one!

1. Overview‚Äč

The Snowplow iOS Tracker allows you to track Snowplow events from your iOS apps and games. It supports iOS 7.0+.

The tracker should be straightforward to use if you are comfortable with iOS development; its API is modelled after Snowplow's Python Tracker so any prior experience with that tracker is helpful but not necessary. If you haven't already, have a look at the iOS Tracker Setup guide before continuing.

You can also find detailed documentation for the method calls in the tracker classes available as part of the CocoaPods documentation.

2. Initialization‚Äč

Assuming you have completed the iOS Tracker Setup for your project, you are now ready to initialze the Snowplow Tracker.

2.1 Importing the library‚Äč

Adding the library into your project is as simple as adding the headers into your class file:

#import <SnowplowTracker.h>
#import <SnowplowRequest.h>

That's it - you are now ready to initialize a tracker instance.

2.2 Creating a tracker‚Äč

To instantiate a tracker in your code simply instantiate the SnowplowTracker class with the constructor:

- (id) initWithCollector:(SnowplowRequest *)collector_
appId:(NSString *)appId_
namespace:(NSString *)namespace_

For example:

SnowplowTracker *t1 = [[SnowplowTracker alloc] initWithCollector:collector appId:@"AF003" base64Encoded:false namespace:@"cloudfront"];
Argument NameDescription
collectorThe SnowplowRequest object you create
namespaceThe name of the tracker instance
appIdThe application ID
base64EncodedWhether to enable base 64 encoding


This is a single SnowplowRequest object that will be used to send all the tracking events created by the SnowplowTracker to a collector. See Sending events for more on its configuration.


If provided, the namespace argument will be attached to every event fired by the new tracker. This allows you to later identify which tracker fired which event if you have multiple trackers running.


The appId argument lets you set the application ID to any string.


By default, unstructured events and custom contexts are encoded into Base64 to ensure that no data is lost or corrupted. You can turn encoding on or off using the Boolean base64Encoded argument.

3. Adding extra data‚Äč

The iOS Tracker automatically collects your platform, screen resolution, viewport, color depth, timezone and language from the device.

You can set additional information using the following methods:

3.1 Set user ID with¬†setUserId‚Äč

You can track a given user of your app by setting their user IDt to any string:

You can set the user ID :

s1.setUserId( "{{USER ID}}" )


[tracker setUserId:@"alexd"];

4. Tracking specific events‚Äč

Snowplow has been built to enable you to track a wide range of events that occur when users interact with your websites and apps. We are constantly growing the range of functions available in order to capture that data more richly.

Tracking methods supported by the iOS Tracker at a glance:

trackScreenView:Track the user viewing a screen within the application
trackPageView:Track and record views of web pages.
trackEcommerceTransaction:Track an ecommerce transaction and its items
trackStructuredEvent:Track a Snowplow custom structured event
trackUnstructuredEvent:Track a Snowplow custom unstructured event

4.1 Common‚Äč

All events are tracked with specific methods on the tracker instance, of the form trackXXX(), where XXX is the name of the event to track.

4.1.1 Custom contexts‚Äč

In short, custom contexts let you add additional information about the circumstances surrounding an event in the form of an NSDictionary object. Each tracking method accepts an additional optional contexts parameter after all the parameters specific to that method:

- (void) trackPageView:(NSString *)pageUrl
title:(NSString *)pageTitle
referrer:(NSString *)referrer;
- (void) trackPageView:(NSString *)pageUrl
title:(NSString *)pageTitle
referrer:(NSString *)referrer
context:(NSMutableArray *)context;
- (void) trackPageView:(NSString *)pageUrl
title:(NSString *)pageTitle
referrer:(NSString *)referrer
- (void) trackPageView:(NSString *)pageUrl
title:(NSString *)pageTitle
referrer:(NSString *)referrer
context:(NSMutableArray *)context

The context argument should consist of a NSArray of NSDictionary representing an array of one or more contexts. The format of each individual context element is the same as for an unstructured event.

If a visitor arrives on a page advertising a movie, the context dictionary might look like this:

"schema": "iglu:com.acme_company/movie_poster/jsonschema/2.1.1",
"data": {
"movie_name": "The Guns of Navarone",
"poster_country": "US",
"poster_year": "1961"

Note that even if there is only one custom context attached to the event, it still needs to be placed in an array.

4.1.2 Optional timestamp & context argument‚Äč

In all the trackers, we offer a way to set the timestamp if you want the event to show as tracked at a specific time. If you don't, we create a timestamp while the event is being tracked.

Here is an example:

[tracker trackPageView:@"" title:@"Example Page" referrer:@""];
[tracker trackPageView:@"" title:@"Example Page" referrer:@"" context:contextArray];
[tracker trackPageView:@"" title:@"Example Page" referrer:@"" timestamp:1234567890];
[tracker trackPageView:@"" title:@"Example Page" referrer:@"" context:contextArray timestamp:1234567890];

4.1.3 Tracker method return values‚Äč

To be confirmed. As of now, trackers do not return anything.

4.2 Track screen views with¬†trackScreenView:‚Äč

Use trackScreenView: to track a user viewing a screen (or equivalent) within your app. Arguments are:

nameHuman-readable name for this screenNoNSString*
id_Unique identifier for this screenNoNSString*
contextCustom context for the eventNoNSMutableArray*
timestampOptional timestamp for the eventNodouble


[t1 trackScreenView:@"HUD > Save Game" screen:@"screen23"];
[t1 trackScreenView:@"HUD > Save Game" screen:nil timestamp:12435678];
[t1 trackScreenView:@"HUD > Save Game" screen:@"screen23" timestamp:12435678];

4.3 Track pageviews with¬†trackPageView:‚Äč

Use trackPageView: to track a user viewing a page within your app.

Arguments are:

pageUrlThe URL of the pageYesNSString*
pageTitleThe title of the pageYesNSString*
referrerThe address which linked to the pageYesNSString*
contextCustom context for the eventNoNSMutableArray*
timestampOptional timestamp for the eventNodouble


[t1 trackPageView:@"" title:@"example" referrer:@"" context:contextList];
[t1 trackPageView:@"" title:@"example" referrer:@""];

4.4 Track ecommerce transactions with¬†trackEcommerceTransaction:‚Äč

Use trackEcommerceTransaction: to track an ecommerce transaction. Arguments:

orderIdID of the eCommerce transactionYesNSString*
totalValueTotal transaction valueYesfloat
affiliationTransaction affiliationNoNSString*
taxValueTransaction tax valueNofloat
shippingDelivery cost chargedNofloat
cityDelivery address cityNoNSString*
stateDelivery address stateNoNSString*
countryDelivery address countryNoNSString*
`currencyTransaction currencyNoNSString*
itemsItems in the transactionYesNSMutableArray*
contextCustom context for the eventNoNSMutableArray*
tstampWhen the transaction event occurredNodouble

The items argument is an NSArray of SnowplowPayload* representing dictionaries of the items in the transaction created using trackEcommerceTransactionItem:. trackEcommerceTransaction: fires multiple events: one "transaction" event for the transaction as a whole, and one "transaction item" event for each element of the items array. Each transaction item event will have the same timestamp, orderId, and currency as the main transaction event.

These are the fields that can appear in a transaction item dictionary:

"sku"Item SKUYesNSString*
"price"Item priceYesfloat
"quantity"Item quantityYesfloat
"name"Item nameNoNSString*
"category"Item categoryNoNSString*
"context"Custom context for the eventNoNSMutableArray*

Example of tracking a transaction containing two items:

NSMutableArray *itemArray = [NSMutableArray array];
[itemArray addObject:[t trackEcommerceTransaction:@"6a8078be" sku:@"pbz0026" name:"Hot Chocolate" category:@"Drink" price:50 quantity:1 currency:@"USD"]];
[t trackEcommerceTransaction:@"6a8078be" totalValue:350 affiliation:@"no_affiliate" taxValue:10 shipping:15 city:@"Boston" state:@"Massachusetts" country:@"USA" items=itemArray];

4.5 Track structured events with¬†trackStructuredEvent:‚Äč

Use trackStructuredEvent: to track a custom event happening in your app which fits the Google Analytics-style structure of having up to five fields (with only the first two required):

categoryThe grouping of structured events which this action belongs toYesNSString*
actionDefines the type of user interaction which this event involvesYesNSString*
labelA string to provide additional dimensions to the event dataYesNSString*
propertyA string describing the object or the action performed on itYesNSString*
valueA value to provide numerical data about the eventYesint
contextCustom context for the eventNoNSMutableArray*
timestampOptional timestamp for the eventNodouble


[t1 trackStructuredEvent:@"shop" action:@"add-to-basket" label:@"Add To Basket" property:@"pcs" value:27];
[t1 trackStructuredEvent:@"shop" action:@"add-to-basket" label:@"Add To Basket" property:@"pcs" value:27 timestamp:1234569];

4.6 Track unstructured events with¬†trackUnstructuredEvent:‚Äč

Custom unstructured events are a flexible tool that enable Snowplow users to define their own event types and send them into Snowplow.

When a user sends in a custom unstructured event, they do so as a JSON of name-value properties, that conforms to a JSON schema defined for the event earlier.

Use trackUnstructuredEvent: to track a custom event which consists of a name and an unstructured set of properties. This is useful when:

  • You want to track event types which are proprietary/specific to your business (i.e. not already part of Snowplow), or
  • You want to track events which have unpredictable or frequently changing properties

The arguments are as follows:

eventJsonThe properties of the eventYesNSDictionary*
contextCustom context for the eventNoNSMutableArray*
timestampOptional timestamp for the eventNodouble


- (void) trackUnstructuredEvent:(NSDictionary *)eventJson
context:(NSMutableArray *)context

If you supply a NSDictionary*, make sure that this top-level contains your schema and data keys, and then store your data properties as a child NSDictionary*.


NSDictionary* eventJson = [NSDictionary dictionaryWithObjectsAndKeys:
"iglu:com.snowplowanalytics.snowplow/example/jsonschema/1-0-0", "schema",
"data", "{\"src\": \"Images\/Sun.png\", \"name\": \"sun1\", \"hOffset\": 250, \"vOffset\": 250, \"alignment\": \"center\"}"];
tracker trackUnstructuredEvent:eventJson

For more on JSON schema, see the blog post.

5. Sending events:¬†SnowplowRequest‚Äč

Events created by the Tracker are sent to a collector using a SnowplowRequest instance. You can create one using one of the init methods:

- (id) initWithURLRequest:(NSURL *)url
httpMethod:(NSString *)method
bufferOption:(enum SnowplowBufferOptions)option;
- (id) initWithURLRequest:(NSURL *)url
httpMethod:(NSString* )method;

For example:

NSURL *url = [[NSURL alloc] initWithString:@""];
SnowplowRequest emitter = [[SnowplowRequest alloc] initWithURLRequest:url
SnowplowRequest emitter2 = [[SnowplowRequest alloc] initWithURLRequest:url

5.1 Using a buffer‚Äč

A buffer is used to group events together in bulk before sending them. This is especially handy to reduce network usage. By default, the SnowplowRequest buffers up to 10 events before sending them.

You can set this during the creation of a SnowplowRequest object or using the setter -(void)setBufferOption:

NSURL *url = [[NSURL alloc] initWithString:@""];
SnowplowRequest emitter = [[SnowplowRequest alloc] initWithURLRequest:url
SnowplowRequest emitter2 = [[SnowplowRequest alloc] initWithURLRequest:url
[emitter setBufferOption:SnowplowBufferInstant];

Here are all the posibile options that you can use:

SnowplowBufferInstantEvents are sent as soon as they are created
SnowplowBufferDefaultSends events in a group when 10 events are created

5.2 Choosing the HTTP method‚Äč

Snowplow supports receiving events via GET requests, but will soon have POST support. In a GET request, each event is sent in individual request. With POST requests, events are bundled together in one request.

Here are all the posibile options that you can use:

@"GET"Events are sent individually as GET requests
@"POST"Events are sent in a group when 10 events are received in one POST request

5.3 Sending HTTP requests‚Äč

You can set this during the creation of a SnowplowRequest object:

NSURL *url = [[NSURL alloc] initWithString:@""];
SnowplowRequest emitter = [[SnowplowRequest alloc] initWithURLRequest:url
SnowplowRequest emitter2 = [[SnowplowRequest alloc] initWithURLRequest:url
Was this page helpful?