Scatter Kit
ScatterKit 在 WKWebView 中模拟 EOS 区块链的 Scatter 插件,允许客户端应用:
- 检索账户
- 签名交易
- 签名任意消息
安装
步骤 1: 添加框架
CocoaPods
- 在 Podfile 中添加
pod 'ScatterKit'
- 运行
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))
}
}
}