0

I am using Custom Webview for solving ITMS-90809: Deprecated API Usage - Apple will stop accepting submissions of apps that use UIWebView APIs. and parsing HTML data.

My Code:

MyWebView.cs

using Xamarin.Forms;

namespace CustomWebview
{
    public class MyWebView : WebView
    {
        public static readonly BindableProperty UrlProperty = BindableProperty.Create(
        propertyName: "Url",
        returnType: typeof(string),
        declaringType: typeof(MyWebView),
        defaultValue: default(string));

        public string Url
        {
            get { return (string)GetValue(UrlProperty); }
            set { SetValue(UrlProperty, value); }
        }
    }
}

IOS

using CustomWebview;
using CustomWebview.iOS;
using WebKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(MyWebView), typeof(MyWebViewRenderer))]

namespace CustomWebview.iOS
{
    public class MyWebViewRenderer : ViewRenderer<MyWebView, WKWebView>
    {
        WKWebView _wkWebView;

        protected override void OnElementChanged(ElementChangedEventArgs<MyWebView> e)
        {
            base.OnElementChanged(e);

            if (Control == null)
            {
                var config = new WKWebViewConfiguration();
                _wkWebView = new WKWebView(Frame, config);
                SetNativeControl(_wkWebView);
            }
            if (e.NewElement != null)
            {
                Control.LoadHtmlString(Element.Url, null);   //use this code instead
                //Control.LoadRequest(new NSUrlRequest(new NSUrl(Element.Url)));
            }
        }
    }
}

When I open the page having MyWebView the page redirects to Main.cs and shows the below exception.

enter image description here

I have uploaded a sample project here.

Sreejith Sree
  • 3,055
  • 4
  • 36
  • 105
  • It seems that the parameter `Element.Url` is null. Make sure that you had set it in xaml . – Lucas Zhang Jan 22 '20 at 10:29
  • @LucasZhang-MSFT I have hardcoded the HTML string value. In that case, the custom webview is working. In my project, the data is loading from a get rest API. I am getting the exception before getting the data. At reaching the below line my app is broken with this exception. var response = await client.GetAsync("rest api"); Before setting the webview url value the app is broken. – Sreejith Sree Jan 22 '20 at 12:02
  • @LucasZhang-MSFT Could you please check this [sample project](https://drive.google.com/open?id=1WhsTBlnYlwxTPIt16KQRbmddoDDLaBiB)? I have added a private api since the issue only when calling the api. – Sreejith Sree Jan 22 '20 at 12:53

1 Answers1

0

I found consumed a .Net Framework library in Forms project, please remove it and use .Net Standard HttpClient. Secondly, try to disable the ATS for your certain URL like:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>services.catholicbrain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
        </dict>
    </dict>
</dict>

Finally, move the loading URL code to OnElementPropertyChanged.

protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    base.OnElementPropertyChanged(sender, e);

    if (e.PropertyName == "Url")
    {
        Control.LoadHtmlString(Element.Url, null);
    }
}

This answer is from another XF thread of mine.

Sreejith Sree
  • 3,055
  • 4
  • 36
  • 105