Skip to main content

iOS and Android Campaign Measurement for App installs

Android: Google Play Campaign Measurement

Google Play Campaign Measurement is a feature of Google Mobile App Analytics that enables the attribution of native Android app installs to advertising campaigns and other marketing efforts in your Google Analytics app reports. Verifying that your Google Play Campaign Measurement implementatin is working properly before the application is submitted to Google Play ensures that campaign measurement data is as accurate as possible at the time of launch.

This guide will illustrate one means of testing a Google Play Campaign Measurement implementation.

iOS: Cookie Tracking / Browser Identification

For iOS no such standard way exists. The main workarounds involve the setting of a cookie in the ad and then opening a WebView with the ad again after install - alternate identify the device by the informations the browser publishes (IP, accept-encoding, ...).
There are some rumors Apple would reject apps for cookie tracking...

Apple provides an Identifier for Vendor (same among same apps installed on device) and an Identifier for Advertisement, but both are available In-App only.

The main methods:
  • Device Fingerprinting
  • UDID (Deprecated)
  • OpenUDID/Copy-and-Pasteboard
  • MAC Address (Deprecated)
  • ODIN
  • Cookie Tracking
  • TRUSTed Mobile Ads
  • Apple Advertising Identifier and Identifier for Vendor
  • Android Referrer (see above)

Apple ID APIs

  • UDID
    • Deprecated
  • Application ID
    • Scope: App
    • Lifetime: Uninstall app
    • Backed up: Yes
    • Restores across devices: Yes
  • Vendor ID
    • Scope: Developer
    • Lifetime: Uninstall developer's apps
    • Backed up: Yes
    • Restores across devices: No
  • Advertising ID
    • Scope: Device
    • Lifetime: Erase all Content and Settings
    • Backed up: Yes
    • Restores across devices: No

Pros & Cons of the Top Mobile App Tracking Methods with a nice overview of the main methods


Most Favorite Posts

Using Speech with iOS and Android: SiriKit, Voice Capabilities, Google Assistant

SiriKit enables your iOS apps and watchOS apps to work with Siri, so users can get things done using just their voice. Your content and services can be used in new scenarios including access from the lock screen and hands-free use.

Apps adopt SiriKit by building an extension that communicates with Siri, even when your app isn’t running. The extension registers with specific domains and intents that it can handle. For example, a messaging app would likely register to support the Messages domain, and the intent to send a message. Siri handles all of the user interaction, including the voice and natural language recognition, and works with your extension to get information and handle user requests.

Apple Developer

Adding Voice Capabilites

Voice actions are an important part of the wearable experience. They let users carry out actions hands-free and quickly. Wear provides two types of voice actions:

These voice actions are task-based and are built into the Wear platfo…

How to link to TestFlight App in iOS

There are two things you need to do. First, check to see if TestFlight is installed. Then create a new link to your app.

NSURL *customAppURL = [NSURL URLWithString:@"itms-beta://"];
if ([[UIApplication sharedApplication] canOpenURL:customAppURL]) {

    // TestFlight is installed

    // Special link that includes the app's Apple ID
    customAppURL = [NSURL URLWithString:@""]; 
    [[UIApplication sharedApplication] openURL:customAppURL];

This special URL will be opened directly in TestFlight.

Finally, if you are using iOS 9 (or later), you need to make an addition to your Info.plist to get the canOpenURL: method to work.

If your app is linked on or after iOS 9.0, you must declare the URL schemes you want to pass to this method. Do this by using the LSApplicationQueriesSchemes array in your Xcode project’s Info.plist file. For each URL scheme you want your app to use with this method, add it …

Running Espresso Tests in parallel with Spoon and Android Test Sharding

Introduction to Android Espresso Testing and Spoon

Espresso UI test automation framework is Google’s de-facto testing platform for Android app developers.

No test engineer or developer will be quite unless it validates the functionality of his app on multiple devices and emulators. For that, there is another widely used tool called Spoon (there are also cloud-based solutions as mentioned above that support parallel execution on real devices). This tool, will collect all the target devices (that are visible via adb devices) test results and aggregate them into one HTML view that can be easily investigated.

Mobile Testing Blog

Android Test Sharding

The test runner supports splitting a single test suite into multiple shards, so you can easily run tests belonging to the same shard together as a group, under the same Instrumentation instance. Each shard is identified by an index number. When running tests, use the -e numShards option to specify the number of separate shards to create and the…

Implementing UI tests on iOS and Android using screenshot comparison tools

Have you ever thought when writing or maintaining UI tests, there must be a better way?

Take a look at screenshot tests provided by Google Firebase and Facebook:

A "snapshot test case" takes a configured UIView or CALayer and uses the renderInContext: method to get an image snapshot of its contents. It compares this snapshot to a "reference image" stored in your source code repository and fails the test if the two images don't match.

GitHub Facebook

Testing rendering for your Android app is hard. How do you prevent visual regressions in paddings and margins and colors from creeping in?
Iterating on UI code is hard. How do you quickly verify that your layout or view changes work correctly in all configurations?

screenshot-tests-for-android can solve these problems by providing a test framework that checks for visual differences across changes.

GitHub Facebook

Google Firebase Test Lab
Test Lab lets you run Espresso, …

NSURLConnection with Accept-Encoding: gzip

For quite some time I ranted about not being able to use compressed network communcation out-of-the-box on the iPhone.

Despite being undocumented (or I just overlooked the hint), NSURLConnection does gzip decompression transparently!

That’s how to use it:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
// set explicitly:
[request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];



WireMock is a flexible library for stubbing and mocking web services. Unlike general purpose mocking tools it works by creating an actual HTTP server that your code under test can connect to as it would a real web service.

It supports HTTP response stubbing, request verification, proxy/intercept, record/playback of stubs and fault injection, and can be used from within a unit test or deployed into a test environment.

Although it’s written in Java, there’s also a JSON API so you can use it with pretty much any language out there.

netfox - A lightweight, one line setup, iOS network debugging library!

A lightweight, one line setup, network debugging library that provides a quick look on all executed network requests performed by your app. It grabs all requests - of course yours, requests from 3rd party libraries (such as AFNetworking, Alamofire or else), UIWebViews, and more
Very useful and handy for network related issues and bugs
Implemented in Swift 2.1 - bridged also for Objective-C
To start netfox add the following line in didFinishLaunchingWithOptions: method of your AppDelegate
Swift NFX.sharedInstance().start()

Invoke netfox UI Just shake your device and check what's going right or wrong! Shake again and go back to your app!
GitHub kasketis/netfox