Thanks for being a part of WWDC25!

How did we do? We’d love to know your thoughts on this year’s conference. Take the survey here

ATT Prompt Appears in Simulator but Not on Physical Device - Cordova iOS App

I'm experiencing an inconsistent behavior with the App Tracking Transparency (ATT) prompt in my Cordova iOS app using the admob-plus-cordova and cordova-plugin-consent plugins.

Environment:

  • Cordova iOS app
  • Plugins: admob-plus-cordova, cordova-plugin-consent
  • iOS Simulator: 16.0
  • Physical device: iphone 12 17.5.1
  • Xcode version: 16.2

Issue: The ATT permission prompt appears correctly in the iOS Simulator but fails to show on physical devices. I've verified that:

  • Info.plist includes NSUserTrackingUsageDescription
  • The ATT request is triggered before initializing AdMob
  • The device is running iOS 14.5 or later

Expected behavior:

  • ATT prompt should appear on first launch on physical devices (as it does in the simulator)

Actual behavior:

  • ATT prompt appears correctly in simulator [attach your screenshot]
  • ATT prompt never appears on physical device

Troubleshooting steps tried:

  1. Verified app hasn't previously requested ATT permission
  2. Confirmed tracking is enabled in device Settings -> Privacy -> Tracking
  3. Verified implementation order (ATT request before AdMob initialization)

Any insights on why this might be happening or additional debugging steps would be greatly appreciated.

async handleIOSConsent() {
    const trackingStatus = await consent.trackingAuthorizationStatus();
    console.log('📢 iOS tracking status:', trackingStatus);
    
    if (trackingStatus === 0) { // notDetermined
        const newStatus = await consent.requestTrackingAuthorization();
        console.log('📢 New tracking status:', newStatus);
    }
}

async init() {
    if (this.isInitialized) return;

    try {
        // Wait for device ready
        await new Promise(resolve => setTimeout(resolve, 1000));

        // Check consent on iOS
        if (cordova.platformId === 'ios') {
            await this.handleIOSConsent();
        }

        // Initialize AdMob and continue with other initializations
        await admob.start();
        // ...

    } catch (error) {
        console.error('Error initializing:', error);
    }
}

// Initialization
document.addEventListener('deviceready', () => {
    console.log('Initializing AdManager...');
    setTimeout(() => {
        window.adManager = new AdManager();
        window.adManager.init();
    }, 1500);
}, false);
ATT Prompt Appears in Simulator but Not on Physical Device - Cordova iOS App
 
 
Q