Airship iOS SDK Migration Guide
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
Airship SDK 14.x to 16.0.2
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.
Packaging Changes
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.
Cocoapods import
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.
Shared Accessors
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.
Airship
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
Nullability
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.
Take Off
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 Access
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
Locale
The locale
property has been renamed to localeManager
on the Airship instance.
UAirship.shared().locale -> Airship.shared.localeManager
Named User
Note
Named User as an Airship feature is not deprecated. The deprecation is just for the previous SDK componentUANamedUser
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")
}
Channel
Tags, Tag Groups, and Attributes
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.
NSNotifications
The constants for NSNotification names have moved:
UAChannelCreatedEvent -> Channel.channelCreatedEvent
UAChannelUpdatedEvent -> Channel.channelUpdatedEvent
Push
Notification wrapper classes
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.
NSNotifications
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
.
PushNotificationDelegate
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
Privacy Manager
NSNotifications
The constants for NSNotification names have moved:
UAPrivacyManagerEnabledFeaturesChangedEvent -> UAPrivacyManager.changeEvent
API changes
In swift, the API to disable features changed slightly:
UAirship.shared().privacyManager.disable(.push) -> Airship.shared.privacyManager.disableFeatures(.push)
Actions
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.
LocaleManager
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()