At MOCA we have designed our SDKs to be very efficient and use the minimum necessary battery for Proximity Marketing use cases. We prefer low energy solutions that do not involve GPS and, for Android, offer ways to fine tune the sensitivity of the SDK when reacting to BLE Beacons. This support article will outline some best practices so the SDK can be configured to be as efficient as necessary for your use case.
Our Android SDK uses proprietary Geofence and BLE Beacon engines. These are configurable in the MOCA.properties file. We'll start with the BLE configuration:
# MOCA driver. This is required for Bluetooth Beacon detection. Set it to false if a custom # beacon driver is being used mocaDriver = true
The mocaDriver entry manages if the SDK wakes up and scans for nearby beacons. If your project does not use BLE Beacons this setting can be turned off in order to improve battery usage efficiency.
# Beacon detection engine profile [LowLatency, Balanced, BatterySaver, Custom] # LowLatency = Notifications will be delivered almost instantly in foreground and background. # but will have an important impact on the user's device battery. # Balanced = Notifications are delivered almost instantly in foreground. In background it can # take up to one minute. In Android Lollipop, Marshmallow, and N there are operating system # optimizations that reduce the notification delay (Default setting). # BatterySaver = Detections in foreground can take up to one minute, and in background up to #5 minutes. this is the recommended setting for analytics-only usages. # beaconProfile = Balanced
If your project does use Beacons we have presets that allow for fine tuning when we scan. This tuning has to be in line with the project's use case. We have found our Balanced profile to fit most uses, but maybe you need a more aggressive profile.
If for any reason the presets do not cover your use case you can always set the custom profile and manually define the following entries:
# foregroundTimeBetweenScans = 3300 # foregroundScanDuration = 3300 # backgroundTimeBetweenScans = 60000 # backgroundScanDuration = 5001
We also have a setting that uses Wi-Fi SSIDs as Beacons. This service can be turned off if not used:
wifiProximity = true
And has two configuration options that change battery consumption and sensitivity:
# ACTIVE_SCANNING: When a user gets into a geofence that contains Wi-Fi beacons # MOCA SDK performs a Wi-Fi scan once every 60 seconds in background and once # every 30 seconds in foreground. # PASSIVE_SCANNING: SDK will never initiate any Wi-Fi Scan. But if another app # or the systems performs a Wi-Fi Scanning, the SDK will use this information # to determine if the device is nearby a Wi-Fi Beacon. wifiScanningMode = ACTIVE_SCANNING
MOCA SDK also allows for the fetch and upload intervals to be set. These are very low consumption and will not improve the battery usage of your app if changed, but can greatly affect propagation of data to/from the SDK:
#Data fetch interval in milliseconds. Defaults to 1 hour dataFetchInterval = 3600000 #Event upload interval. Defaults to 15 minutes. eventUploadInterval = 900000
Our iOS SDK is not as configurable as Android due to the fact we use the OS systems for proximity marketing. This means iOS will inform us about proximity to beacons or geofences using the OS's internal systems. These are extremely efficient.
However, when backgrounded, your application will be woken up by iOS in order to respond to location events. That means that the didFinishLaunchingWithOptions
could be called several times while the user is moving, or when the device is in the range of bluetooth beacons.
Be extra careful: filter out these events so that MOCA SDK is initialized, but any other heavy tasks are not executed. If the UIApplicationLaunchOptionsLocationKey
key is present in the launchOptions
, you can tell that the App was launched to respond to a location event.
Example (objective-c):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [MOCA initializeSDK]; //Filter out the events if([launchOptions objectForKey:@"UIApplicationLaunchOptionsLocationKey"]) { return YES; } //do heavy stuff afterwards }