diff --git a/NuGet.config b/NuGet.config index 8d1e18b667ef..43b6c8313d71 100644 --- a/NuGet.config +++ b/NuGet.config @@ -6,14 +6,10 @@ - - - - diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index b65fb483b466..82ecbb99c770 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -12,21 +12,21 @@ https://github.com/xamarin/xamarin-android 04623cdc317c3da5efce46cb16d94befe4833125 - + https://github.com/xamarin/xamarin-macios - 4bd34d034c8c5a4e092c8bd3c8868153d94277b4 + ad955c0d4f7c1e680fddae23707c94faf3cb2802 - + https://github.com/xamarin/xamarin-macios - 4bd34d034c8c5a4e092c8bd3c8868153d94277b4 + d84d07446e1163cb15012e3a6d181599a1054192 - + https://github.com/xamarin/xamarin-macios - 4bd34d034c8c5a4e092c8bd3c8868153d94277b4 + d84d07446e1163cb15012e3a6d181599a1054192 - + https://github.com/xamarin/xamarin-macios - 4bd34d034c8c5a4e092c8bd3c8868153d94277b4 + ad955c0d4f7c1e680fddae23707c94faf3cb2802 https://github.com/dotnet/emsdk diff --git a/eng/Versions.props b/eng/Versions.props index e1784c7c9b7a..ce4b0d78f6fb 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -11,10 +11,10 @@ 32.0.468 - 15.4.454 - 15.4.454 - 12.3.454 - 15.4.454 + 16.0.514 + 15.4.465 + 12.3.465 + 16.0.514 7.0.400-preview.1.0 diff --git a/eng/pipelines/common/variables.yml b/eng/pipelines/common/variables.yml index dbba305b3b15..a7bceb223817 100644 --- a/eng/pipelines/common/variables.yml +++ b/eng/pipelines/common/variables.yml @@ -7,6 +7,10 @@ variables: value: true - name: DOTNET_VERSION value: 5.0.201 +- name: REQUIRED_XCODE + value: 14.0.0 +- name: DEVICETESTS_REQUIRED_XCODE + value: 14.0.0 - name: LocBranchPrefix value: 'loc-hb' - name: isMainBranch diff --git a/src/BlazorWebView/src/Maui/iOS/BlazorWebViewHandler.iOS.cs b/src/BlazorWebView/src/Maui/iOS/BlazorWebViewHandler.iOS.cs index ef46a3cdb405..9e367d0deccd 100644 --- a/src/BlazorWebView/src/Maui/iOS/BlazorWebViewHandler.iOS.cs +++ b/src/BlazorWebView/src/Maui/iOS/BlazorWebViewHandler.iOS.cs @@ -207,7 +207,7 @@ public void StartUrlSchemeTask(WKWebView webView, IWKUrlSchemeTask urlSchemeTask } } - private byte[] GetResponseBytes(string url, out string contentType, out int statusCode) + private byte[] GetResponseBytes(string? url, out string contentType, out int statusCode) { var allowFallbackOnHostPage = AppOriginUri.IsBaseOfPage(url); url = QueryStringHelper.RemovePossibleQueryString(url); diff --git a/src/BlazorWebView/src/Maui/iOS/IOSWebViewManager.cs b/src/BlazorWebView/src/Maui/iOS/IOSWebViewManager.cs index b28f0aa65269..193e82cfb33c 100644 --- a/src/BlazorWebView/src/Maui/iOS/IOSWebViewManager.cs +++ b/src/BlazorWebView/src/Maui/iOS/IOSWebViewManager.cs @@ -266,8 +266,11 @@ public override void DidReceiveServerRedirectForProvisionalNavigation(WKWebView var uri = _currentUri; _currentUri = null; _currentNavigation = null; - var request = new NSUrlRequest(uri); - webView.LoadRequest(request); + if (uri is not null) + { + var request = new NSUrlRequest(new NSUrl(uri.AbsoluteUri)); + webView.LoadRequest(request); + } } } diff --git a/src/Controls/src/Core/Compatibility/Handlers/ListView/iOS/ListViewRenderer.cs b/src/Controls/src/Core/Compatibility/Handlers/ListView/iOS/ListViewRenderer.cs index 5b7aa309466b..007d59034384 100644 --- a/src/Controls/src/Core/Compatibility/Handlers/ListView/iOS/ListViewRenderer.cs +++ b/src/Controls/src/Core/Compatibility/Handlers/ListView/iOS/ListViewRenderer.cs @@ -221,7 +221,11 @@ protected override void OnElementChanged(ElementChangedEventArgs e) { if (Control == null) { - if (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsTvOSVersionAtLeast(11)) + if (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsMacCatalystVersionAtLeast(11) +#if TVOS + || OperatingSystem.IsTvOSVersionAtLeast(11) +#endif + ) { var parentNav = e.NewElement.FindParentOfType(); _usingLargeTitles = (parentNav != null && parentNav.OnThisPlatform().PrefersLargeTitles()); @@ -229,7 +233,11 @@ protected override void OnElementChanged(ElementChangedEventArgs e) _tableViewController = new FormsUITableViewController(e.NewElement, _usingLargeTitles); SetNativeControl(_tableViewController.TableView); - if (OperatingSystem.IsIOSVersionAtLeast(15) || OperatingSystem.IsTvOSVersionAtLeast(15)) + if (OperatingSystem.IsIOSVersionAtLeast(15) || OperatingSystem.IsMacCatalystVersionAtLeast(15) +#if TVOS + || OperatingSystem.IsTvOSVersionAtLeast(15) +#endif + ) _tableViewController.TableView.SectionHeaderTopPadding = new nfloat(0); _backgroundUIView = _tableViewController.TableView.BackgroundView; diff --git a/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellFlyoutLayoutManager.cs b/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellFlyoutLayoutManager.cs index cc05f9978014..dbe5a228db51 100644 --- a/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellFlyoutLayoutManager.cs +++ b/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellFlyoutLayoutManager.cs @@ -127,8 +127,14 @@ private set else if (ContentView is IPlatformViewHandler ver && ver.PlatformView is UIScrollView uIScroll) ScrollView = uIScroll; - if (ScrollView != null && (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsTvOSVersionAtLeast(11))) + if (ScrollView != null && (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsMacCatalystVersionAtLeast(11) +#if TVOS + || OperatingSystem.IsTvOSVersionAtLeast(11) +#endif + )) + { ScrollView.ContentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentBehavior.Never; + } LayoutParallax(); SetHeaderContentInset(); diff --git a/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellScrollViewTracker.cs b/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellScrollViewTracker.cs index 996a2d5e2aea..c9fe9c92bb54 100644 --- a/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellScrollViewTracker.cs +++ b/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellScrollViewTracker.cs @@ -68,7 +68,11 @@ public void OnLayoutSubviews() if (!_isInShell) return; - if (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsTvOSVersionAtLeast(11)) + if (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsMacCatalystVersionAtLeast(11) +#if TVOS + || OperatingSystem.IsTvOSVersionAtLeast(11) +#endif + ) { var newBounds = _scrollView.AdjustedContentInset.InsetRect(_scrollView.Bounds).ToRectangle(); newBounds.X = 0; @@ -108,7 +112,11 @@ void UpdateContentInset(Thickness inset, double tabThickness) { _lastInset = inset; _tabThickness = tabThickness; - if (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsTvOSVersionAtLeast(11)) + if (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsMacCatalystVersionAtLeast(11) +#if TVOS + || OperatingSystem.IsTvOSVersionAtLeast(11) +#endif + ) { if (ShellSectionController.GetItems().Count > 1 && _isInItems) { @@ -173,7 +181,7 @@ void UpdateVerticalBounce() } } - #region IDisposable Support +#region IDisposable Support public void Dispose() { @@ -197,6 +205,6 @@ protected virtual void Dispose(bool disposing) } } - #endregion IDisposable Support +#endregion IDisposable Support } } \ No newline at end of file diff --git a/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRootRenderer.cs b/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRootRenderer.cs index 22c8242f836b..b78ce2cd9bf0 100644 --- a/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRootRenderer.cs +++ b/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRootRenderer.cs @@ -74,8 +74,14 @@ public override void ViewDidLoad() base.ViewDidLoad(); _containerArea = new UIView(); - if (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsTvOSVersionAtLeast(11)) + if (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsMacCatalystVersionAtLeast(11) +#if TVOS + || OperatingSystem.IsTvOSVersionAtLeast(11) +#endif + ) + { _containerArea.InsetsLayoutMarginsFromSafeArea = false; + } View.AddSubview(_containerArea); @@ -508,7 +514,12 @@ void LayoutHeader() if (_header != null) { tabThickness = HeaderHeight; - var headerTop = (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsTvOSVersionAtLeast(11)) ? View.SafeAreaInsets.Top : TopLayoutGuide.Length; + var headerTop = (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsMacCatalystVersionAtLeast(11) +#if TVOS + || OperatingSystem.IsTvOSVersionAtLeast(11) +#endif + ) ? View.SafeAreaInsets.Top : TopLayoutGuide.Length; + CGRect frame = new CGRect(View.Bounds.X, headerTop, View.Bounds.Width, HeaderHeight); _blurView.Frame = frame; _header.ViewController.View.Frame = frame; @@ -518,7 +529,11 @@ void LayoutHeader() nfloat top; nfloat right; nfloat bottom; - if (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsTvOSVersionAtLeast(11)) + if (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsMacCatalystVersionAtLeast(11) +#if TVOS + || OperatingSystem.IsTvOSVersionAtLeast(11) +#endif + ) { left = View.SafeAreaInsets.Left; top = View.SafeAreaInsets.Top; diff --git a/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellTableViewController.cs b/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellTableViewController.cs index d60d01798d87..64280281898e 100644 --- a/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellTableViewController.cs +++ b/src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellTableViewController.cs @@ -76,8 +76,14 @@ public override void ViewDidLoad() base.ViewDidLoad(); TableView.SeparatorStyle = UITableViewCellSeparatorStyle.None; - if (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsTvOSVersionAtLeast(11)) + if (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsMacCatalystVersionAtLeast(11) +#if TVOS + || OperatingSystem.IsTvOSVersionAtLeast(11) +#endif + ) + { TableView.ContentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentBehavior.Never; + } TableView.Source = _source; ShellFlyoutContentManager.ViewDidLoad(); diff --git a/src/Controls/src/Core/Handlers/Items/iOS/ItemsViewController.cs b/src/Controls/src/Core/Handlers/Items/iOS/ItemsViewController.cs index 9ea7c84f3f9c..21b0ac6a01cd 100644 --- a/src/Controls/src/Core/Handlers/Items/iOS/ItemsViewController.cs +++ b/src/Controls/src/Core/Handlers/Items/iOS/ItemsViewController.cs @@ -134,7 +134,11 @@ public override void ViewDidLoad() ItemsSource = CreateItemsViewSource(); - if (!(OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsTvOSVersionAtLeast(11))) + if (!(OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsMacCatalystVersionAtLeast(11) +#if TVOS + || OperatingSystem.IsTvOSVersionAtLeast(11) +#endif + )) { AutomaticallyAdjustsScrollViewInsets = false; } diff --git a/src/Controls/src/Core/Handlers/Items/iOS/ItemsViewLayout.cs b/src/Controls/src/Core/Handlers/Items/iOS/ItemsViewLayout.cs index cc173dcf9084..7998540ab947 100644 --- a/src/Controls/src/Core/Handlers/Items/iOS/ItemsViewLayout.cs +++ b/src/Controls/src/Core/Handlers/Items/iOS/ItemsViewLayout.cs @@ -44,7 +44,11 @@ protected ItemsViewLayout(ItemsLayout itemsLayout, ItemSizingStrategy itemSizing Initialize(scrollDirection); - if (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsTvOSVersionAtLeast(11)) + if (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsMacCatalystVersionAtLeast(11) +#if TVOS + || OperatingSystem.IsTvOSVersionAtLeast(11) +#endif + ) { // `ContentInset` is actually the default value, but I'm leaving this here as a note to // future maintainers; it's likely that someone will want a Platform Specific to change this behavior @@ -563,7 +567,11 @@ public override bool ShouldInvalidateLayoutForBoundsChange(CGRect newBounds) return base.ShouldInvalidateLayoutForBoundsChange(newBounds); } - if (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsTvOSVersionAtLeast(11)) + if (OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsMacCatalystVersionAtLeast(11) +#if TVOS + || OperatingSystem.IsTvOSVersionAtLeast(11) +#endif + ) { UpdateConstraints(CollectionView.AdjustedContentInset.InsetRect(newBounds).Size); } diff --git a/src/Controls/src/Core/Platform/GestureManager/GestureManager.iOS.cs b/src/Controls/src/Core/Platform/GestureManager/GestureManager.iOS.cs index e76e32c59418..ff4712e50d7a 100644 --- a/src/Controls/src/Core/Platform/GestureManager/GestureManager.iOS.cs +++ b/src/Controls/src/Core/Platform/GestureManager/GestureManager.iOS.cs @@ -412,7 +412,11 @@ _handler.VirtualView is View v && { _platformView.AccessibilityTraits |= UIAccessibilityTrait.Button; _addedFlags |= UIAccessibilityTrait.Button; - if (OperatingSystem.IsIOSVersionAtLeast(13) || OperatingSystem.IsTvOSVersionAtLeast(13)) + if (OperatingSystem.IsIOSVersionAtLeast(13) || OperatingSystem.IsMacCatalystVersionAtLeast(13) +#if TVOS + || OperatingSystem.IsTvOSVersionAtLeast(11) +#endif + ) { _defaultAccessibilityRespondsToUserInteraction = _platformView.AccessibilityRespondsToUserInteraction; _platformView.AccessibilityRespondsToUserInteraction = true; @@ -528,7 +532,7 @@ void GestureRecognizersOnCollectionChanged(object? sender, NotifyCollectionChang { _platformView.AccessibilityTraits &= ~_addedFlags; - if (OperatingSystem.IsIOSVersionAtLeast(13) || OperatingSystem.IsTvOSVersionAtLeast(13)) + if (OperatingSystem.IsIOSVersionAtLeast(13) || OperatingSystem.IsMacCatalystVersionAtLeast(13)) { if (_defaultAccessibilityRespondsToUserInteraction != null) _platformView.AccessibilityRespondsToUserInteraction = _defaultAccessibilityRespondsToUserInteraction.Value; diff --git a/src/Core/src/Handlers/ViewHandlerExtensions.iOS.cs b/src/Core/src/Handlers/ViewHandlerExtensions.iOS.cs index 270d067021dc..12c80dd0fa82 100644 --- a/src/Core/src/Handlers/ViewHandlerExtensions.iOS.cs +++ b/src/Core/src/Handlers/ViewHandlerExtensions.iOS.cs @@ -23,7 +23,13 @@ internal static void LayoutVirtualView( } bounds = bounds ?? platformView.Bounds; - if (virtualView is ISafeAreaView sav && !sav.IgnoreSafeArea && (System.OperatingSystem.IsIOSVersionAtLeast(11) || System.OperatingSystem.IsTvOSVersionAtLeast(11))) + + if (virtualView is ISafeAreaView sav && !sav.IgnoreSafeArea + && (System.OperatingSystem.IsIOSVersionAtLeast(11) || System.OperatingSystem.IsMacCatalystVersionAtLeast(11) +#if TVOS + || OperatingSystem.IsTvOSVersionAtLeast(11) +#endif + )) { bounds = platformView.SafeAreaInsets.InsetRect(bounds.Value); } diff --git a/src/Core/src/Handlers/WebView/WebViewHandler.iOS.cs b/src/Core/src/Handlers/WebView/WebViewHandler.iOS.cs index d9e865526828..f6f8f27d0a2c 100644 --- a/src/Core/src/Handlers/WebView/WebViewHandler.iOS.cs +++ b/src/Core/src/Handlers/WebView/WebViewHandler.iOS.cs @@ -158,7 +158,7 @@ internal async Task FirstLoadUrlAsync(string url) var safeHostUri = new Uri($"{uri.Scheme}://{uri.Authority}", UriKind.Absolute); var safeRelativeUri = new Uri($"{uri.PathAndQuery}{uri.Fragment}", UriKind.Relative); - NSUrlRequest request = new NSUrlRequest(new Uri(safeHostUri, safeRelativeUri)); + var request = new NSUrlRequest(new NSUrl(new Uri(safeHostUri, safeRelativeUri).AbsoluteUri)); if (HasCookiesToLoad(url) && !(OperatingSystem.IsIOSVersionAtLeast(11) || OperatingSystem.IsTvOSVersionAtLeast(11))) return; diff --git a/src/Core/src/Platform/iOS/MauiPageControl.cs b/src/Core/src/Platform/iOS/MauiPageControl.cs index 8ad57efe2f72..edf73aefaaf1 100644 --- a/src/Core/src/Platform/iOS/MauiPageControl.cs +++ b/src/Core/src/Platform/iOS/MauiPageControl.cs @@ -15,7 +15,12 @@ public class MauiPageControl : UIPageControl public MauiPageControl() { ValueChanged += MauiPageControlValueChanged; - if (OperatingSystem.IsIOSVersionAtLeast(14) || OperatingSystem.IsTvOSVersionAtLeast(14)) + + if (OperatingSystem.IsIOSVersionAtLeast(14) || OperatingSystem.IsMacCatalystVersionAtLeast(14) +#if TVOS + || OperatingSystem.IsTvOSVersionAtLeast(14) +#endif + ) { AllowsContinuousInteraction = false; BackgroundStyle = UIPageControlBackgroundStyle.Minimal; diff --git a/src/Core/src/Platform/iOS/MauiWKWebView.cs b/src/Core/src/Platform/iOS/MauiWKWebView.cs index 455818148f29..deee1d19985f 100644 --- a/src/Core/src/Platform/iOS/MauiWKWebView.cs +++ b/src/Core/src/Platform/iOS/MauiWKWebView.cs @@ -77,7 +77,7 @@ public void LoadUrl(string? url) var uri = new Uri(url ?? string.Empty); var safeHostUri = new Uri($"{uri.Scheme}://{uri.Authority}", UriKind.Absolute); var safeRelativeUri = new Uri($"{uri.PathAndQuery}{uri.Fragment}", UriKind.Relative); - NSUrlRequest request = new NSUrlRequest(new Uri(safeHostUri, safeRelativeUri)); + NSUrlRequest request = new NSUrlRequest(new NSUrl(new Uri(safeHostUri, safeRelativeUri).AbsoluteUri)); LoadRequest(request); } diff --git a/src/Essentials/samples/Sample.Server.WebAuthenticator/Essentials.Sample.Server.WebAuthenticator.csproj b/src/Essentials/samples/Sample.Server.WebAuthenticator/Essentials.Sample.Server.WebAuthenticator.csproj index 9eae47013c1d..d69f3925f5ce 100644 --- a/src/Essentials/samples/Sample.Server.WebAuthenticator/Essentials.Sample.Server.WebAuthenticator.csproj +++ b/src/Essentials/samples/Sample.Server.WebAuthenticator/Essentials.Sample.Server.WebAuthenticator.csproj @@ -4,12 +4,13 @@ $(_MauiDotNetTfm) + - + diff --git a/src/Essentials/samples/Sample.Server.WebAuthenticator/Properties/launchSettings.json b/src/Essentials/samples/Sample.Server.WebAuthenticator/Properties/launchSettings.json index 1047368dfb59..6c0ef8184858 100644 --- a/src/Essentials/samples/Sample.Server.WebAuthenticator/Properties/launchSettings.json +++ b/src/Essentials/samples/Sample.Server.WebAuthenticator/Properties/launchSettings.json @@ -18,10 +18,10 @@ "Sample.Server.WebAuthenticator": { "commandName": "Project", "launchBrowser": true, + "applicationUrl": "https://localhost:5001;http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "https://localhost:5001;http://localhost:5000" + } } } } \ No newline at end of file diff --git a/src/Essentials/src/DeviceDisplay/DeviceDisplay.ios.cs b/src/Essentials/src/DeviceDisplay/DeviceDisplay.ios.cs index 8288d10936c0..045224cd25ee 100644 --- a/src/Essentials/src/DeviceDisplay/DeviceDisplay.ios.cs +++ b/src/Essentials/src/DeviceDisplay/DeviceDisplay.ios.cs @@ -18,9 +18,16 @@ protected override DisplayInfo GetMainDisplayInfo() var bounds = UIScreen.MainScreen.Bounds; var scale = UIScreen.MainScreen.Scale; - var rate = (OperatingSystem.IsIOSVersionAtLeast(10, 3) || OperatingSystem.IsTvOSVersionAtLeast(10, 3)) - ? UIScreen.MainScreen.MaximumFramesPerSecond - : 0; + nint rate = 0; + + if (OperatingSystem.IsIOSVersionAtLeast(10, 3) || OperatingSystem.IsMacCatalystVersionAtLeast(10, 3) +#if TVOS + || OperatingSystem.IsTvOSVersionAtLeast(11) +#endif + ) + { + rate = UIScreen.MainScreen.MaximumFramesPerSecond; + } return new DisplayInfo( width: bounds.Width * scale, diff --git a/src/Essentials/src/WebAuthenticator/WebAuthenticator.shared.cs b/src/Essentials/src/WebAuthenticator/WebAuthenticator.shared.cs index eb12ee874617..b592d2e973f1 100644 --- a/src/Essentials/src/WebAuthenticator/WebAuthenticator.shared.cs +++ b/src/Essentials/src/WebAuthenticator/WebAuthenticator.shared.cs @@ -57,8 +57,13 @@ public static Task AuthenticateAsync(this IWebAuthentica public static bool OpenUrl(this IWebAuthenticator webAuthenticator, Uri uri) => webAuthenticator.AsPlatformCallback().OpenUrlCallback(uri); - public static bool OpenUrl(this IWebAuthenticator webAuthenticator, UIKit.UIApplication app, Foundation.NSUrl url, Foundation.NSDictionary options) => - webAuthenticator.OpenUrl(new Uri(url.AbsoluteString)); + public static bool OpenUrl(this IWebAuthenticator webAuthenticator, UIKit.UIApplication app, Foundation.NSUrl url, Foundation.NSDictionary options) + { + var absUri = url?.AbsoluteString; + if (!string.IsNullOrEmpty(absUri)) + return webAuthenticator.OpenUrl(new Uri(absUri)); + return false; + } public static bool ContinueUserActivity(this IWebAuthenticator webAuthenticator, UIKit.UIApplication application, Foundation.NSUserActivity userActivity, UIKit.UIApplicationRestorationHandler completionHandler) {