Skip to content

Commit a2e5d4f

Browse files
authored
Merge pull request #40 from urbanairship/release-21.3.0
Release 21.3.0
2 parents 0ff2514 + 3551586 commit a2e5d4f

File tree

15 files changed

+143
-53
lines changed

15 files changed

+143
-53
lines changed

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
# Airship DotNet Changelog
22

3+
## Version 21.3.0 - March 20, 2026
4+
Minor release that updates the iOS SDK to 20.6.0 and Android SDK to 20.4.0, adding Native Message Center support, Scene improvements, and fixing deep links in Message Center messages on iOS.
5+
6+
### Changes
7+
- Updated iOS SDK to 20.6.0
8+
- Updated Android SDK to 20.4.0
9+
- Fixed deep links inside Message Center messages not working on iOS
10+
- Adjusted Markdown rendering in Scenes to be less aggressive when interpreting styling delimiters inside words
11+
- Improved Scene border rendering when rounded corners are present
12+
- Improved accessibility for single choice and multiple choice questions in Scenes (iOS)
13+
- Fixed Message Center unread indicator to only show for unread messages (iOS)
14+
315
## Version 21.2.0 - January 30, 2026
416
Minor release that adds programmatic deep link handling for iOS.
517

Cartfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
github "urbanairship/ios-library" == 20.3.0
1+
github "urbanairship/ios-library" == 20.6.0

Cartfile.resolved

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
github "urbanairship/ios-library" "20.3.0"
1+
github "urbanairship/ios-library" "20.6.0"

Directory.Build.props

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
<!-- Versions -->
66
<PropertyGroup>
77
<!-- Airship native SDK versions -->
8-
<AirshipAndroidVersion>20.2.0</AirshipAndroidVersion>
9-
<AirshipAndroidNugetVersion>20.2.0</AirshipAndroidNugetVersion>
8+
<AirshipAndroidVersion>20.4.0</AirshipAndroidVersion>
9+
<AirshipAndroidNugetVersion>20.4.0</AirshipAndroidNugetVersion>
1010

11-
<AirshipIosVersion>20.3.0</AirshipIosVersion>
12-
<AirshipIosNugetVersion>20.3.0</AirshipIosNugetVersion>
11+
<AirshipIosVersion>20.6.0</AirshipIosVersion>
12+
<AirshipIosNugetVersion>20.6.0</AirshipIosNugetVersion>
1313

1414
<!-- Airship.Net version -->
15-
<AirshipCrossPlatformVersion>21.2.0</AirshipCrossPlatformVersion>
16-
<AirshipCrossPlatformNugetVersion>21.2.0</AirshipCrossPlatformNugetVersion>
15+
<AirshipCrossPlatformVersion>21.3.0</AirshipCrossPlatformVersion>
16+
<AirshipCrossPlatformNugetVersion>21.3.0</AirshipCrossPlatformNugetVersion>
1717
</PropertyGroup>
1818

1919
<!-- Nuget packaging metadata -->

MauiSample/run-ios.sh

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,12 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
2626
PROJECT_DIR="$SCRIPT_DIR"
2727
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
2828

29-
# Ensure .NET is in PATH
30-
export PATH="$HOME/.dotnet:$PATH"
29+
# Ensure .NET is in PATH (prefer arm64 build if available)
30+
if [[ -f "$HOME/.dotnet10arm64/dotnet" ]]; then
31+
export PATH="$HOME/.dotnet10arm64:$PATH"
32+
else
33+
export PATH="$HOME/.dotnet:$PATH"
34+
fi
3135

3236
# Check if dotnet is available
3337
if ! command -v dotnet &> /dev/null; then

airship.properties

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# Airship native SDK versions
2-
iosVersion = 20.3.0
3-
androidVersion = 20.2.0
2+
iosVersion = 20.6.0
3+
androidVersion = 20.4.0
44

55
# Airship.Net cross-platform version
6-
crossPlatformVersion = 21.2.0
6+
crossPlatformVersion = 21.3.0
77

88
# Filename of the iOS SDK zip file
9-
iosFrameworkZip = Airship-iOS-SDK-20.3.0.zip
9+
iosFrameworkZip = Airship-iOS-SDK-20.6.0.zip
1010

1111
# NuGet package revision numbers
1212
# If > 0, the revision number will be added to the versions

