fastmonkey 使用carthage 集成 Alamofire

本文介绍了如何在iOS稳定性测试工具fastmonkey中利用Carthage集成网络库Alamofire,并解决在集成过程中遇到的问题。在使用过程中,由于Alamofire默认为异步操作,为了方便控制流程,文章还讲述了如何将Alamofire的网络请求改为同步操作的方法。同时,文中提到在真机调试时遇到的网络权限问题及其解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

fastmonkey 是一款ios上的稳定性测试工具,可以插入一些序列事件,比如自动登录的逻辑,由于我司产品自动登录需要依赖短信验证码,因此自动登录的逻辑就是在执行过程中,通过自动化Ui点击发送验证码,并使用网络请求接口去查询短信验证码回填后登录。本文适合对fastmonkey有一定使用经验的人阅读…

网络请求

过程中涉及到网络请求,考虑到对于swift语言不熟悉,自然想到依赖第三方库, 通过一番搜索,发现swift中的Alamofire是比较常用的,因此选择这个,先看下Alamofire的普通get请求,就知道它有多优雅了:

        Alamofire.request( "https://raw.githubusercontent.com/LeoMobileDeveloper/React-Native-Files/master/person.json").responseJSON { (response) in
            if let JSON = response.result.value {
                print("JSON: \(JSON)")
            }
        }
        

集成并使用

fastmonkey项目使用swift开发,使用carthage进行包管理,由于调用xctest的私有api,因此具有高效率的自动化操作动作,但仅限于xcode10使用,原因是xcode10以上已经移除了相关私有api,仅能使用公共api,操作效率大打折扣。因此,本文使用xcode10进行项目构建,所以 用的是 Alamofire4

安装

cartfile文件里新增一行:
github "Alamofire/Alamofire" == 4.9.0
随后使用一下命令安装完依赖:
carthage update --platform iOS

执行

执行过程可能会报错,我遇到的一个错误是:

dyld: lazy symbol binding failed: can't resolve symbol  或 
未能载入软件包“XCTestWDUITests”,因为它已损坏或丢失必要的资源。 请尝试重新安装软件包。

考虑到是和使用Alamofire相关,具体就是这个模块找不到之类的,但是我确实安装了,由于跑的是UItests的target,就到该target下找,发现在Build Phases下的Copy Files并没有加入Alamofire的framework,加上就好了。Alamofire.framework路径在:
/path_to_project/fastmonkey/XCTestWD-master/Carthage/Build/iOS

在这里插入图片描述
ps:由于Alamofire是异步操作的,可能网络请求还没进行完,后续的代码也开始执行了,因此需要把Alamofire变为同步操作,方便获取到接口数据后再做下一步操作

修改Alamofire为异步操作

发现Alamofire不支持同步操作(也可能是我太菜了,还不会使用闭包解决),所以我改用了基础的NSURLSession发起同步的网络请求,封装成一个函数用的时候调用下,就能返回手机验证码,具体代码如下:


public func getLoginSmsCode(phone:String) -> String{
    
    // 1 获取数据
    // 2 同步请求
    
    print("请求发送验证码...")
    
    
    var smsCode = ""
    
    
    //创建URL对象
    let urlString:String="http://xxxxxxxxx.com/get"
    
    //form-data
    let postStr = "selEnv=测试环境&catgory=更换设备验证手机号&phone=\(phone)"
    let url = URL(string:urlString)
    //创建请求对象
    var request = URLRequest(url: url!)
    
    
    request.httpMethod = "POST"
    
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Types")
    request.httpBody = postStr.data(using: .utf8)
    
    let session = URLSession.shared
    
    let semaphore = DispatchSemaphore(value: 0)
    
    let dataTask = session.dataTask(with: request,
                                    completionHandler: {(data, response, error) -> Void in
                                        if error != nil{
                                            
                                        }else{
                                            let str = String(data: (data)!, encoding: String.Encoding.utf8)
                                            let resultJson = JSON.init(parseJSON:str!)
                                            smsCode = resultJson[1][0].rawString()!
                                        }
                                        
                                        
                                        semaphore.signal()
    }) as URLSessionTask
    
    //使用resume方法启动任务
    dataTask.resume()
    
    _ = semaphore.wait(timeout: DispatchTime.distantFuture)
    print("获取验证码完成..!")
    return smsCode
}

这样调用即可
let smsCode = getLoginSmsCode(phone: "180xxxxxxxx")

模拟器调试是可以的,但是真机显示 HTTP load failed (error code: -1009,-1009是NSURLErrorNotConnectedToInternet的错误码,也就是没有网络,折腾了我好几天,最后就是在手机上重复打开那个UITEST的工程,授权下网络即可,如果还不行可以试试 设置->开发者->PASSKIT TESTING->勾选Allow HTTP Services

参考自:

https://www.cnblogs.com/dapped/p/8891128.html
https://www.jianshu.com/p/390890795730
https://www.jianshu.com/p/55ec0d466fd9

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值