Html 从iOS Swift中的cam scanner SDK返回时,WKwebview是一个空白的白色屏幕?
我已经将iframe表单加载到wkwebview中,它工作正常。当点击iframe内的扫描仪按钮并打开相机扫描文档时,文档上传到服务器后,它将返回到wkweb视图,但此处wkweb视图未刷新,并显示一个空白的白色屏幕 以下是我的wkweb视图代码:Html 从iOS Swift中的cam scanner SDK返回时,WKwebview是一个空白的白色屏幕?,html,ios,swift,webview,wkwebview,Html,Ios,Swift,Webview,Wkwebview,我已经将iframe表单加载到wkwebview中,它工作正常。当点击iframe内的扫描仪按钮并打开相机扫描文档时,文档上传到服务器后,它将返回到wkweb视图,但此处wkweb视图未刷新,并显示一个空白的白色屏幕 以下是我的wkweb视图代码: private func loadWebView(){ webView.uiDelegate = self webView.allowsBackForwardNavigationGestures = true
private func loadWebView(){
webView.uiDelegate = self
webView.allowsBackForwardNavigationGestures = true
do {
guard let filePath = Bundle.main.path(forResource: "index", ofType: "html")
else {
// File Error
print ("File reading error")
return
}
let contents = try String(contentsOfFile: filePath, encoding: .utf8)
let baseUrl = URL(fileURLWithPath: "https://url")
DispatchQueue.main.async {
self.webView.loadHTMLString(contents as String, baseURL: baseUrl)
}
}
catch {
print ("File HTML error")
}
webView.configuration.preferences.javaScriptEnabled = true
webView.configuration.userContentController.add(self, name: "jsHandler")
webView.configuration.userContentController.add(self, name: "saveHandler")
webView.configuration.userContentController.add(self, name: "openCamera")
}
func makeSaveForm(ProcessInstanceId: String, FullFormKey: String, TaskIdValue: String, FormValues: String) -> saveFormModel {
let newForm = saveFormModel()
newForm.ProcessInstanceId = ProcessInstanceId
newForm.FullFormKey = FullFormKey
newForm.TaskIdValue = TaskIdValue
newForm.FormValues = FormValues
return newForm
}
func ProcessInstanceIDApiCall(ProcessInstId: String){
let authToken = UserDefaults.standard.string(forKey: "authToken")
print("id for process instance", ProcessInstId)
let bearerToken: String = "Bearer " + (authToken ?? "")
print("baearer token::\(bearerToken)")
let headers:HTTPHeaders = ["Content-Type":"Application/json",
"Authorization": "Bearer " + (authToken ?? ""),
"Accept":"application/json"]
AF.request("https://api url/process-instance/\(ProcessInstId)/variables", method: .get, parameters: nil, encoding: URLEncoding.default, headers: headers).responseJSON { (response:AFDataResponse<Any>) in
print("process instance id api",response.result)
switch response.result {
case .success:
print("instance response", response.value )
guard let data = response.value else {
// print("request failed \(error)")
return
}
self.anyValueJson = response.value
self.jsonStringProcessInstanceID = self.JSONStringify(value: data as AnyObject)
print("raw response: \(String(describing: self.jsonStringProcessInstanceID))")
case .failure(let error):
print("Error:", error)
}
}
}//api call end
public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "jsHandler" {
// print(message.body)
} else if message.name == "saveHandler" {
let values = message.body
print(values)
let jsonString = JSONStringify(value: values as AnyObject)
print(jsonString)
formValues = jsonString
let newSaveForm = self.makeSaveForm(ProcessInstanceId: self.processInstanceId ?? "", FullFormKey: self.fullFormKey ?? "", TaskIdValue: self.taskIdValue ?? "", FormValues: jsonString )
//realm create/update saveform based task id
let realm = try! Realm()
if realm.object(ofType: saveFormModel.self, forPrimaryKey: newSaveForm.TaskIdValue) != nil {
try! realm.write {
print("already exist")
//.all is equivalent to true and .error is equivalent to false
realm.add(newSaveForm, update: .all)
}
} else {
try! realm.write {
print("new document written")
realm.add(newSaveForm) //RLMException occurs here
}
}
} else if message.name == "openCamera" {
print("open camera",message.body)
let base64Encoded = message.body
let jsonString = JSONStringify(value: base64Encoded as AnyObject)
do{
if let json = jsonString.data(using: String.Encoding.utf8){
if let jsonData = try JSONSerialization.jsonObject(with: json, options: .allowFragments) as? [String:AnyObject]{
let id = jsonData["scannerData"] as! String
print("scanner data ::", id)
let vc1 = ScannerViewController()
let v = vc1.scanParameters(scannerDataBase64: id)
print("v", v)
let newVC = A8Scan(self)
newVC.showScanner()
}
}
}catch {
print(error.localizedDescription)
}
func loadFormView(){
let setPath = "https://api url/\(formKey ?? "")/index.html";
let js = "setFrame('" + setPath + "')";
print("js::\(js)")
webView.evaluateJavaScript(js) { (r, error) in
if error == nil {
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0){
print(r ?? "empty")
let realm = try! Realm()
let object = realm.object(ofType: saveFormModel.self, forPrimaryKey: self.taskIdValue)
print("object", object ?? "")
print("json api string", self.jsonStringProcessInstanceID ?? "")
let authValue = "Bearer \(self.authTokenValue ?? "")"
if object?.FullFormKey != nil {
if let jsonStr = self.jsonStringProcessInstanceID {
let l = "loadform('\(object?.FullFormKey ?? "")', '\(authValue)', '\(object?.ProcessInstanceId ?? "")', \(object?.FormValues ?? ""), \(jsonStr))"
self.webView.evaluateJavaScript(l, completionHandler: nil)
}
} else {
if let jsonStr = self.jsonStringProcessInstanceID {
print("json str::::", jsonStr)
let l = "loadform('\(self.fullFormKey ?? "")', '\( authValue)', '\(self.processInstanceId ?? "")', \(jsonStr))"
self.webView.evaluateJavaScript(l, completionHandler: nil)
}
}
self.tapCallback = {
print("tap called save")
// let s = "submitEvent('\(self.saveArg)')"
let save = "submitEvent('save');"
self.webView.evaluateJavaScript(save, completionHandler: nil)
}
}
} else {
print("web view didfinish loading error",error)
}
}
}
public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
print("Web View didFinish Loading");
loadFormView()
}
private func loadWebView(){
webView.uiDelegate=self
webView.AllowsBackforwardNavigationPigests=true
做{
guard let filePath=Bundle.main.path(forResource:“index”,of type:“html”)
否则{
//文件错误
打印(“文件读取错误”)
返回
}
let contents=try字符串(contentsofile:filePath,编码:.utf8)
让baseUrl=URL(fileURLWithPath:)https://url")
DispatchQueue.main.async{
self.webView.loadHTMLString(内容为字符串,baseURL:baseURL)
}
}
抓住{
打印(“文件HTML错误”)
}
webView.configuration.preferences.javaScriptEnabled=true
webView.configuration.userContentController.add(self,名称:“jsHandler”)
webView.configuration.userContentController.add(self,名称:“saveHandler”)
webView.configuration.userContentController.add(self,名称:“openCamera”)
}
func makeSaveForm(ProcessInstanceId:String,FullFormKey:String,TaskIdValue:String,FormValues:String)->saveFormModel{
让newForm=saveFormModel()
newForm.ProcessInstanceId=ProcessInstanceId
newForm.FullFormKey=FullFormKey
newForm.TaskIdValue=TaskIdValue
newForm.FormValues=FormValues
返回新表单
}
func ProcessInstanceIDApiCall(PROCESSINSTAD:字符串){
让authToken=UserDefaults.standard.string(forKey:“authToken”)
打印(“流程实例的id”,ProcessInstId)
让bearerToken:String=“Bearer”+(authToken??)
打印(“Baeaer令牌::\(BealerToken)”)
let headers:HTTPHeaders=[“内容类型”:“应用程序/json”,
“授权”:“持有人”+(authToken??),
“接受”:“应用程序/json”]
AF.request(“https://api url/process instance/\(ProcessInstId)/variables”,方法:.get,参数:nil,编码:URLEncoding.default,头:headers.responseJSON{(响应:AFDataResponse)in
打印(“流程实例id api”,response.result)
开关响应。结果{
成功案例:
打印(“实例响应”,response.value)
保护let数据=response.value else{
//打印(“请求失败\(错误)”)
返回
}
self.anyValueJson=response.value
self.jsonStringProcessInstanceID=self.JSONStringify(值:数据为AnyObject)
打印(“原始响应:\(字符串(描述:self.jsonStringProcessInstanceID)))
案例。失败(let错误):
打印(“错误:”,错误)
}
}
}//api调用结束
公用func userContentController(userContentController:WKUserContentController,didReceive消息:WKScriptMessage){
如果message.name==“jsHandler”{
//打印(message.body)
}如果message.name==“saveHandler”,则为else{
让值=message.body
打印(值)
让jsonString=jsonString(值:值为AnyObject)
打印(jsonString)
formValues=jsonString
让newSaveForm=self.makeSaveForm(ProcessInstanceId:self.ProcessInstanceId??,FullFormKey:self.FullFormKey??,TaskIdValue:self.TaskIdValue??,FormValue:jsonString)
//领域创建/更新基于存储表单的任务id
让realm=try!realm()
if realm.object(类型:saveFormModel.self,forPrimaryKey:newSaveForm.TaskIdValue)!=nil{
试试看!写吧{
打印(“已存在”)
//.全部等于真。错误等于假
realm.add(newSaveForm,更新:.all)
}
}否则{
试试看!写吧{
打印(“编写新文档”)
realm.add(newSaveForm)//RLMException出现在这里
}
}
}如果message.name==“openCamera”,则为else{
打印(“打开相机”,消息。正文)
让base64Encoded=message.body
让jsonString=jsonString(值:base64编码为AnyObject)
做{
如果让json=jsonString.data(使用:String.Encoding.utf8){
如果让jsonData=try JSONSerialization.jsonObject(带:json,选项:.allowFragments)作为?[String:AnyObject]{
设id=jsonData[“scannerData”]为!字符串
打印(“扫描仪数据::”,id)
设vc1=ScannerViewController()
设v=vc1.scanParameters(scannerDataBase64:id)
打印(“v”,v)
让newVC=a8扫描(自身)
newVC.showScanner()
}
}
}抓住{
打印(错误。本地化描述)
}
func loadFormView(){
让setPath=”https://api url/\(formKey???)/index.html”;
让js=“setFrame('“+setPath+”)”;
打印(“js::\(js)”)
evaluateJavaScript(js){(r,error)在
如果错误==nil{
DispatchQueue.main.asyncAfter(截止日期:.now()+2.0){
打印(r??“空”)
让realm=try!realm()
让object=realm.object(类型:saveFormModel.self,forPrimaryKey:self.taskIdValue)
打印(“对象”,对象??)
打印(“jso