uni-app uts插件在ios端无法触发代理

发布于 1周前 作者 caililin 来自 uni-app

uni-app uts插件在ios端无法触发代理

代码示例

/* 引入 interface.uts 文件中定义的变量 */  
import { ScanCode, HWcanCodeOptions, HWcanSuccess } from '../interface.uts';  
import { HmsScanOptions, HmsDefaultScanViewController, HMSScanFormatTypeCode, DefaultScanDelegate } from "ScanKitFrameWork"  

class ScanDelegate implements DefaultScanDelegate{  
    defaultScanDelegate(resultDic:any[]){  
        DispatchQueue.main.async(execute = () : void => {  
            console.log(resultDic);  
        })  
    }  
}  

let delegate: ScanDelegate =  new ScanDelegate()  

class ScanCodeT{  
    scan(){  
        const scanFormatType = UInt32(HMSScanFormatTypeCode.ALL.rawValue)  
        const options = HmsScanOptions.init(scanFormatType = scanFormatType, photo = true)  

        const scanVc:HmsDefaultScanViewController = HmsDefaultScanViewController(defaultScanWithFormatType = options)  
        scanVc.defaultScanDelegate = delegate  
        console.log("Scan view controller initialized")  

        // 检查 scanVc 是否为 null  
        if (scanVc != null) {  
            const rootVC = UTSiOS.getCurrentViewController()  
            rootVC.present(scanVc, animated = true)  
            console.log(scanVc);  
        } else {  
            console.error("Failed to initialize HmsDefaultScanViewController")  
        }  
    }  
}  

export function scanCode(options : HWcanCodeOptions) {  
    // uts方法默认会在子线程中执行,涉及 UI 操作必须在主线程中运行,通过 DispatchQueue.main.async 方法可将代码在主线程中运行  
    DispatchQueue.main.async(execute = () : void => {  

        // 创建 NativeCode 的实例  
        const nativeCode = new ScanCodeT()  

        // 设置回调函数  
        // nativeCode.scanResultCallback = (result) => {  
        //  console.log("Scan result received in UTS:", result)  
        // }  

        // 调用 scan 方法  
        nativeCode.scan()  
    })  
}

描述

uts插件,iOS端,做的是华为统一扫码的功能,扫码完成之后一直触发不了代理,能帮看下是哪里写的不对吗?

这是统一扫码的文档华为统一扫码文档


10 回复

请问怎么解决的?

import Foundation import UIKit import AVFoundation import ScanKitFrameWork import DCloudUTSFoundation

// 定义类型别名 typealias ScanResult = [String: Any]

@objc class ScanDelegate: NSObject, DefaultScanDelegate { // 回调属性 public var scanResultCallback: (([String: String]) -> Void)?

@objc public class NativeCode: UIViewController { // 创建静态的 ScanDelegate 实例 private static let scanDelegate = ScanDelegate()

} Delegate参数类型要正确,建议用swift来做

import Foundation
import UIKit
import AVFoundation
import ScanKitFrameWork
import DCloudUTSFoundation

// 定义类型别名
typealias ScanResult = [String: Any]

@objc class ScanDelegate: NSObject, DefaultScanDelegate {
// 回调属性
public var scanResultCallback: (([String: String]) -> Void)?

[@objc](/user/objc) func defaultScanDelegateForDicResult(_ result: Any) {  
    console.log("Scan delegate called")  

    DispatchQueue.main.async {  
        // 确保 result 是字典类型  
        if let resultDict = result as? [String: Any] {  
            let text = resultDict["text"] as? String ?? ""  
            let formatValue = resultDict["formatValue"] as? String ?? ""  

            // 构造返回结果  
            let scanResult: [String: String] = [  
                "result": text,  
                "scanType": formatValue  
            ]  

            // 执行回调  
            self.scanResultCallback?(scanResult)  
        } else {  
            console.log("Error: result is not a dictionary")  
        }  
    }  
}  

}

@objc public class NativeCode: UIViewController {
// 创建静态的 ScanDelegate 实例
private static let scanDelegate = ScanDelegate()

[@objc](/user/objc) public func scan(_ callback: @escaping ([String: String]) -> Void) {  
    // 设置回调  
    NativeCode.scanDelegate.scanResultCallback = callback  

    DispatchQueue.main.async {  
        let options = HmsScanOptions(scanFormatType: UInt32(HMSScanFormatTypeCode.ALL.rawValue), photo: false)  
        if let scanVc = HmsDefaultScanViewController(defaultScanWithFormatType: options) {  
            scanVc.modalPresentationStyle = .fullScreen  
            scanVc.defaultScanDelegate = NativeCode.scanDelegate  

            if let topVC = self.getTopViewController() {  
                topVC.present(scanVc, animated: true) {  
                    console.log("Scan view controller presented")  
                }  
            }  
        }  
    }  
}  

func getTopViewController() -> UIViewController? {  
    var topVC = UIApplication.shared.windows.first(where: { $0.isKeyWindow })?.rootViewController  
    while let presentedVC = topVC?.presentedViewController {  
        topVC = presentedVC  
    }  
    return topVC  
}  

}

针对你提到的uni-app UTS插件在iOS端无法触发代理的问题,这通常涉及到网络请求的代理配置。在iOS开发中,代理设置通常与网络请求的框架(如NSURLSession)相关。由于uni-app跨平台特性,具体实现可能依赖于原生插件或原生代码桥接。以下是一些可能的解决思路和代码示例,帮助你排查和解决问题。

1. 检查原生插件配置

首先,确保UTS插件在iOS原生项目中的配置是正确的。检查Info.plist文件是否包含了必要的网络权限配置,例如NSAppTransportSecurity设置。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

2. iOS原生代码代理设置

如果UTS插件依赖于原生网络请求,你可能需要在iOS原生代码中显式设置代理。以下是一个使用NSURLSessionConfiguration设置代理的示例:

- (NSURLSessionConfiguration *)configuredSession {
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSString *proxyHost = @"your.proxy.host";
    NSInteger proxyPort = 8080;
    
    NSDictionary *proxyDict = @{
        (NSString *)kCFStreamPropertyHTTPProxyHost: proxyHost,
        (NSString *)kCFStreamPropertyHTTPProxyPort: @(proxyPort),
        // 如果需要认证,可以添加以下两行
        // (NSString *)kCFStreamPropertyHTTPProxyUsername: @"username",
        // (NSString *)kCFStreamPropertyHTTPProxyPassword: @"password",
    };
    
    configuration.connectionProxyDictionary = proxyDict;
    return configuration;
}

在uni-app插件中,你可能需要通过JSBridge调用原生方法,使用上述配置创建NSURLSession实例。

3. 调试和日志

增加日志输出,检查代理设置是否生效,以及网络请求是否实际使用了代理。在iOS原生代码中,可以通过输出代理配置和网络请求的详细信息来调试。

NSLog(@"Proxy Configuration: %@", configuration.connectionProxyDictionary);

4. 更新和兼容性

确保uni-app和UTS插件都是最新版本,有时候问题可能由旧版本的bug引起。同时,检查iOS系统的兼容性,确保你的代码在目标iOS版本上运行正常。

由于具体实现细节可能因插件和项目的不同而异,上述代码和配置仅为示例。你可能需要根据实际情况调整代码,特别是与UTS插件的具体接口和配置相关的部分。如果问题依旧存在,建议查阅UTS插件的官方文档或寻求插件开发者的帮助。

回到顶部