ScatterKit 0.0.12

ScatterKit 0.0.12

Alex Melnichuk维护。



ScatterKit 0.0.12

Scatter Kit

ScatterKit 在 WKWebView 中模拟 EOS 区块链的 Scatter 插件,允许客户端应用:

  • 检索账户
  • 签名交易
  • 签名任意消息

安装

步骤 1: 添加框架

CocoaPods
  1. 在 Podfile 中添加 pod 'ScatterKit'
  2. 运行 pod install

步骤 2: 在 UIViewController 中配置 ScatterKit

在 UIViewController 中为 WKWebView 配置 ScatterKit

import ScatterKit

class YourViewController: BaseViewController {

    private var scatterKit: ScatterKit!

    override func viewDidLoad() {
        super.viewDidLoad()
        // create webview with configuration
        let webView = WKWebView(frame: view.bounds, configuration: configuration)
        // webView.navigationDelegate = self
        // ... other setup
        
        // configure ScatterKit after WKWebView configuration 
        scatterKit = ScatterKit(webView: webView)
        scatterKit.delegate = self
    }
}

// Implement supported Scatter callbacks
extension YourViewController: ScatterKitDelegate { 
    // ...
}

使用示例

将EOS账户发送到Scatter

extension YourViewController: ScatterKitDelegate {
    func scatterDidRequestAccountName(_ completionHandler: @escaping SKCallback<String>) throws {
        completionHandler(.success("myeosaccount"))
    }
}

签名任意消息

extension YourViewController: ScatterKitDelegate {
    func scatterDidRequestMessageSignature(_ request: ScatterKit.Request.MessageSignature, completionHandler: @escaping SKCallback<ScatterKit.Response.MessageSignature>) throws {
            var data = Data(request.data.utf8)
            if !request.isHash {
                data = makeSha256(data)
            }
            let signature = makeSignature(privateKey: self.privateKey, digest: data)
            let response = ScatterKit.Response.MessageSignature(message: "Success!", signature: signature)
            completionHandler(.success(response))
    }
}

签名交易

extension YourViewController: ScatterKitDelegate {
    func scatterDidRequestTransactionSignature(_ request: ScatterKit.Request.TransactionSignature, completionHandler: @escaping SKCallback<ScatterKit.Response.TransactionSignature>) throws {
        // try to make transaction
        let transaction = try makeTransaction(from: request, privateKey: self.privateKey)
        let signatureInfo = ScatterKit.Response.TransactionSignature(signatures: transaction.signatures, returnedFields: [:])
        completionHandler(.success(signatureInfo))
    }
}

将自定义错误发送到Scatter

// Create class, that handles Scatter errors
enum ScatterErrors: Error {
    case messageSignatureCancel
    case transactionSignatureCancel
    case signatureFailed
}

// Implement ScatterKitErrorConvertible protocol
extension ScatterErrors: ScatterKitErrorConvertible {
    var scatterErrorMessage: String? {
        switch self {
        case .transactionSignatureCancel,
             .messageSignatureCancel:
            return "Signature cancelled"
        case .signatureFailed:
            return "Signature failed"
        }
    }
    
    var scatterErrorKind: ScatterKitError.Kind? {
        switch self {
        case .transactionSignatureCancel,
             .messageSignatureCancel:
            return .signatureRejected
        case .signatureFailed:
            return .malicious
        }
    }
    
    var scatterErrorCode: ScatterKitError.Code? {
        switch self {
        case .transactionSignatureCancel,
             .messageSignatureCancel:
            return .noSignature
        case .signatureFailed:
            return .forbidden
        }
    }
}

extension YourViewController: ScatterKitDelegate {
    func scatterDidRequestTransactionSignature(_ request: ScatterKit.Request.TransactionSignature, completionHandler: @escaping SKCallback<ScatterKit.Response.TransactionSignature>) throws {
        do {
            // try to make transaction
        } catch {
             completionHandler(.error(ScatterErrors.signatureFailed))
        }
    }
}