Due to a bug that mishandles persisted SDK settings, apps that are migrating from SDK 14.8.0 or older should update to 16.0.2 or newer
SDK 16.0 brings significant API changes to better support Swift. The core module has been completely rewritten in Swift, and some method signatures will have changed.
The prefix UA
has been removed on the majority of classes, protocols, and enums. Most changes in code will just need the the UA
prefix dropped in Swift. Objective-C will still have the UA
prefix.
Airship
umbrella framework and Airship
spm target has been removed. Use the modular components instead or use Cocoapods if you want all the modules to roll up into one.
When using xcframeworks or Carthage, you will need to add AirshipBasement
with AirshipCore
as bare minimum integration. The framework will be exported when you import AirshipCore, so there is no need to include an additional import just for AirshipBasement.
The CocoaPods import has been updated from Airship
to AirshipKit
// 14.x
import Airship
// 16.x
import AirshipKit
This is to avoid the class Airship
from conflicting with the framework Airship
to make it possible to use resolve any name conflicts with other frameworks.
The class method shared
has been converted to a class property through the SDK.
Example:
InAppAutomation.shared() -> InAppAutomation.shared
Objective-C usage will continue to work with both method and property syntax.
Accessing shared
and any components such as push
and channel
on Airship
are now class properties instead of a class method.
Example:
UAirship.push() -> Airship.push
The Airship
instance no longer returns null_unspecified
for its instances. Instead everything will now be nonnull
, and if accessed before takeOff
it will crash the application. Airship.isFlying
can be used to check if the instances are ready or not without crashing.
The core module no longer uses class load
methods, so takeOff now requires the launch options provided in the delegate method application(_:didFinishLaunchingWithOptions:)
.
If you are unable to access the launch options, then you can setup an objective-c class with a class loader that adds an NSNotification for UIApplicationDidFinishLaunchingNotification that calls takeOff:
+ (void)load {
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidFinishLaunchingNotification
object:nil
queue:nil usingBlock:^(NSNotification * _Nonnull note) {
[UAirship takeOffWithLaunchOptions:note.userInfo];
}];
}
Analytics used to be accessible as both a class method and an instance property. Both have been removed in favor of a class property:
Airship.analytics
// or Analytics.shared
The locale
property has been renamed to localeManager
on the Airship instance.
UAirship.shared().locale -> Airship.shared.localeManager
- Note: Named User as an Airship feature is not deprecated. The deprecation is just for the previous SDK component
UANamedUser
in the SDK.
The Named User
component in the SDK has been deprecated and replaced with the new Contact
component. With contacts, setting tags and attributes does not require setting an external ID (Named User ID)
Identify a contact (Setting a named user ID):
Airship.contact.identify("some-user-id")
If the contact is going from anonymous to named, any tags and attributes will carry forward to the contact when named if it does not already exist in Airship. If it does exist, the data will be dropped and a conflict event will be generated.
To reset the channel to an empty contact:
Airship.contact.reset()
Reset does not clear any data on the named user ID, instead it just assigns an empty anonymous user to the channel.
Tags and attributes can be set using editTagGroups
and editAttributes
:
Airship.contact.editTagGroups { editor in
editor.add(["some-tag"], group: "some-group")
}
Airship.contact.editAttributes { editor in
editor.set(string: "some-attribute-value", attribute: "some-attribute")
}
As with Contacts, to edit tags, tag groups, and attributes use the new editors:
Airship.channel.editTagGroups { editor in
editor.add(["some-tag"], group: "some-group")
}
Airship.channel.editAttributes { editor in
editor.set(string: "some-attribute-value", attribute: "some-attribute")
}
Airship.channel.editTags { editor in
editor.add("tag")
}
The method updateRegistration
was deprecated without a replacement. It is no longer required to call as the SDK will automatically queue up an update when it detects a change.
The constants for NSNotification names have moved:
UAChannelCreatedEvent -> Channel.channelCreatedEvent
UAChannelUpdatedEvent -> Channel.channelUpdatedEvent
UANotification
, UANotificationContent
, UANotificationResponse
, UANotificationCategory
, and UANotificationAction
have been removed to make it easier to adopt changes to those classes in new iOS release without
waiting on Airship to update the wrappers. These classes outlived their usefulness. Instead of the UA
version, use the UN
version provided by Apple.
The constants for NSNotification names have moved:
UAReceivedNotificationResponseEvent -> Push.receivedNotificationResponseEvent
UAReceivedForegroundNotificationEvent -> Push.receivedForegroundNotificationEvent
UAReceivedBackgroundNotificationEvent -> Push.receivedBackgroundNotificationEvent
The receivedNotificationResponseEvent
no longer only contains the userInfo of the response in the notification. Instead, the entire response is available under the key Push.receivedNotificationResponseEventResponseKey
.
The PushNotificationDelegate
has been updated to no longer reference UA wrappers for notifications and responses:
SDK 14:
func receivedBackgroundNotification(_ notificationContent: UANotificationContent, completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
func receivedForegroundNotification(_ notificationContent: UANotificationContent, completionHandler: @escaping () -> Void)
func receivedNotificationResponse(_ notificationResponse: UANotificationResponse, completionHandler: @escaping () -> Void)
func extend(_ options: UNNotificationPresentationOptions = [], notification: UNNotification) -> UNNotificationPresentationOptions
SDK 16:
func receivedBackgroundNotification(_ userInfo: [AnyHashable : Any], completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
func receivedForegroundNotification(_ userInfo: [AnyHashable : Any], completionHandler: @escaping () -> Void)
func receivedNotificationResponse(_ notificationResponse: UNNotificationResponse, completionHandler: @escaping () -> Void)
func extend(_ options: UNNotificationPresentationOptions, notification: UNNotification) -> UNNotificationPresentationOptions
The constants for NSNotification names have moved:
UAPrivacyManagerEnabledFeaturesChangedEvent -> UAPrivacyManager.changeEvent
In swift, the API to disable features changed slightly:
UAirship.shared().privacyManager.disable(.push) -> Airship.shared.privacyManager.disableFeatures(.push)
UAAction
is now just a protocol instead of a concrete class. BlockAction
was added to make it easy to provide a closure instead of defining a concrete class.
When registering actions in the ActionRegistry
, the entry is no longer mutable. The action registry has been updated to allow updating the predicate directly instead of mutating the entry.
The locale manager no longer allows resetting the locale by setting the value to nil. Instead use the clearLocale
method:
14.x:
UAirship.shared().locale.currentLocale = nil
16.x:
Airship.shared.localeManager.clearLocale()