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);
 | 
						|
    }
 | 
						|
} |