snowplow.io Open in urlscan Pro
2620:12a:8001::2  Public Scan

Submitted URL: https://go.snowplow.io/e/571483/ter-EN-HZ-SP-utm-content-April/3vhqxm8/1499121523?h=-A0sWgB9VeDgnmsVfWWugmj6LckPCl61pBZ...
Effective URL: https://snowplow.io/blog/modernising-mobile-trackers-v5/?utm_medium=email-brand&utm_source=newsletter&utm_campaign=I...
Submission: On April 27 via api from CH — Scanned from DE

Form analysis 2 forms found in the DOM

GET

<form class="search-form" role="search" method="get" id="sp-search-form">
  <input type="submit" class="search-submit search-icon" value="">
  <input type="search" id="search-form-1" class="search-field" value="" placeholder="Search our site" name="s">
</form>

<form id="3vgftcr" data-pardoturl="https://go.snowplow.io/l/571483/2023-02-17/3vgftcr" class="site-form">
  <div class="form-wrap">
    <input type="text" data-type="data0" placeholder="Work email*" name="data0" required="">
    <button type="submit" id="submit-button">
      <span>Sign Up</span></button>
  </div>
  <span class="agreement"><input class="uk-checkbox uk-margin-xsmall-right" type="checkbox" data-type="marketingoptin" name="marketingoptin" value="0">I would like to receive Snowplow's monthly newsletter and other relevant content and updates about
    Snowplow. We use your information according to our <a href="/privacy-policy" target="_blank" class="uk-display-inline">Privacy Policy</a>. You can opt out at any time.</span>
</form>

Text Content

Start creating behavioral data faster with Snowplow BDP Cloud.
Try Free
Platform

Products
Behavioral Data Platform Create behavioral data at enterprise scale
Open Source Start creating data with our developer-first engine
Pricing Learn about Snowplow's tiers and deployment options
Explore
What is Data Creation? Create fit-for-purpose data to unlock new value at scale
What is Behavioral Data? Discover the richest possible fuel for AI and analytics
Integrations Catalog Explore all Snowplow sources & destinations
Example Data
Sample Snowplow Data Explore Snowplow’s unified event stream in detail
Sample Modeled Data See an example of out-of-the-box modeled data
Why Snowplow for data privacy and compliance? Learn More
Solutions

Data Solutions
Advanced Analytics Build customized analytics apps
AI / ML Train models with AI-ready data
Composable CDP Power personalized experiences
Use Cases
Accelerators Create data products faster
All Use Cases Explore our library of use cases
Industries Find use cases by industry
Partners
Partner Ecosystem Find a partner to meet your needs
Technology Partners View integration partners
Solutions Partners Connect with a Snowplow expert
Get to success with behavioral data faster with our Data Product Accelerators
Explore our DPAs
Customers

Industries
Media & Entertainment
Retail
SaaS
Travel
Edtech
Fintech
Channels
Web
Mobile
Server-side
Email
Advertising
Business Models
Marketplaces
Subscription
Aggregators
Ecommerce
Customer Stories
Strava
Autotrader
Bizzabo
Gousto
Sophi and Globe and Mail
All Customer stories
Resources

Learn More
Blog
Knowledge Base
Events
Meetup
Get Started
Documentation
GitHub
Discourse
Find a Partner
101 Guide to Marketing Attribution Read More
Company

About Snowplow

Snowplow is the world’s leading data creation platform. We empower any company
to create their own AI-ready behavioral data to fuel advanced data applications.

 
About Us
Careers
Contact Us
Newsroom
Inside the Plow: The latest insights from the Snowplow team Explore the blog
Log in
Get Started


Platform

Products
Behavioral Data Platform
Open Source
Pricing
Explore
What is Data Creation?
What is Behavioral Data?
Integrations Catalog
Example Data
Sample Snowplow Data
Sample Modeled Data
Solutions

Data Solutions
Advanced Analytics
AI / ML
Composable CDP
Use Cases
Accelerators
All Use Cases
Industries
Partners
Partner Ecosystem
Technology Partners
Solutions Partners
Customers

