我用Ktor去做网络请求,在Android上是没有问题的,在iOS上就会阻塞在get方法不会往下走,重新点击一下才会接着往下走,这是啥问题呢?
该回答引用ChatGPT4与博主@晓码自在合作编写:
这个问题很可能是由于iOS的网络安全策略导致的。
在iOS上,默认情况下,网络请求只能在用户交互(如点击)triggers 后才被允许执行。这是为了防止app在用户无感知的情况下发起网络请求。
所以,在你的场景下,第一次执行suspend fun greet()时,会在get方法发起网络请求后被阻塞,等待用户交互。等用户点击后,请求得以继续执行, greet方法返回。
要解决这个问题,有两种方案:
kotlin
button.setOnClickListener {
greet()
}
这样,用户点击button后,greet方法中的网络请求会得到允许,不会阻塞。
2. 使用NSURLSessionConfiguration来配置UTM请求,设置allowsCellularAccess属性为true。
kotlin
val config = NSURLSessionConfiguration.defaultSessionConfiguration()
config.allowsCellularAccess = true
val client = HttpClient(config) { /*...*/ }
这样,网络请求会一直有效,不会被阻塞。
需要注意的是,第二种方案会一直允许app在后台发起网络请求,可能影响用户的网络流量与电池寿命。所以,如果非必要,还是推荐在发起网络请求前添加一定的用户交互来获取授权。