binderator/config.json

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,88 +17,88 @@
1717
{
1818
"groupId": "com.urbanairship.android",
1919
"artifactId": "urbanairship-adm",
20-
"version": "20.2.0",
21-
"nugetVersion": "20.2.0",
20+
"version": "20.4.0",
21+
"nugetVersion": "20.4.0",
2222
"nugetId": "Airship.Net.Android.Adm",
2323
"dependencyOnly": false
2424
},
2525
{
2626
"groupId": "com.urbanairship.android",
2727
"artifactId": "urbanairship-automation",
28-
"version": "20.2.0",
29-
"nugetVersion": "20.2.0",
28+
"version": "20.4.0",
29+
"nugetVersion": "20.4.0",
3030
"nugetId": "Airship.Net.Android.Automation",
3131
"dependencyOnly": false
3232
},
3333
{
3434
"groupId": "com.urbanairship.android",
3535
"artifactId": "urbanairship-core",
36-
"version": "20.2.0",
37-
"nugetVersion": "20.2.0",
36+
"version": "20.4.0",
37+
"nugetVersion": "20.4.0",
3838
"nugetId": "Airship.Net.Android.Core",
3939
"dependencyOnly": false
4040
},
4141
{
4242
"groupId": "com.urbanairship.android",
4343
"artifactId": "urbanairship-fcm",
44-
"version": "20.2.0",
45-
"nugetVersion": "20.2.0",
44+
"version": "20.4.0",
45+
"nugetVersion": "20.4.0",
4646
"nugetId": "Airship.Net.Android.Fcm",
4747
"dependencyOnly": false
4848
},
4949
{
5050
"groupId": "com.urbanairship.android",
5151
"artifactId": "urbanairship-feature-flag",
52-
"version": "20.2.0",
53-
"nugetVersion": "20.2.0",
52+
"version": "20.4.0",
53+
"nugetVersion": "20.4.0",
5454
"nugetId": "Airship.Net.Android.FeatureFlag",
5555
"dependencyOnly": false
5656
},
5757
{
5858
"groupId": "com.urbanairship.android",
5959
"artifactId": "urbanairship-layout",
60-
"version": "20.2.0",
61-
"nugetVersion": "20.2.0",
60+
"version": "20.4.0",
61+
"nugetVersion": "20.4.0",
6262
"nugetId": "Airship.Net.Android.Layout",
6363
"dependencyOnly": false
6464
},
6565
{
6666
"groupId": "com.urbanairship.android",
6767
"artifactId": "urbanairship-live-update",
68-
"version": "20.2.0",
69-
"nugetVersion": "20.2.0",
68+
"version": "20.4.0",
69+
"nugetVersion": "20.4.0",
7070
"nugetId": "Airship.Net.Android.LiveUpdate",
7171
"dependencyOnly": false
7272
},
7373
{
7474
"groupId": "com.urbanairship.android",
7575
"artifactId": "urbanairship-message-center",
76-
"version": "20.2.0",
77-
"nugetVersion": "20.2.0",
76+
"version": "20.4.0",
77+
"nugetVersion": "20.4.0",
7878
"nugetId": "Airship.Net.Android.MessageCenter",
7979
"dependencyOnly": false
8080
},
8181
{
8282
"groupId": "com.urbanairship.android",
8383
"artifactId": "urbanairship-message-center-core",
84-
"version": "20.2.0",
85-
"nugetVersion": "20.2.0",
84+
"version": "20.4.0",
85+
"nugetVersion": "20.4.0",
8686
"nugetId": "Airship.Net.Android.MessageCenterCore",
8787
"dependencyOnly": false
8888
},
8989
{
9090
"groupId": "com.urbanairship.android",
9191
"artifactId": "urbanairship-preference-center",
92-
"version": "20.2.0",
93-
"nugetVersion": "20.2.0",
92+
"version": "20.4.0",
93+
"nugetVersion": "20.4.0",
9494
"nugetId": "Airship.Net.Android.PreferenceCenter",
9595
"dependencyOnly": false
9696
},
9797
{
9898
"groupId": "com.urbanairship.android",
9999
"artifactId": "urbanairship-preference-center-core",
100-
"version": "20.2.0",
101-
"nugetVersion": "20.2.0",
100+
"version": "20.4.0",
101+
"nugetVersion": "20.4.0",
102102
"nugetId": "Airship.Net.Android.PreferenceCenterCore",
103103
"dependencyOnly": false
104104
},
@@ -342,6 +342,14 @@
342342
"nugetId": "Xamarin.Firebase.Messaging",
343343
"dependencyOnly": true
344344
},
345+
{
346+
"groupId": "org.jetbrains.kotlin",
347+
"artifactId": "kotlin-parcelize-runtime",
348+
"version": "2.2.20",
349+
"nugetVersion": "2.2.21",
350+
"nugetId": "Xamarin.Kotlin.StdLib",
351+
"dependencyOnly": true
352+
},
345353
{
346354
"groupId": "org.jetbrains.kotlin",
347355
"artifactId": "kotlin-stdlib",

binderator/source/com.urbanairship.android/urbanairship-message-center-core/Transforms/Metadata.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,21 @@
1111
<attr path="/api/package[@name='com.urbanairship.messagecenter']/class[@name='Message.Creator']/method[@name='createFromParcel']" name="managedReturn">Java.Lang.Object</attr>
1212
<attr path="/api/package[@name='com.urbanairship.messagecenter']/class[@name='Message.Creator']/method[@name='newArray']" name="managedReturn">Java.Lang.Object[]</attr>
1313

14+
<attr path="/api/package[@name='com.urbanairship.messagecenter']/class[@name='Message.AssociatedData.Creator']/method[@name='createFromParcel']" name="managedReturn">Java.Lang.Object</attr>
15+
<attr path="/api/package[@name='com.urbanairship.messagecenter']/class[@name='Message.AssociatedData.Creator']/method[@name='newArray']" name="managedReturn">Java.Lang.Object[]</attr>
16+
17+
<attr path="/api/package[@name='com.urbanairship.messagecenter']/class[@name='Message.AssociatedData.ViewState.Creator']/method[@name='createFromParcel']" name="managedReturn">Java.Lang.Object</attr>
18+
<attr path="/api/package[@name='com.urbanairship.messagecenter']/class[@name='Message.AssociatedData.ViewState.Creator']/method[@name='newArray']" name="managedReturn">Java.Lang.Object[]</attr>
19+
20+
<attr path="/api/package[@name='com.urbanairship.messagecenter']/class[@name='Message.ContentType.Html.Creator']/method[@name='createFromParcel']" name="managedReturn">Java.Lang.Object</attr>
21+
<attr path="/api/package[@name='com.urbanairship.messagecenter']/class[@name='Message.ContentType.Html.Creator']/method[@name='newArray']" name="managedReturn">Java.Lang.Object[]</attr>
22+
23+
<attr path="/api/package[@name='com.urbanairship.messagecenter']/class[@name='Message.ContentType.Native.Creator']/method[@name='createFromParcel']" name="managedReturn">Java.Lang.Object</attr>
24+
<attr path="/api/package[@name='com.urbanairship.messagecenter']/class[@name='Message.ContentType.Native.Creator']/method[@name='newArray']" name="managedReturn">Java.Lang.Object[]</attr>
25+
26+
<attr path="/api/package[@name='com.urbanairship.messagecenter']/class[@name='Message.ContentType.Plain.Creator']/method[@name='createFromParcel']" name="managedReturn">Java.Lang.Object</attr>
27+
<attr path="/api/package[@name='com.urbanairship.messagecenter']/class[@name='Message.ContentType.Plain.Creator']/method[@name='newArray']" name="managedReturn">Java.Lang.Object[]</attr>
28+
1429
<attr path="/api/package[@name='com.urbanairship.messagecenter.ui.view']/class[@name='MessageListState.Content.Creator']/method[@name='createFromParcel']" name="managedReturn">Java.Lang.Object</attr>
1530
<attr path="/api/package[@name='com.urbanairship.messagecenter.ui.view']/class[@name='MessageListState.Content.Creator']/method[@name='newArray']" name="managedReturn">Java.Lang.Object[]</attr>
1631

src/Airship.Net.MessageCenter/Controls/Platforms/iOS/MessageViewHandler.cs

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public partial class MessageViewHandler : ViewHandler<MessageView, UIView>
1414
private UIView _containerView = null!;
1515
private WKWebView _webView = null!;
1616
private NSObject? _webViewObserver;
17+
private UAMessageCenterNativeBridge _nativeBridge = null!;
1718

1819
public MessageViewHandler() : base(PropertyMapper, CommandMapper)
1920
{
@@ -27,16 +28,19 @@ protected override UIView CreatePlatformView()
2728
{
2829
_containerView = new UIView();
2930
_containerView.BackgroundColor = UIColor.SystemBackground;
30-
31+
3132
// Create web view with configuration
3233
var config = new WKWebViewConfiguration();
3334
config.WebsiteDataStore = WKWebsiteDataStore.DefaultDataStore;
3435
config.Preferences.JavaScriptEnabled = true;
35-
36+
3637
_webView = new WKWebView(_containerView.Bounds, config);
3738
_webView.AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight;
38-
_webView.NavigationDelegate = new MessageWebViewDelegate(this);
39-
39+
40+
_nativeBridge = new UAMessageCenterNativeBridge();
41+
_nativeBridge.ForwardNavigationDelegate = new MessageWebViewDelegate(this);
42+
_webView.WeakNavigationDelegate = _nativeBridge.NavigationDelegate;
43+
4044
_containerView.AddSubview(_webView);
4145

4246
return _containerView;
@@ -59,7 +63,10 @@ protected override void DisconnectHandler(UIView platformView)
5963
_webViewObserver.Dispose();
6064
_webViewObserver = null;
6165
}
62-
66+
67+
_nativeBridge?.Dispose();
68+
_nativeBridge = null!;
69+
6370
_webView?.RemoveFromSuperview();
6471
_webView?.Dispose();
6572
_webView = null;
@@ -101,22 +108,21 @@ private void LoadMessage(string messageId)
101108
var bodyUrl = message.BodyURL;
102109
if (bodyUrl != null)
103110
{
104-
// Get authentication credentials
105-
AWAirshipWrapper.GetMessageCenterUserAuth((authString) =>
111+
// Get user for native bridge and auth
112+
AWAirshipWrapper.Shared.MessageCenter.Inbox.GetUserWithCompletionHandler((user) =>
106113
{
107114
NSRunLoop.Main.InvokeOnMainThread(() =>
108115
{
109-
if (authString != null)
116+
if (user != null)
110117
{
111-
// Create request with authentication header
118+
_nativeBridge.SetMessage(message, user);
112119
var mutableRequest = new NSMutableUrlRequest(bodyUrl);
113-
// The authString from basicAuthString already includes "Basic " prefix
114-
mutableRequest["Authorization"] = authString;
120+
mutableRequest["Authorization"] = user.BasicAuthString;
115121
_webView.LoadRequest(mutableRequest);
116122
}
117123
else
118124
{
119-
// Fallback to loading without auth if auth retrieval fails
125+
// Fallback to loading without auth if user retrieval fails
120126
var request = new NSUrlRequest(bodyUrl);
121127
_webView.LoadRequest(request);
122128
}
@@ -163,6 +169,21 @@ public void DidFailProvisionalNavigation(WKWebView webView, WKNavigation navigat
163169
{
164170
_handler.VirtualView?.SendLoadFailed(error.LocalizedDescription);
165171
}
172+
173+
[Export("webView:decidePolicyForNavigationAction:decisionHandler:")]
174+
public void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action<WKNavigationActionPolicy> decisionHandler)
175+
{
176+
var url = navigationAction.Request.Url;
177+
if (url != null && url.Scheme != "http" && url.Scheme != "https")
178+
{
179+
decisionHandler(WKNavigationActionPolicy.Cancel);
180+
UAirship.ProcessDeepLink(url, (_) => { });
181+
}
182+
else
183+
{
184+
decisionHandler(WKNavigationActionPolicy.Allow);
185+
}
186+
}
166187
}
167188
}
168189
}

src/Airship.Net/Platforms/Android/Airship.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ public event EventHandler<MessageCenterEventArgs> OnMessageCenterDisplay
159159
/// <summary>
160160
/// Gets the Airship .NET library version.
161161
/// </summary>
162-
public static string Version => "21.2.0";
162+
public static string Version => "21.3.0";
163163

164164
// Module properties
165165
public static IAirshipPush Push => Instance._push;

0 commit comments

Comments
 (0)