Industries
Media & Entertainment
Retail
SaaS
Travel
Edtech
Fintech
Channels
Web
Mobile
Server-side
Email
Advertising
Business Models
Marketplaces
Subscription
Aggregators
Ecommerce
Customer Stories
Strava
Autotrader
Bizzabo
Gousto
Sophi and Globe and Mail
All Customer stories
Resources

Learn More
Blog
Knowledge Base
Events
Meetup
Get Started
Documentation
GitHub
Discourse
Find a Partner
Company

About Snowplow

Snowplow is the world’s leading data creation platform. We empower any company
to create their own AI-ready behavioral data to fuel advanced data applications.

 
About Us
Careers
Contact Us
Newsroom
 1. Home
 2. Blog
 3. Releases

Engineering, Releases


MODERNISING THE MOBILE TRACKERS: VERSION 5 IS HERE

Miranda Wilson 19 April 2023 ·


We’re very excited to announce the version 5 of our mobile trackers for Android
and iOS. The major enhancement is the modernization of the trackers – we
migrated the iOS tracker code base from Objective-C to Swift, and Android from
Java to Kotlin. The trackers got a couple of brand new features too!


ACT ON EVENTS WITH TRACKER PLUGINS

The new tracker plugins architecture, based around the PluginConfiguration
class, allows you to intercept events and run callbacks.

 * The entity closure allows you to attach an entity just before an event is
   tracked. You can choose to add the entity to all events, or just events of a
   certain type.
 * The afterTrack closure lets you inspect tracked events and act based on their
   properties and entities. It’s called when the event is handed over to the
   EventStore for buffering and processing into a request. So, once the event
   has been tracked, but before it’s been sent.

Here’s how it works on Android (it’s very similar on iOS):


// Create a new PluginConfiguration with a unique identifier 

val plugin = PluginConfiguration(“myPlugin”)

// Use the entities closure to attach entities to events

// This plugin will add an entity based on the “iglu:xx” schema

// to events based on the “iglu:abc” schema only

plugin.entities(schemas = listOf(“iglu:abc”)) {

    listOf(SelfDescribingJson(“iglu:xx”, hashMapOf(“property” to true)))

}

// The afterTrack callback is called on a background thread to inspect tracked events

// Here, a message is printed for every event tracked based on the “iglu:yy” schema

plugin.afterTrack(schemas = listOf(“iglu:yy”)) {

    print(“Tracked event with ${it.entities.size} entities”)

}

// The plugin can be supplied to the tracker as a configuration on creation

val tracker = Snowplow.createTracker(

    context = context,

    namespace = “namespace”,

    network = networkConfig,

    plugin

  // multiple PluginConfiguration can be provided!

)

// Alternatively, add plugins like this

tracker.plugins.addPlugin(plugin)

// You can inspect the enabled plugins and get the list of their identifiers

val pluginIdentifiers = tracker.plugins.identifiers

// Finally, remove registered plugins by their identifiers

tracker.plugins.removePlugin(“myPlugin”)



Some of the existing tracker functionality, such as the Global Contexts By the
way, the tracker allows you to provide other closures too. Check out the
requestCallback option, set in EmitterConfiguration, to act on counts of
successful or unsuccessful event sending. There’s also the
SessionConfiguration.onSessionUpdate configuration that, as the name suggests,
is a callback for every time the user session is updated.


SCREEN VIEW TRACKING IN SWIFTUI AND JETPACK COMPOSE

One of the benefits of the language migration is support for the newer UI
frameworks: SwiftUI on iOS and Jetpack Compose for Android. This is particularly
important in tracking screen views. Both mobile trackers aim to automatically
track an event every time a new screen loads – this default behaviour is set by
the TrackerConfiguration.screenViewAutotracking property.

On iOS, the tracker detects and tracks the loading of UIKit Views by swizzling
the ViewController.viewDidAppear method. SwiftUI views are not detected, so the
autotracking doesn’t work! It’s a similar story for Android, where the tracker
uses the Application.ActivityLifecycleCallbacks interface. Screens in Compose
apps use composable functions, not Activities. Unfortunately, we haven’t been
able to replicate the fully automatic tracking for the new frameworks: the
architecture doesn’t support that.

Instead, for the v5 iOS tracker, we’ve created a snowplowScreen annotation for
SwiftUI apps. It’s an extension of View. Call snowplowScreen on every View you
want tracked.


