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
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 DOMGET
<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