112 lines
4.9 KiB
Swift
Executable File
112 lines
4.9 KiB
Swift
Executable File
//
|
|
// ChromeSafariBrowserManager.swift
|
|
// flutter_inappwebview
|
|
//
|
|
// Created by Lorenzo Pichilli on 18/12/2019.
|
|
//
|
|
|
|
import Flutter
|
|
import UIKit
|
|
import WebKit
|
|
import Foundation
|
|
import AVFoundation
|
|
import SafariServices
|
|
|
|
public class ChromeSafariBrowserManager: NSObject, FlutterPlugin {
|
|
static var registrar: FlutterPluginRegistrar?
|
|
static var channel: FlutterMethodChannel?
|
|
|
|
public static func register(with registrar: FlutterPluginRegistrar) {
|
|
|
|
}
|
|
|
|
init(registrar: FlutterPluginRegistrar) {
|
|
super.init()
|
|
ChromeSafariBrowserManager.registrar = registrar
|
|
ChromeSafariBrowserManager.channel = FlutterMethodChannel(name: "com.pichillilorenzo/flutter_chromesafaribrowser", binaryMessenger: registrar.messenger())
|
|
registrar.addMethodCallDelegate(self, channel: ChromeSafariBrowserManager.channel!)
|
|
}
|
|
|
|
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
|
|
let arguments = call.arguments as? NSDictionary
|
|
|
|
switch call.method {
|
|
case "open":
|
|
let uuid: String = arguments!["uuid"] as! String
|
|
let url = arguments!["url"] as! String
|
|
let options = arguments!["options"] as! [String: Any?]
|
|
let menuItemList = arguments!["menuItemList"] as! [[String: Any]]
|
|
let uuidFallback = arguments!["uuidFallback"] as? String
|
|
let headersFallback = arguments!["headersFallback"] as? [String: String]
|
|
let optionsFallback = arguments!["optionsFallback"] as? [String: Any?]
|
|
let contextMenuFallback = arguments!["contextMenuFallback"] as? [String: Any]
|
|
let windowIdFallback = arguments!["windowIdFallback"] as? Int64
|
|
let initialUserScriptsFallback = arguments!["initialUserScriptsFallback"] as? [[String: Any]]
|
|
open(uuid: uuid, url: url, options: options, menuItemList: menuItemList, uuidFallback: uuidFallback,
|
|
headersFallback: headersFallback, optionsFallback: optionsFallback, contextMenuFallback: contextMenuFallback,
|
|
windowIdFallback: windowIdFallback, initialUserScriptsFallback: initialUserScriptsFallback, result: result)
|
|
break
|
|
case "isAvailable":
|
|
if #available(iOS 9.0, *) {
|
|
result(true)
|
|
} else {
|
|
result(false)
|
|
}
|
|
break
|
|
default:
|
|
result(FlutterMethodNotImplemented)
|
|
break
|
|
}
|
|
}
|
|
|
|
public func open(uuid: String, url: String, options: [String: Any?], menuItemList: [[String: Any]], uuidFallback: String?,
|
|
headersFallback: [String: String]?, optionsFallback: [String: Any?]?, contextMenuFallback: [String: Any]?,
|
|
windowIdFallback: Int64?, initialUserScriptsFallback: [[String: Any]]?, result: @escaping FlutterResult) {
|
|
let absoluteUrl = URL(string: url)!.absoluteURL
|
|
|
|
if #available(iOS 9.0, *) {
|
|
|
|
if let flutterViewController = UIApplication.shared.delegate?.window.unsafelyUnwrapped?.rootViewController {
|
|
// flutterViewController could be casted to FlutterViewController if needed
|
|
|
|
let safariOptions = SafariBrowserOptions()
|
|
let _ = safariOptions.parse(options: options)
|
|
|
|
let safari: SafariViewController
|
|
|
|
if #available(iOS 11.0, *) {
|
|
let config = SFSafariViewController.Configuration()
|
|
config.entersReaderIfAvailable = safariOptions.entersReaderIfAvailable
|
|
config.barCollapsingEnabled = safariOptions.barCollapsingEnabled
|
|
|
|
safari = SafariViewController(url: absoluteUrl, configuration: config)
|
|
} else {
|
|
// Fallback on earlier versions
|
|
safari = SafariViewController(url: absoluteUrl)
|
|
}
|
|
|
|
safari.uuid = uuid
|
|
safari.menuItemList = menuItemList
|
|
safari.prepareMethodChannel()
|
|
safari.delegate = safari
|
|
safari.safariOptions = safariOptions
|
|
safari.prepareSafariBrowser()
|
|
|
|
flutterViewController.present(safari, animated: true) {
|
|
result(true)
|
|
}
|
|
}
|
|
return
|
|
}
|
|
else {
|
|
if uuidFallback == nil {
|
|
print("No WebView fallback declared.")
|
|
result(true)
|
|
|
|
return
|
|
}
|
|
SwiftFlutterPlugin.instance!.inAppBrowserManager!.openUrl(uuid: uuidFallback!, url: url, options: optionsFallback ?? [:], headers: headersFallback ?? [:], contextMenu: contextMenuFallback ?? [:], windowId: windowIdFallback, initialUserScripts: initialUserScriptsFallback)
|
|
}
|
|
}
|
|
}
|