import SwiftUI

struct ProductList: View {

    var body: some View {

        List {

            ...

        }

        // This View extension will track a screen view event when it loads

        .snowplowScreen(name: "ProductList")

    }

}



It’s also possible to attach one or more context entities to the screen view, by
providing them as a list to snowplowScreen. While the plugins feature is for
general entity addition, this is the opposite – giving you fine control over
adding specific entities to a specific screen view. For example, a product
detail entity for a product page.

On Android, because Jetpack Compose is so flexible as to how apps are
constructed, there’s no obvious single view component to extend in the same way.
We suggest adding a listener to the Navigation component, using the
NavController.addOnDestinationChangedListener callback. This code will track a
screen view every time the navigation destination changes. The screen name will
be the name of the destination (without argument parsing).


fun autoTrackScreenView(navController: NavController) {

    navController.addOnDestinationChangedListener { _, destination, _ ->

        Snowplow.defaultTracker?.track(ScreenView(destination.route ?: "null"))

    }

}



This solution unfortunately doesn’t provide the same kind of control as the
SwiftUI snowplowScreen. For specific addition of entities to certain screens, we
recommend manually tracking the screen view on a screen-by-screen basis.

We’d love to hear how you instrument your iOS and Android trackers! Chat to us
on Discourse.


UPGRADED DOCUMENTATION

All the iOS and Android documentation has been overhauled and improved. We’ve
made the main Snowplow docs easier to use, and the trackers have new API docs
(Android; iOS).

Both trackers have new demo apps! We’ve created very simple SwiftUI and Jetpack
Compose apps to show how to instrument the trackers and track events in those
frameworks. The demo apps use the Iglu Server API to show all the publicly
available Iglu schemas.

For Android, we provide demo apps in Kotlin, Java, and Kotlin with Jetpack
Compose. They’re all part of the main Android tracker repository. For iOS, we
now provide demo apps in Swift with SPM or Cocoapods, Objective-C with
Cocoapods, and Swift with SwiftUI. Find all these demos in the Examples
submodule in the iOS tracker repository.


LET US KNOW WHAT YOU THINK

We hope you enjoy using the v5 mobile trackers. Please let us know your
thoughts! We’ve kept API changes to a minimum, but check out the migration guide
to be sure.




SHARE




MORE ABOUT
THE AUTHOR



MIRANDA WILSON

Miranda is a junior software engineer in the Snowplow tracker SDKs team. She has
worked mainly with Java and Ruby and is excited about learning new coding
languages.

View author


RELATED ARTICLES


SNOWPLOW MOBILE TRACKERS VERSION 4 WITH SUPPORT FOR HYBRID APPS AND ANONYMOUS
TRACKING

Matúš Tomlein 1 September 2022


SNOWPLOW TRACKER FOR FLUTTER APPS

Matúš Tomlein 1 February 2022

TAGS

 * Trackers


READY TO START CREATING RICH, FIRST-PARTY DATA?

Try Snowplow Schedule a Demo

Platform Behavioral Data Platform Open Source Integrations Catalog Use Cases
Compare vs. Google Analytics vs. Rudderstack vs. Segment
Solutions Advanced Analytics AI/ML Composable CDP Industry Solutions Partner
Ecosystem
Resources Blog Knowledge Base Events Meetup GitHub Case Studies
Support Discourse Documentation Contact Us
Company About Us Careers Newsroom


GET THE LATEST SNOWPLOW NEWS AND UPDATES

Sign Up
I would like to receive Snowplow's monthly newsletter and other relevant content
and updates about Snowplow. We use your information according to our Privacy
Policy. You can opt out at any time.


THANK YOU FOR SIGNING UP!

We will make sure to keep you up to date.




FOLLOW US


Standard T&Cs (UK/US) Cookie Settings Privacy Policy California Resident Privacy
Notice Vulnerability Disclosure Program

© 2023 Snowplow | All rights reserved

We use cookies on our website to give you the most relevant experience by
remembering your preferences and repeat visits. By clicking “Accept”, you
consent to the use of ALL the cookies.

COOKIE SETTINGSACCEPT
Manage consent
Close

PRIVACY OVERVIEW

