Permissions

Request notification, App Tracking Transparency, and location permissions inside flows.

Configure Permissions First

Permission APIs require native configuration. Make sure you've configured the appropriate permissions in your Podfile (iOS) and AndroidManifest.xml (Android). See the Installation guide.

Notification Permissions#

checkNotificationPermission()#

Check the current notification permission status without prompting.

Mobana.checkNotificationPermission(): Promise<{ status, granted, settings? }>
PropertyTypeDescription
statusstringgranted, denied, blocked, or unavailable
grantedbooleanWhether notifications are allowed
settingsobjectiOS only: detailed settings (alert, badge, sound, etc.)

requestNotificationPermission()#

Request notification permission. Shows the system permission dialog.

Mobana.requestNotificationPermission(): Promise<boolean>

Example: Notification Permission Flow

flow.js
// Check current status first
const status = await Mobana.checkNotificationPermission();

if (status.granted) {
  // Already granted
  showNextStep();
} else if (status.status === 'blocked') {
  // User previously denied - show settings prompt
  document.getElementById('settings-prompt').style.display = 'block';
} else {
  // Can request permission
  document.getElementById('request-btn').addEventListener('click', async () => {
    const granted = await Mobana.requestNotificationPermission();
    
    if (granted) {
      Mobana.trackEvent('notification_permission_granted');
      Mobana.haptic('success');
    } else {
      Mobana.trackEvent('notification_permission_denied');
    }
    
    showNextStep();
  });
}

App Tracking Transparency#

checkATTPermission()#

Check the current ATT status without prompting. iOS only.

Mobana.checkATTPermission(): Promise<ATTStatus>
PropertyTypeDescription
statusATTStatusauthorized, denied, not-determined, or restricted

requestATTPermission()#

Request App Tracking Transparency permission. Shows the system ATT dialog. iOS only.

Mobana.requestATTPermission(): Promise<ATTStatus>

Example: ATT Permission Flow

flow.js
// Only relevant on iOS
if (Mobana.getPlatform() === 'ios') {
  // Check current status
  const status = await Mobana.checkATTPermission();
  
  if (status === 'not-determined') {
    // Can request permission
    document.getElementById('att-explainer').style.display = 'block';
    
    document.getElementById('allow-tracking-btn').addEventListener('click', async () => {
      const result = await Mobana.requestATTPermission();
      
      Mobana.trackEvent('att_' + result); // att_authorized, att_denied, etc.
      showNextStep();
    });
  } else {
    // Already determined, move on
    showNextStep();
  }
} else {
  // Android - skip ATT
  showNextStep();
}

On Android, both ATT methods return authorized immediately since Android doesn't have ATT.

Location Permissions#

getLocationPermissionStatus()#

Get comprehensive location permission status.

Mobana.getLocationPermissionStatus(): Promise<LocationStatus>
PropertyTypeDescription
foregroundstringgranted, denied, blocked, or not_requested
backgroundstringgranted, denied, blocked, or not_requested
precisionstringprecise, coarse, or unknown

requestLocationPermission()#

Request foreground location permission.

Mobana.requestLocationPermission(options?: { precision: 'precise' | 'coarse' }): Promise<string>
// Request precise location (default)
const result = await Mobana.requestLocationPermission();
// Or explicitly:
const result = await Mobana.requestLocationPermission({ precision: 'precise' });

// Request coarse/approximate location only
const result = await Mobana.requestLocationPermission({ precision: 'coarse' });
// On Android: requests ACCESS_COARSE_LOCATION instead of ACCESS_FINE_LOCATION
// On iOS: precision is controlled by user in the permission dialog

requestBackgroundLocationPermission()#

Request background location permission. Must have foreground permission first.

Mobana.requestBackgroundLocationPermission(): Promise<string>
// First request foreground location
const foregroundResult = await Mobana.requestLocationPermission();

if (foregroundResult === 'granted') {
  // Now can request background location
  const backgroundResult = await Mobana.requestBackgroundLocationPermission();
  
  if (backgroundResult === 'granted') {
    Mobana.trackEvent('background_location_granted');
  }
}

getCurrentLocation()#

Get the current device location. Requires location permission.

Mobana.getCurrentLocation(): Promise<LocationCoordinates>
PropertyTypeDescription
latitudenumberLatitude in degrees
longitudenumberLongitude in degrees
accuracynumberAccuracy in meters
altitudenumber | nullAltitude in meters
headingnumber | nullHeading in degrees
speednumber | nullSpeed in m/s
timestampnumberUnix timestamp

Example: Location Permission Flow

flow.js
// Request foreground location
async function requestLocation() {
  // Check current status
  const status = await Mobana.getLocationPermissionStatus();
  
  if (status.foreground === 'granted') {
    // Already have permission
    const coords = await Mobana.getCurrentLocation();
    handleLocation(coords);
    return;
  }
  
  if (status.foreground === 'blocked') {
    // User previously denied - need to go to settings
    showSettingsPrompt();
    return;
  }
  
  // Request permission
  const result = await Mobana.requestLocationPermission();
  
  if (result === 'granted') {
    Mobana.trackEvent('location_permission_granted');
    const coords = await Mobana.getCurrentLocation();
    handleLocation(coords);
  } else {
    Mobana.trackEvent('location_permission_denied');
    handleNoLocation();
  }
}

Opening Settings#

When permission is blocked, direct users to app settings:

// User needs to enable permission in settings
document.getElementById('open-settings-btn').addEventListener('click', () => {
  Mobana.openSettings();
});