VirtusizeAuth 1.1.1

VirtusizeAuth 1.1.1

Virtusize维护。



  • Virtusize

Virtusize Auth SDK for iOS

描述

Virtusize Auth SDK for iOS是一个封闭源代码库,用于处理我们Virtusize iOS Integration的SNS身份验证过程。

要求

  • iOS 12.0+
  • Xcode 12+
  • Swift 5.0+

入门指南

1. 安装

CocoaPods

使用CocoaPods依赖管理器安装。您可以使用以下命令进行安装

$ gem install cocoapods

要使用CocoaPods将Virtusize SDK集成到您的Xcode项目中,请在Podfile中指定它

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '10.3'
use_frameworks!

target '<your-target-name>' do
pod 'VirtusizeAuth', '~> 1.0.3'
end

然后,运行以下命令

$ pod repo update
$ pod install

Swift包管理器

  1. 在Xcode中,选择文件 > Swift Packages > 添加包依赖... 并将https://github.com/virtusize/virtusize_auth_ios.git作为仓库URL输入。
  2. 选择最小版本为1.0.3
  3. 点击下一步

2. 为Virtuzize SNS Auth创建自定义URL Scheme

SNS身份验证流程需要切换到SFSafariViewController,以便加载一个网页供用户使用SNS帐户登录。为了将登录响应从SFSafariViewController返回到您的应用,必须定义一个自定义URL方案。

您必须注册一个URL类型,并将其发送到VirtusizeAuth.setAppBundleId方法。

(1) 注册URL类型

在Xcode中,点击项目的信息标签并选择URL类型

添加新的URL类型,并设置URL方案和标识符为com.your-company.your-app.virtusize

Screen Shot 2021-11-10 at 21 36 31

(2) 设置应用的bundle ID

在App Delegate的application(_:didFinishLaunchingWithOptions:)方法中,使用应用的bundle ID调用VirtusizeAuth.setAppBundleId方法。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
	// Virtusize initialization omitted for brevity

	// Set the app bundle ID
	VirtusizeAuth.setAppBundleId("com.your-company.your-app")

	return true
}

❗重要

  1. URL类型必须包含您的应用bundle ID并且以.virtusize结尾
  2. 如果您有多个应用目标,请为它们添加URL类型。

为您的WebView应用启用Virtusize SNS登录

使用以下任一方法启用Virtusize SNS登录

方法1:使用VirtusizeWebView

将加载Virtusize的WKWebview替换为VirtusizeWebView

为了在您的WebView中的Virtusize集成网页版本上启用Virtusize SNS登录,请使用此方法

  1. 如果您使用UIKit完全构建了UI,则在Swift文件中将您的WKWebView替换为VirtusizeWebView。如果您使用WKWebViewConfiguration对象配置WebView,请像下面的示例一样从闭包中访问它。

    • Swift
    - var webView: WKWebView
    + var webView: VirtusizeWebView
    webView = VirtusizeWebView(frame: .zero) { configuration in
        // access the WKWebViewConfiguration object here to customize it
        
        // If you want to allow cookie sharing between multiple VirtusizeWebViews,
        // assign the same WKProcessPool object to configuration.processPool
        configuration.processPool = WKProcessPool()
    }
  2. 如果您使用Xcode的Interface Builder构建了UI,请确保在Identity检查器中将WebView的Custom Class设置为VirtusizeWebView

    • Swift
    - @IBOutlet weak var webview: WKWebView!
    + @IBOutlet weak var webview: VirtusizeWebView!
    • Interface Builder

      img

方法2:使用WKWebView

步骤1:在您的WKWebView中执行JavaScript代码以启用Virtusize中的SNS按钮
yourWebView.evaluateJavaScript("window.virtusizeSNSEnabled = true;")
步骤2:确保您的视图控制器确认了 WKUIDelegate 并实现了以下代码
class YourViewController: UIViewController {

	private var yourWebView: WKWebView!

	override func viewDidLoad() {
		super.viewDidLoad()
    // ... other code

    yourWebView.uiDelegate = self
	}
}

extension YourViewController: WKUIDelegate {
	func webView(
		_ webView: WKWebView,
		createWebViewWith configuration: WKWebViewConfiguration,
		for navigationAction: WKNavigationAction,
		windowFeatures: WKWindowFeatures
	) -> WKWebView? {
		guard let url = navigationAction.request.url else {
			return nil
		}

		if VirtusizeURLCheck.isExternalLinkFromVirtusize(url: url.absoluteString) {
			UIApplication.shared.open(url, options: [:])
			return nil
		}

		if VirtusizeAuth.isSNSAuthURL(viewController: self, webView: webView, url: url) {
			return nil
		}

		if navigationAction.targetFrame == nil && VirtusizeURLCheck.isLinkFromSNSAuth(url: url.absoluteString) {
			let popupWebView = WKWebView(frame: webView.frame, configuration: configuration)
			popupWebView.uiDelegate = self
			webView.addSubview(popupWebView)
			popupWebView.translatesAutoresizingMaskIntoConstraints = false
			NSLayoutConstraint.activate([
				popupWebView.topAnchor.constraint(equalTo: webView.topAnchor),
				popupWebView.leadingAnchor.constraint(equalTo: webView.leadingAnchor),
				popupWebView.trailingAnchor.constraint(equalTo: webView.trailingAnchor),
				popupWebView.bottomAnchor.constraint(equalTo: webView.bottomAnchor)
			])
			return popupWebView
		}
    
    // The rest of your code ... 

		return nil
	}

	func webViewDidClose(_ webView: WKWebView) {
		webView.removeFromSuperview()
	}
}