This website uses cookies so that we can provide you with the best user
experience possible. Cookie information is stored in your browser and performs
functions such as recognising you when you return to our website and helping our
team to understand...
Necessary
Necessary
Always Enabled
Necessary cookies are absolutely essential for the website to function properly.
These cookies ensure basic functionalities and security features of the website,
anonymously.

CookieDurationDescriptioncookielawinfo-checkbox-advertisement1 yearSet by the
GDPR Cookie Consent plugin, this cookie is used to record the user consent for
the cookies in the "Advertisement" category .cookielawinfo-checkbox-analytics11
monthsThis cookie is set by GDPR Cookie Consent plugin. The cookie is used to
store the user consent for the cookies in the category
"Analytics".cookielawinfo-checkbox-functional11 monthsThe cookie is set by GDPR
cookie consent to record the user consent for the cookies in the category
"Functional".cookielawinfo-checkbox-necessary11 monthsThis cookie is set by GDPR
Cookie Consent plugin. The cookies is used to store the user consent for the
cookies in the category "Necessary".cookielawinfo-checkbox-others11 monthsThis
cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the
user consent for the cookies in the category
"Other.cookielawinfo-checkbox-performance11 monthsThis cookie is set by GDPR
Cookie Consent plugin. The cookie is used to store the user consent for the
cookies in the category "Performance".JSESSIONIDsessionThe JSESSIONID cookie is
used by New Relic to store a session identifier so that New Relic can monitor
session counts for an application.server_session_idsessionThis cookie is set by
Twitch to help in load balancing and optimizing the visitor
experience.viewed_cookie_policy11 monthsThe cookie is set by the GDPR Cookie
Consent plugin and is used to store whether or not user has consented to the use
of cookies. It does not store any personal data.

Analytics
analytics
Analytical cookies are used to understand how visitors interact with the
website. These cookies help provide information on metrics the number of
visitors, bounce rate, traffic source, etc.

CookieDurationDescription_ga2 yearsThe _ga cookie, installed by Google
Analytics, calculates visitor, session and campaign data and also keeps track of
site usage for the site's analytics report. The cookie stores information
anonymously and assigns a randomly generated number to recognize unique
visitors._ga_40GJPE9KF12 yearsThis cookie is installed by Google
Analytics._gcl_au3 monthsProvided by Google Tag Manager to experiment
advertisement efficiency of websites using their services._gid1 dayInstalled by
Google Analytics, _gid cookie stores information on how visitors use a website,
while also creating an analytics report of the website's performance. Some of
the data that are collected include the number of visitors, their source, and
the pages they visit anonymously._hjAbsoluteSessionInProgress30 minutesHotjar
sets this cookie to detect the first pageview session of a user. This is a
True/False flag set by the cookie._hjFirstSeen30 minutesHotjar sets this cookie
to identify a new user’s first session. It stores a true/false value, indicating
whether it was the first time Hotjar saw this user._hjIncludedInPageviewSample2
minutesHotjar sets this cookie to know whether a user is included in the data
sampling defined by the site's pageview limit._hjIncludedInSessionSample2
minutesHotjar sets this cookie to know whether a user is included in the data
sampling defined by the site's daily session limit._parsely_session30
minutesThis cookie is used to track the behavior of a user within the current
session._parsely_visitor1 year 1 monthThis cookie store anonymous user
idnetifier to determine whether a visitor had visited before, or if its a new
visit.CONSENT2 yearsYouTube sets this cookie via embedded youtube-videos and
registers anonymous statistical data.pardotpastThe pardot cookie is set while
the visitor is logged in as a Pardot user. The cookie indicates an active
session and is not used for tracking.rack.session7 daysThis cookie is used for
session management. The cookie retains the session ID.referrer_url30 minutesThis
cookie is used to detect how the user reached the website by registering their
last URL-address.vuid2 yearsVimeo installs this cookie to collect tracking
information by setting a unique ID to embed videos to the website.

Functional
functional
Functional cookies help to perform certain functionalities like sharing the
content of the website on social media platforms, collect feedbacks, and other
third-party features.

