我将阿波罗iOS 0.8与Xcode 9.3、Swift 4.1和iOS 11一起使用,并初始化阿波罗客户端实例,如下所示:
import Apollo
// ... unrelated code skipped
let configuration = URLSessionConfiguration.default
if let token = keychain.accessToken {
// Add additional headers as needed
configuration.httpAdditionalHeaders = [
"Authorization": "Bearer \(token)"
]
}
let graphqlEndpoint = URL("https://sample-server-url/graphql")!
let client = ApolloClient(networkTransport:
HTTPNetworkTransport(url: graphqlEndpoint, configuration: configuration))
该应用程序可以很好地处理发送到GraphQL服务器的所有查询和突变,不存在任何问题,除非应用程序处于后台。据我所知,使用常见的NSURLSession
实例,可以通过将会话配置切换到URLSessionConfiguration.background(withIdentifier: "your-session-id")
来轻松地解决这个问题。
但当我更换线路时
let configuration = URLSessionConfiguration.default
使用
let configuration = URLSessionConfiguration.background(withIdentifier: "your-session-id")
该应用程序因以下错误而开始崩溃:Terminating app due to uncaught exception 'NSGenericException', reason: 'Completion handler blocks are not supported in background sessions. Use a delegate instead.'
在使用阿波罗GraphQL时,解决此错误的最佳方法是什么,或者是否有其他方法与后台的GraphQL服务器进行通信?
发布于 2018-05-04 07:57:43
阿波罗iOS提供了一个公共NetworkTransport
协议,允许覆盖所有网络交互。实现可以作为ApolloClient(networkTransport: NetworkTransport)
初始化器的参数提供。
假设您有一个NetworkTransport
实现,它用后台会话配置包装URLSession
实现:
class BackgroundTransport: NetworkTransport {
public func send<Operation>(operation: Operation,
completionHandler: @escaping (GraphQLResponse<Operation>?, Error?) -> Void)
-> Cancellable where Operation: GraphQLOperation {
// ...
}
}
然后,您可以这样初始化ApolloClient
:
let graphqlEndpoint = URL("https://sample-server-url/graphql")!
let client = ApolloClient(networkTransport: BackgroundTransport(url: u))
BackgroundTransport
实现可以根据需要定制,包括根据后台会话配置的需要使用URLSession
委托而不是完成处理程序块。
如果在应用程序中使用阿拉莫火,还可以使用ApolloAlamofire库,该库提供了对后台URLSession
配置和其他一些特性的支持,从而实现了NetworkTransport
。
https://stackoverflow.com/questions/50089546
复制相似问题