Apple App Tracking Transparency
Apple implemented new privacy control policies starting with iOS and iPadOS 14.5. One privacy control mechanism that requires specific attention is the App Tracking Transparency (ATT) user permission request. Ensuring the ATT permissions prompt appears reliably after install will allow users to make decisions about their data use and satisfy the Apple requirements for App Store approval and distribution. Read more about Apple privacy controls on Apple's website.
Requirement
The App Tracking Transparency permissions request must be presented to the user upon first open flow after install. It can be presented at any time but it is recommended that it occurs before entering the Skillz UI.
Implementation
The implementation of the ATT prompt and its precise location within the user flow is up to the developer. Considerations regarding user experience and optimizing for opt-in rate may influence the final technical implementation. The Skillz SDK handles the description text of the prompt in the property list (NSUserTrackingUsageDescription), automatically.
The samples below are basic and can be further customized based on the desired user experience or need for additional app logic. The permission request calls will only trigger the permission modal once per install, so subsequent requests are relatively safe and will be ignored by iOS/iPadOS.
Samples
- Unity/C#
- iOS/Swift
- iOS/Objective-C
If implementing in Unity script, use the Unity iOS 14 Advertising Support package to interact with the Apple App Tracking Transparency framework.
Here is an example of a a simple button handler triggering the prompt immediately before launching the Skillz UI:
using System;
using UnityEngine;
#if UNITY_IOS
using Unity.Advertisement.IosSupport;
#endif
public class GameController : MonoBehaviour
{
public void StartButton()
{
#if UNITY_IOS
Version currentVersion = new Version(UnityEngine.iOS.Device.systemVersion);
Version ios14 = new Version("14.0");
if (currentVersion >= ios14 && ATTrackingStatusBinding.GetAuthorizationTrackingStatus() ==
ATTrackingStatusBinding.AuthorizationTrackingStatus.NOT_DETERMINED)
{
ATTrackingStatusBinding.RequestAuthorizationTracking();
}
#endif
SkillzCrossPlatform.LaunchSkillz(new YourSkillzMatchDelegate());
}
}
If implementing in a native iOS project, use the Apple App Tracking Transparency framework to check the status or to invoke the ATT prompt.
Here is an example of requesting permission during app start via AppDelegate:
#import <AppTrackingTransparency/AppTrackingTransparency.h>
- (void)applicationDidBecomeActive:(UIApplication*)application
{
if (@available(iOS 14, *))
{
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status)
{
}];
}
}
If implementing in a native iOS project, use the Apple App Tracking Transparency framework to check the status or to invoke the ATT prompt.
Here is a simple example of requesting permission in a function:
import AppTrackingTransparency
import AdSupport
func requestPermission()
{
if #available(iOS 14, *)
{
ATTrackingManager.requestTrackingAuthorization
{
}
}
}
Testing
- Uninstall all copies of the app from the device
- Install the target app/game on an iOS or iPadOS device
- The build can utilize Skillz sandbox or production environments
- The app can be deployed directly via Xcode or one of the many other distribution methods available, including TestFlight
- Launch the app and click through to launch Skillz
The App Tracking Transparency prompt should present itself during the above flow:
Regardless of the user selection, once the prompt has been presented, the Allow Tracking
switch should now be present in Settings for the app:
If the iOS/iPadOS app settings do not show the Allow Tracking
switch and the test device on iOS 14 or later, it means tracking permission has not yet been presented to the user