CookieDurationDescriptionapi_token1 year 1 monthThis cookie is set by Twitch to
display the embedded video and the services required to function the
same.bcookie2 yearsLinkedIn sets this cookie from LinkedIn share buttons and ad
tags to recognize browser ID.bscookie2 yearsLinkedIn sets this cookie to store
performed actions on the website.langsessionLinkedIn sets this cookie to
remember a user's language setting.lidc1 dayLinkedIn sets the lidc cookie to
facilitate data center selection.UserMatchHistory1 monthLinkedIn sets this
cookie for LinkedIn Ads ID syncing.

Performance
performance
Performance cookies are used to understand and analyze the key performance
indexes of the website which helps in delivering a better user experience for
the visitors.

CookieDurationDescription_gat1 minuteThis cookie is installed by Google
Universal Analytics to restrain request rate and thus limit the collection of
data on high traffic sites._uetsid1 dayBing Ads sets this cookie to engage with
a user that has previously visited the website._uetvid1 year 24 daysBing Ads
sets this cookie to engage with a user that has previously visited the
website.SRM_B1 year 24 daysUsed by Microsoft Advertising as a unique ID for
visitors.unique_id1 year 1 monthThis cookie is set by Powr.io to preserve user
states across page requests.unique_id_durable1 year 1 monthCookie that is used
to register whether the user is logged in. This allows the website owner to make
parts of the website inaccessible, based on the user's log-in status.

Advertisement
advertisement
Advertisement cookies are used to provide visitors with relevant ads and
marketing campaigns. These cookies track visitors across websites and collect
information to provide customized ads.

CookieDurationDescriptionANONCHK10 minutesThe ANONCHK cookie, set by Bing, is
used to store a user's session ID and also verify the clicks from ads on the
Bing search engine. The cookie helps in reporting and personalization as
well.driftt_aid2 yearsThe driftt_aid cookie is an anonymous identifier token set
by Drift.com for tracking purposes and helps to tie the visitor onto the
website. The cookie also allows Drift to remember the information provided by
the site visitor, through the chat on successive site visits.IDE1 year 24
daysGoogle DoubleClick IDE cookies are used to store information about how the
user uses the website to present them with relevant ads and according to the
user profile.MUID1 year 24 daysBing sets this cookie to recognize unique web
browsers visiting Microsoft sites. This cookie is used for advertising, site
analytics, and other operations.personalization_id2 yearsTwitter sets this
cookie to integrate and share features for social media and also store
information about how the user uses the website, for tracking and targeting.sp1
yearThis cookie is set by the host c.jabmo.app. This cookie is used to serve the
content based on user interest and improve content creation.test_cookie15
minutesThe test_cookie is set by doubleclick.net and is used to determine if the
user's browser supports cookies.VISITOR_INFO1_LIVE5 months 27 daysA cookie set
by YouTube to measure bandwidth that determines whether the user gets the new or
old player interface.YSCsessionYSC cookie is set by Youtube and is used to track
the views of embedded videos on Youtube
pages.yt-remote-connected-devicesneverYouTube sets this cookie to store the
video preferences of the user using embedded YouTube
video.yt-remote-device-idneverYouTube sets this cookie to store the video
preferences of the user using embedded YouTube video.

Others
others
Other uncategorized cookies are those that are being analyzed and have not been
classified into a category as yet.

CookieDurationDescription_clck1 yearNo description_clsk1 dayNo
description_hjSession_119848130 minutesNo description_hjSessionUser_11984811
yearNo description_rdt_uuid3 monthsNo description available._sp_id.7f3f2 yearsNo
description_sp_ses.7f3f30 minutesNo description_sp5_id.e3cb2 yearsNo description
available._sp5_ses.e3cb30 minutesNo description available._sp6_id.e3cb2 yearsNo
description available._sp6_ses.e3cb30 minutesNo description
available.AnalyticsSyncHistory1 monthNo descriptioncookies.js_dtestsessionNo
descriptiondrift_aid2 yearsNo descriptiondrift_campaign_refresh30 minutesNo
description available.li_gc2 yearsNo descriptionlpv57148330 minutesNo
descriptionmuc_ads2 yearsNo descriptionSMsessionNo description
available.visitor_id57148310 yearsNo descriptionvisitor_id571483-hash10 yearsNo
description

Save & Accept