- Native Bridge for WebView support: refer to developer.mocaplatform.com for documentation on this feature, which allows you to receive the notification payload and manage the deep link manually.
- Device name field tracking was removed to improve privacy compliance.
- Cloud hook actions support. This new campaign action enables marketers to invoke web hooks in third-party systems.
- This feature is used to trigger actions in a remote system when a user enters a geofence, beacon or region.
- Segmentation: view item category history
- Segmentation: support for relative dates using $$now variable
- Detect latest iPhone & iPad models
- New `(void)userNotificationCenter:(UNUserNotificationCenter *)centerdidReceiveNotification:(UNNotification *)notificationwithCompletionHandler:(void (^)(void))completionHandler` method to ease integration with Urban Airship SDK.
- Carrier name collected from SIM card was limited to a maximum of 255 characters. It was observed some phones reported very large strings.
- Added new method to the MOCAConfig:
(instancetype)setProperty:(NSObject *) prop forKey:(NSString *) configKey;
This allows to add [key:value] settings using the MOCAConfig object and not only the `MOCAConfig.plist file.
- Solved a race condition that could prevent certain in-app content from being presented after tapping a notification.
- Improved tracking of experiences with notifications and dwell time inside a geofence / beacon.
- Improved stability in cases where iOS CoreLocation is unable to provide a valid location fix.
- Improved location analytics.
- Fixed a bug that prevented the tracking of the notifications permission.
- Combined MOCA Action MOCAFireableNotificationInAppAction hadn’t implemented the MOCADwellableAction protocol. Preventing SDK from cancelling dwelling notification actions when it were combined with any in-app action.
- When attempting to cancel a scheduled notification, the SDK no longer assumes the iOS request trigger is always in the future. Instead, it checks the trigger’s nextTriggerDate in order to ensure it has not been already shown or it has an invalid date. Althought this behavior has not been observed iOS documentation does not provide any guarantees in this sense. If for some reason iOS does not clean up the notification requests and returns an old one, before this additional check, this potential behavior could reset the fire date of a fired notification, marking the parent experience as “available” without taking into account the cool down configuration.
- Send the APNS environment to the backend.
- Removed IDFA tracking.
- Support for new config setting: Add `IDFA_TRACKING` (Boolean) -> false to MOCAConfig.plist in order to completely prevent MOCA SDK from requesting and collecting the IFDA
- Public APIs reviewed:
- Deleted old, unused header “MOCALabel.h”
- Added “RegionBroadcaster” header to public headers.
- General public headers cleaning.
- Added the “REQUEST_NOTIFICATIONS_PERMISSION” key support in the MOCAConfig.plist. When set to false, MOCA SDK won’t request notifications permission.
- Fixed a bug that prevented experiences from being fired after a “failed” dwell attempt.
- Tracking of dwell notifications is now significantly faster
- Improved geofencing location engine. It now double checks the iOS “enter” and “exit” geofence events before actually setting the device as inside or outside geofence.
- The SDK will limit the amount of enter / exit events to once every minute per event type and geofence.
- New: Support for Universal Links completed. Declare your App supported Universal links in the MOCAConfig.plist:
- Property name: MOCA_UNIVERSAL_KEY_DOMAINS
- Property type: Array
- Property value: Add as many URLs as your app supports as String. It is important to include the scheme (e.g https://mocaplatform.com is valid, while mocaplatform.com is not).
- Removed session length from session_start event.
- Included session number in session_start event.
- Ensured arm64 architecture is included in the Universal Static library
- Apple Silicon based Macs simulator supported for local development.
- Minor bugfixes.
Important: Explicitly removed support for arm64 simulator archs in the Cocoapods version
- New: In order to listen to region changes, use the new protocols listed in the `MOCARegion.h` header file. Add a new observer by calling:
+ (void)addRegionObserver:(id<RegionEventsObserver>)regionObserver;`Example: `[MOCA addRegionObserver:<<The Observer>>];
- Fixed that the following method was still exposed in the MOCA.h header file:
+ (BOOL)isMocaLocalNotification:(UILocalNotification *)notification
New: In-App Content support. Initial support starts with an HTML Popup.
- Improved action display tracking.
- OpenURL actions supports opening internally within a webview, or externally (MOCAOpenUrlMode)
- OpenURL actions distinguish between regular http /https links, custom schemes and universal links
Deprecated: `MOCAProximityActionsDelegate`. App no longer can listen to moca actions. For custom action handling use the new API:
MOCA.customActionHandler = <<the handler>>
- Deprecated: `MOCAProximityEventsDelegate` in proximity service.
- Deprecated: UILocalNotification is no longer supported by the SDK. This class was deprecated in iOS 10.
- Minimum supported iOS version changes from 9 to 10.
- Screen analytics: Automatically track UIViewControllers as they appear on screen.
- Screen Analytics: Optionally, more fine control over the tracking can be achieved by calling a new method:
[MOCA currentScreenName: @“MyCurrentScreenName” forScreenClass: currentViewController]Signature:+ (void)currentScreenName:(NSString *)screenName forScreenClass:(UIViewController *)screenClass;
- SCREEN_TRACKING_DEBUG_TOAST option in the MOCAConfig.plist. Enables or disables showing a toast after tracking a screen for debugging purposes.
- Method Swizzling can be disabled by passing the following launch argument to the application: moca_disable_swizzling.
- UIWebView migrated to WKWebView as per Apple guidelines.
- HTML Content will be shown only in the safe area.
- Background is now translucid so it shows the status bar and bottom unsafe area of the application itself.Fixes and improvements
- Improved logging of background task remaining time to avoid showing big numbers.
- Optionally, a new property can be added in the `MOCAConfig.plist` file that allows to customize the background color of the full screen View.
- Property key: `EXPERIENCE_FULLSCREEN_COLOR_HEX`
- Property type: String
- Possible values: Hex color in 3, 6 or 8 format. Example `#FFF`, `#FFFFFF`, `#74000000` (in this last example, `74` is _alpha_ channel)
- `MOCAConfig` now implements a generic getter for properties: `[MOCAConfig getStringProperty]` and `[MOCAConfig getStringProperty:withDefault]`
- Config constants created and migrated to its own file.
Fixes and improvements
- Added Inline Media Playback options to the SDK PopUp webview
Fixes and improvements
- Solved an issue that could cause a crash when there are new geofences to be registered.
- Optimization to decrease calculations while checking if device is within a geofence has been removed as this could potentially prevent geofence detections in certain edge cases.
Specifically, if the device makes big location hops the system could not detect geofencing enters properly.
Fixes and improvements
- Solved an issue that caused "On Install" triggered experiences to not to save the trigger date correctly.
- Solved an issue that could cause experiences to be shown more than once.
- Show a warning in the SDK log when tracking `nil` custom verbs.
- Fixes and improvements
- unsafe_unretained pointers are no longer used in the MOCA Weak Reference class.
- Added subscriber identifier for the Event Bus subscribers in order to simplify hashing and ensure hash stability.
- Allow to track custom events with custom properties as a dictionary:
[MOCAEvent track:@“theVerb” dictionary:aDictionaryWithProps]
- Fixed standard Cart events to be tracked in the as custom events, and not as different types per event.
- SDK no longer checks for the bluetooth state (on / off). This information used to be valuable in the past due to the fact that bluetooth off meant no iBeacon detection.
As this behavior was changed a couple of years ago, this information no longer provides enough value and triggers a popup asking for a permission.
- CoreBluetooth dependency removed.
- MocaDriver no longer takes into account the bluetooth status to start or stop scanning iBeacon regions.Fixes and improvements
- Improved Geofence evaluation logic. It does not trigger enter or exit events in scenarios where the location accuracy is not enough to determine if inside or outside the geofence.
Fixes and improvements
- Added additional protection against a potential crash after calling reverseGeocodeLocation:preferredLocale:completionHandler: method.
This method is available since iOS 11.0, despite of that, some iOS 11+ devices will anyway crash with a “unrecognized selector sent to instance”.
(crash is now handled properly).
- AFNetworking could potentially return a 200 OK response while calling a “failure” block”, generating a crash. Added code to properly handle this scenario.
- bugfix: Do not attempt to show PopUpView if the parent View is nil.
- bugfix: WiFiOnly Switch was activated after muting SDK Notifications
Fixes and improvements
- When initing the SDK without MOCAConfig.plist, load the default device api url as well.
- Added a new setting to mute all campaign notifications. Activate it by calling [MOCA muteNotifications:YES]
Fixes and improvements
- Fixed a bug that completely shut down proximity services instead of just disable proximity drivers making impossible to restart it afterwards.
Fixes and improvements (Internal)
- Fixed segmentation for PurchaseHistory, and other LazyCollections.
- Added doesNotContain Operator
- Synchronize Instance serialization to avoid mutate collections while fast enumerating.
- Add additional checks in the RegionManager Region Operations to ensure weak references are still valid.
- Add additional checks in the ProximitySync isEqualsTo method.
- Added YOUR_APP_KEY_HERE check. Throw an exception if this happens.
- Added location to custom events
- Added location to Campaign events
Fixes and improvements
- Fixed a bug that reported wrong result of UIBackgroundFetch
- JourneyManager: Do not process EventBus messages during initialization
- PermissionHandler: Avoid iterating listeners while fast enumerating them.
- Added validations for certain non-ISO country codes returned by iOS.
- JourneyManager subscribes once per key (instead of once per experience).
- EventBus: Added an additional mutex to event buffer
- EventBus: Added additional mutex for other critical sections.
- EventBus: Use Async Queue to dispatch events always (not only while dispatching buffer events)
- Privacy enhancement: Send the device name as a md5 hash.
Fixes and improvements
- Improved handling of bluetooth radio states.
- Save user automatically in moca cloud.
- Added instance upload on background fetch
- Do not track PlaceMarks if do not have at least country.
- Improved local push logging for Regions
- New Event OnMocaReady allows to perform tasks once the SDK has been completely initialized.
- AppTrigger is now a specialization of AutomationTrigger
- Triggable tags (change on a Tags trigger evaluation of Variants / Campaigns / Experiences).
- Support for DWELL triggers and DELAYED Triggers.
- New Triggable event: on location change
- New Segment variable: location.age, it returns the location age in seconds.
- Segmentation engine: ability to compare objects with or without case sensitivity
- Segmentation engine: Support for NotIn operator.
- AppInstall trigger is valid during the first 3 sessions, not only the first time.
- Visit tracking returns placemarks names always in english.
- Minor code formatting improvements.
- JourneysManager: Avoid mutating collections while fast enumerating.
- Add tag to current profile instead of instance directly.
- RegionGroup proximity Tracking
- Campaign Attribution tracking for RegionGroups
- Mutex on the Event Bus.
- Added new iPhone model names.
- User AutoLogin if still logged in.
- Tag serialization works the same way than in Android.
- Fixed bug in search view verb string.
- Segmentator now compares Strings with Numbers correctly.
- Region Group remembers its last triggered child region.
- Segmentator supports count for ViewedItems.
- Synchronize CLRegions in a smarter way, so regions are monitored again ONLY if they are not being monitored yet.
- Fixed a bug that prevented the moca driver from starting correclty when passing from “Denied” Location permissions to any other Location permission.
- Improved debug logging with local push.
- Improved handling of Region Group events
- Added optional logging via local push notifications. Useful to debug SDK location engine. ( Use CUSTOM_DEBUG_PUSH TRUE in the mocaconfig.plista)
- Fixed a bug that could prevent a tag from being loaded from local storage.
- Improved tag loading code to take into account `NSNull` values.
- Only track exit beacon events when the state has transitioned from inside to outside (and not Unknown -> Outside), so no more “fake” exit events are sent. This also solves a performance issue when a beacon Region contains hundreds of beacons.
- Move de-serializing data work off the UI Thread.
- Background fetch callback could be called more than once by the CRM Sync client if the data was not processed correctly.
- Memory handling improvements.
- Improved MOCA Event Bus memory management to fully avoid memory leaks.
- MOCA Event bus process events publishing asynchronously using GCD.
- Improved OnEnter Trigger logic to be more tolerant to beacon exits. This greatly increases the detection confidence for dwell triggers with bluetooth beacons.
- Supports the INSTALL_EVENT automation trigger
- Automatically handles custom scheme links so the app itself invokes them and closes the webview afterwards.
- Parse delayMs in location group trigger
- remove PUT calls when saving user
- Load cart in user object
- Expose Cart in the MOCA inteface
- Use MOCASerializableObjects for persistance in the ItemSet class.
- Change all PUT methods to POST.
- Unit tests of new Segment Lexer
- Bugfixes: Fixed an npe generated while loading ViewItem from storage
- Added missing header to Cloud Tags Sync
- Fixed the verb used in the “rate” event
- Items added to the cart using the update method are now persisted correctly
- Custom event tracking builder accepts null properties (and discards them)
- Support for triggers on dwell. (backend sync api 2.1)
- Improved exit beacon handling. Beacon is treated as “outside” after ~15 seconds of not having it in range.
- Experiences are always a notification first, and if user taps on it, it shows the associated content. On iOS 9, the behavior remains the same.
- Included additional protections against nil system properties reported by iOS.
- Added additional checks in NAO Beacon configuration.
- Remote notifications push token is no longer required for proximity-only features.
- MOCA Indoor Client is restarted after receiving a valid NAO key. This caused the indoor clients to not to return location objects if they were created inmediately after iniitalizing the app for the first time.
- Proximity NAO Clients starts with low power mode by default. This setting can be changed in the config by adding the CUSTOM_NAO.PROXIMITY_POWER_MODE = HIGH key-value in the MOCA SDK config.
- Added a new Indoor Client call in order to upload logs to NAO Cloud: - (void) uploadLogs;
- Check incoming notifications are MOCA notifications before Manage them. This improves the compatibility with 3rd party SDKs.
- Added the API method [MOCA isMocaNotification:notification] which unifies the checking of a local or remote notification.
- Full support for the UNNotification API. UILocalNotification still supported for devices < iOS 10
- Fixed a visual issue in the iPhone X that caused that was difficult to press the X close button of the experiences.
- Added parameter in the sync call to inform the backend about the requesting operating system
- Fixed a bug that caused segments in experiences to not to be parsed correctly.
v2.3.3 / v2.3.3n
- Allow set the location permission strategy property in the Config object.
- Check if beacon setting is enabled before starting to range beacons
- Added an error message when trying to create an indoor client without the NAO Dependency available.
- Fixed a bug in the Indoor Tracker (indoor analytics) that prevented the module from starting.
- Sent the entity id in the url when performing the entity call.
- Full support for iOS new location model permissions
- In the geo events, the permission status is also tracked
- The app status (background, foreground) is tracked in the geo events
- bugfix: Solved an issue that could cause a user to not to receive a push notification (with content-available: 1) after opening app the application
- All UI method calls are done from the Main Thread.
- Support for beacon detection in foreground with the "When in use" location permission. (before this version, beacons always needed the "Always" permission)
- Restored MOCAExperienceRepeatImmediately. It is needed for custom actions.
- Enhanced: Imrpoved response time of OnExit Geofence.
- Enhanced: Ensure all UI calls are done in the Main thread.
- Fixed: bitcode support
- Added a new property needed for a future A/B testing feature.
- Added a method to get the default action delegate [[MOCA ProximityService] actionDelegate]
- Rename a symbol in the Apple reachability class to avoid conflicts with 3rd party libs