194 lines
8.5 KiB
C#
194 lines
8.5 KiB
C#
|
|
//
|
||
|
|
// UniWebViewSafeBrowsing.cs
|
||
|
|
// Created by Wang Wei(@onevcat) on 2020-07-18.
|
||
|
|
//
|
||
|
|
// This file is a part of UniWebView Project (https://uniwebview.com)
|
||
|
|
// By purchasing the asset, you are allowed to use this code in as many as projects
|
||
|
|
// you want, only if you publish the final products under the name of the same account
|
||
|
|
// used for the purchase.
|
||
|
|
//
|
||
|
|
// This asset and all corresponding files (such as source code) are provided on an
|
||
|
|
// “as is” basis, without warranty of any kind, express of implied, including but not
|
||
|
|
// limited to the warranties of merchantability, fitness for a particular purpose, and
|
||
|
|
// noninfringement. In no event shall the authors or copyright holders be liable for any
|
||
|
|
// claim, damages or other liability, whether in action of contract, tort or otherwise,
|
||
|
|
// arising from, out of or in connection with the software or the use of other dealing in the software.
|
||
|
|
//
|
||
|
|
|
||
|
|
using UnityEngine;
|
||
|
|
using System;
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// UniWebView Safe Browsing provides a way for browsing the web content in a more browser-like way, such as Safari on
|
||
|
|
/// iOS and Chrome on Android.
|
||
|
|
///
|
||
|
|
/// This class wraps `SFSafariViewController` on iOS and "Custom Tabs" on Android. It shares cookies, auto-fill
|
||
|
|
/// completion and other more data with the browser on device. Most of permissions are also built-in supported. You can
|
||
|
|
/// use this class for some tasks that are limited for a normal web view, such as using Apple Pay or Progressive Web
|
||
|
|
/// Apps (PWA).
|
||
|
|
///
|
||
|
|
/// You create a `UniWebViewSafeBrowsing` instance by calling the static `UniWebViewSafeBrowsing.Create` method with a
|
||
|
|
/// destination URL. You cannot change this URL once the instance is created. To show the safe browsing, call `Show` on
|
||
|
|
/// the instance. The web content will be displayed in full screen with a toolbar containing the loaded URL, as well
|
||
|
|
/// as some basic controls like Go Back, Go Forward and Done.
|
||
|
|
///
|
||
|
|
/// Browsing web content in `UniWebViewSafeBrowsing` is only supported on iOS and Android. There is no such component in
|
||
|
|
/// Unity Editor. Creating and showing a `UniWebViewSafeBrowsing` on Unity Editor will fall back to open the URL in
|
||
|
|
/// external browser by using Unity's `Application.OpenURL`.
|
||
|
|
///
|
||
|
|
/// </summary>
|
||
|
|
public class UniWebViewSafeBrowsing: UnityEngine.Object {
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// Delegate for safe browsing finish event.
|
||
|
|
/// </summary>
|
||
|
|
/// <param name="browsing">The `UniWebViewSafeBrowsing` object raised this event.</param>
|
||
|
|
public delegate void OnSafeBrowsingFinishedDelegate(UniWebViewSafeBrowsing browsing);
|
||
|
|
/// <summary>
|
||
|
|
/// Raised when user dismisses safe browsing by tapping the Done button or Back button.
|
||
|
|
///
|
||
|
|
/// The dismissed safe browsing instance will be invalid after this event being raised, and you should not use
|
||
|
|
/// it for another browsing purpose. Instead, create a new one for a new browsing session.
|
||
|
|
///
|
||
|
|
/// This event will not happen in Unity Editor, because the whole `UniWebViewSafeBrowsing` will fall back to an
|
||
|
|
/// external browser.
|
||
|
|
/// </summary>
|
||
|
|
public event OnSafeBrowsingFinishedDelegate OnSafeBrowsingFinished;
|
||
|
|
|
||
|
|
private string id = Guid.NewGuid().ToString();
|
||
|
|
private UniWebViewNativeListener listener;
|
||
|
|
|
||
|
|
// This is only for editor, to open the url in system browser.
|
||
|
|
private string url;
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// Whether the safe browsing mode is supported in current runtime or not.
|
||
|
|
///
|
||
|
|
/// If supported, the safe browsing mode will be used when `Show` is called on a `UniWebViewSafeBrowsing` instance.
|
||
|
|
/// Otherwise, the system default browser will be used to open the page when `Show` is called.
|
||
|
|
///
|
||
|
|
/// This property always returns `true` on iOS runtime platform. On Android, it depends on whether there is an Intent
|
||
|
|
/// can handle the safe browsing request. Usually it is provided by Chrome. If there is no Intent can open the URL
|
||
|
|
/// in safe browsing mode, this property will return `false`.
|
||
|
|
///
|
||
|
|
/// To use this API on Android when you set your Target SDK to Android 11 or later, you need to declare the correct
|
||
|
|
/// intent query explicitly in your AndroidManifest.xml, to follow the Package Visibility
|
||
|
|
/// (https://developer.android.com/about/versions/11/privacy/package-visibility):
|
||
|
|
///
|
||
|
|
/// ```xml
|
||
|
|
/// <queries>
|
||
|
|
/// <intent>
|
||
|
|
/// <action android:name="android.support.customtabs.action.CustomTabsService" />
|
||
|
|
/// </intent>
|
||
|
|
/// </queries>
|
||
|
|
/// ```
|
||
|
|
/// </summary>
|
||
|
|
/// <returns>
|
||
|
|
/// Returns `true` if the safe browsing mode is supported and the page will be opened in safe browsing
|
||
|
|
/// mode. Otherwise, `false`.
|
||
|
|
/// </returns>
|
||
|
|
public static bool IsSafeBrowsingSupported {
|
||
|
|
get {
|
||
|
|
#if UNITY_EDITOR
|
||
|
|
return false;
|
||
|
|
#elif UNITY_IOS
|
||
|
|
return true;
|
||
|
|
#elif UNITY_ANDROID
|
||
|
|
return UniWebViewInterface.IsSafeBrowsingSupported();
|
||
|
|
#else
|
||
|
|
return false;
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// Creates a new `UniWebViewSafeBrowsing` instance with a given URL.
|
||
|
|
/// </summary>
|
||
|
|
/// <param name="url">The URL to navigate to. The URL must use the `http` or `https` scheme.</param>
|
||
|
|
/// <returns>A newly created `UniWebViewSafeBrowsing` instance.</returns>
|
||
|
|
public static UniWebViewSafeBrowsing Create(string url) {
|
||
|
|
var safeBrowsing = new UniWebViewSafeBrowsing();
|
||
|
|
if (!UniWebViewHelper.IsEditor) {
|
||
|
|
safeBrowsing.listener.safeBrowsing = safeBrowsing;
|
||
|
|
safeBrowsing.Init(url);
|
||
|
|
}
|
||
|
|
safeBrowsing.url = url;
|
||
|
|
|
||
|
|
return safeBrowsing;
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// Shows the safe browsing content above current screen.
|
||
|
|
/// </summary>
|
||
|
|
public void Show() {
|
||
|
|
if (UniWebViewSafeBrowsing.IsSafeBrowsingSupported) {
|
||
|
|
UniWebViewInterface.SafeBrowsingShow(listener.Name);
|
||
|
|
} else {
|
||
|
|
if (!UniWebViewHelper.IsEditor) {
|
||
|
|
UniWebViewLogger.Instance.Critical(@"UniWebViewSafeBrowsing.Show is called but the current device does
|
||
|
|
not support Safe Browsing.
|
||
|
|
This might be due to Chrome or any other processing app is not installed, or the manifest file not
|
||
|
|
configured correctly. Check SafeBrowsing Mode guide for more: https://docs.uniwebview.com/guide/safe-browsing.html");
|
||
|
|
}
|
||
|
|
Application.OpenURL(url);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// Dismisses the safe browsing component.
|
||
|
|
///
|
||
|
|
/// This method only works on iOS. On Android, there is no way to dismiss the safe browsing component
|
||
|
|
/// programatically as the result of the limitation from the native (Android) side.
|
||
|
|
/// </summary>
|
||
|
|
public void Dismiss() {
|
||
|
|
#if UNITY_IOS && !UNITY_EDITOR
|
||
|
|
UniWebViewInterface.SafeBrowsingDismiss(listener.Name);
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// Sets the color for toolbar background in the safe browsing component. The changes are ignored after `Show`
|
||
|
|
/// method is called.
|
||
|
|
/// </summary>
|
||
|
|
/// <param name="color">The color to tint the toolbar.</param>
|
||
|
|
public void SetToolbarColor(Color color) {
|
||
|
|
if (!UniWebViewHelper.IsEditor) {
|
||
|
|
UniWebViewInterface.SafeBrowsingSetToolbarColor(listener.Name, color.r, color.g, color.b);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// Sets the color for toolbar controls in the safe browsing component. The changes are ignored after `Show` method
|
||
|
|
/// is called.
|
||
|
|
///
|
||
|
|
/// This method only works on iOS. On Android, the controls color is determined by system to keep a reasonable
|
||
|
|
/// contrast, based on the toolbar background color you provided in `SetToolbarColor`.
|
||
|
|
/// </summary>
|
||
|
|
/// <param name="color">The color to tint the controls on toolbar.</param>
|
||
|
|
public void SetToolbarItemColor(Color color) {
|
||
|
|
#if UNITY_IOS && !UNITY_EDITOR
|
||
|
|
UniWebViewInterface.SafeBrowsingSetToolbarItemColor(listener.Name, color.r, color.g, color.b);
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
private UniWebViewSafeBrowsing() {
|
||
|
|
if (!UniWebViewHelper.IsEditor) {
|
||
|
|
var listenerObject = new GameObject(id);
|
||
|
|
listener = listenerObject.AddComponent<UniWebViewNativeListener>();
|
||
|
|
UniWebViewNativeListener.AddListener(listener);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private void Init(string url) {
|
||
|
|
UniWebViewInterface.SafeBrowsingInit(listener.Name, url);
|
||
|
|
}
|
||
|
|
|
||
|
|
internal void InternalSafeBrowsingFinished() {
|
||
|
|
if (OnSafeBrowsingFinished != null) {
|
||
|
|
OnSafeBrowsingFinished(this);
|
||
|
|
}
|
||
|
|
|
||
|
|
UniWebViewNativeListener.RemoveListener(listener.Name);
|
||
|
|
Destroy(listener.gameObject);
|
||
|
|
}
|
||
|
|
}
|