Third beta of the 21.0.0 major release. This release reworks on-device AI's retry policy and adds an Embedded Carousel view along with a set of Scene rendering fixes. See the Migration Guide for details.
Changes
- On-device AI:
AirshipAI.ModelProtocol'smaxAttempts/responseTimeoutrequirements are replaced by a singleretryDecision(usage:error:attempt:) -> RetryDecision, so a model can retry a schema-validation failure differently than a thrown error like a network timeout.AirshipFoundationModel.backed(by:)/.privateCloudCompute(...)take an optionalretryDecisionoverride in place of the old parameters;nilkeeps the framework default (retry a schema mismatch immediately, back off 1s/4s on any other error, fail after 3 attempts). A customModelProtocolconformance needs to adopt the new requirement. - On-device AI: fixed the evaluation observer reporting an evaluation twice — once as
.completed, again as.failed— when decoding the model's response failed after the response had already passed schema validation. - Embedded views:
AirshipEmbeddedViewStyleConfiguration.pendingis now ordered by selection preference (most-preferred first), so a custom embedded style no longer has to re-derive ordering itself. AddedAirshipEmbeddedCarousel, a carousel container for embedded content, which now honors.aiselection ranking instead of falling back silently. - Scenes:
AirshipPermissiongains six cases —.appTrackingTransparency,.camera,.microphone,.bluetooth,.photoLibrary,.contacts— for the Composer's new system-permission action. Only.displayNotificationsships a built-in prompt delegate; the others parse and prompt but resolve to.notDetermineduntil the app registers its ownAirshipPermissionDelegate. - Scenes: text line height now always uses the scaled-font-size approximation instead of iOS 26's native line-height API, which rendered differently than Android.
- Fixed in-app message banners clipping or oscillating in width on rotation, including under a side notch or camera housing in landscape.
- Fixed
AirshipPrivacyManager.enableFeatures/disableFeaturespermanently baking a server-side feature disable into local storage instead of leaving it as a read-time subtraction. - Fixed a crash handling certain native-bridge
run-action-cbURLs from web content with fewer or more than three arguments. - Fixed a regex range mismatch between Swift's
String.countandNSString.lengththat could misparse non-ASCII version-constraint audience matches, device tokens, or URL allow-list patterns.