feature: support iOS login

This commit is contained in:
2020-05-18 01:31:47 +08:00
parent 2ae415f00f
commit 5380a41b00
16 changed files with 307 additions and 34 deletions

View File

@@ -83,6 +83,7 @@
<Compile Include="Renderers\OptionEntryRenderer.cs" />
<Compile Include="Renderers\AppShellSection\AppAppearanceTracker.cs" />
<Compile Include="Renderers\BlurryPanelRenderer.cs" />
<Compile Include="Renderers\HybridWebViewRenderer.cs" />
</ItemGroup>
<ItemGroup>
<InterfaceDefinition Include="Resources\LaunchScreen.storyboard" />

View File

@@ -0,0 +1,80 @@
using System;
using Foundation;
using Pixiview.iOS.Renderers;
using Pixiview.Login;
using Pixiview.Utils;
using WebKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
[assembly: ExportRenderer(typeof(HybridWebView), typeof(HybridWebViewRenderer))]
namespace Pixiview.iOS.Renderers
{
public class HybridWebViewRenderer : WkWebViewRenderer
{
public HybridWebViewRenderer() : this(new WKWebViewConfiguration())
{
}
public HybridWebViewRenderer(WKWebViewConfiguration config) : base(config)
{
}
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
base.OnElementChanged(e);
if (e.NewElement is HybridWebView webView)
{
string url = webView.Uri;
//Configuration.SetUrlSchemeHandler
CustomUserAgent = webView.UserAgent;
NavigationDelegate = new PixivNavigationDelegate(webView);
LoadRequest(new NSUrlRequest(NSUrl.FromString(url)));
}
}
private class PixivNavigationDelegate : WKNavigationDelegate
{
private readonly HybridWebView hybridWebView;
public PixivNavigationDelegate(HybridWebView hybrid)
{
hybridWebView = hybrid;
}
public override void DecidePolicy(WKWebView webView, WKNavigationResponse navigationResponse, Action<WKNavigationResponsePolicy> decisionHandler)
{
var url = webView.Url;
if (url.Host == "www.pixiv.net" && url.Path == "/")
{
if (navigationResponse.Response is NSHttpUrlResponse response)
{
if (response.AllHeaderFields.TryGetValue(new NSString("x-userid"), out var val))
{
Configs.SetUserId(val.ToString(), true);
}
}
}
decisionHandler(WKNavigationResponsePolicy.Allow);
}
public override async void DidFinishNavigation(WKWebView webView, WKNavigation navigation)
{
var url = webView.Url;
if (url.Host == "www.pixiv.net" && url.Path == "/")
{
var store = webView.Configuration.WebsiteDataStore.HttpCookieStore;
var result = await Configs.RequestCookieContainer(store);
if (result && hybridWebView != null)
{
hybridWebView.OnLoginHandle();
}
}
}
}
}
}