はじめに
現場ではMoyaという通信ライブラリを使用しています。
落ち着いたタイミングだったので使用しているライブラリをアップデートしたのですが、若干修正がありましたので備忘録として。
変更内容
-
AlamoFireのバージョンが4系から5系(記事作成時点で5.4)になったことでSessionManagerからSessionに変更
Moya/issue2601
Moya/issue2722 -
MoyaProviderのinitパラメータが変更になったため修正。
以下のページ参考
Providers
Logging
Logging Sample
SessionManagerからSessionに変更
1つ目はMoyaというよりAlamoFireのマイグレーション。
//before
class DefaultAlamofireManager: Alamofire.SessionManager {
static let sharedManager: DefaultAlamofireManager = {
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders
configuration.timeoutIntervalForRequest = requestTimeOut
configuration.timeoutIntervalForResource = requestTimeOut
configuration.requestCachePolicy = .useProtocolCachePolicy
return DefaultAlamofireManager(configuration: configuration)
}()
}
// after
class DefaultAlamofireManager: Alamofire.Session {
static let sharedManager: DefaultAlamofireManager = {
let configuration = URLSessionConfiguration.default
configuration.headers = .default
configuration.timeoutIntervalForRequest = requestTimeOut
configuration.timeoutIntervalForResource = requestTimeOut
configuration.requestCachePolicy = .useProtocolCachePolicy
return DefaultAlamofireManager(configuration: configuration)
}()
}
-
Alamofire.SessionManager
をAlamofire.Session
に変更。 -
configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders
をconfiguration.headers = .default
に変更。
MoyaProviderのinitパラメータが変更になったため修正。
2つ目はMoyaProvider生成時のパラメータが変更になりました。
元々はProvider生成時にmanagerと通信レスポンスをjsonに整形してログに出力するよう設定していました。
ただ、今回修正箇所が2つありました。
- パラメータがmanagerからsessionに
- pluginsに設定するNetworkLoggerPluginのinit時に必要なパラメータが変更
なのでこちらを対応しました。
// before
private let accountProvider = MoyaProvider<AccountAPI>(manager: DefaultAlamofireManager.sharedManager,
plugins: [NetworkLoggerPlugin(verbose: true,
responseDataFormatter: JSONResponseDataFormatter)])
// after
private let accountProvider = MoyaProvider<AccountAPI>(session: DefaultAlamofireManager.sharedManager,
plugins: [NetworkLoggerPlugin(configuration: .init(formatter: .init(responseData: JSONResponseDataFormatter), logOptions: .verbose))])
次にJson整形用の設定のJSONResponseDataFormatter
を修正。
// before
func JSONResponseDataFormatter(_ data: Data) -> Data {
do {
let dataAsJSON = try JSONSerialization.jsonObject(with: data)
let prettyData = try JSONSerialization.data(withJSONObject: dataAsJSON, options: .prettyPrinted)
return prettyData
} catch {
return data
}
}
//after
func JSONResponseDataFormatter(_ data: Data) -> String {
do {
let dataAsJSON = try JSONSerialization.jsonObject(with: data)
let prettyData = try JSONSerialization.data(withJSONObject: dataAsJSON, options: .prettyPrinted)
return String(data: prettyData, encoding: .utf8) ?? String(data: data, encoding: .utf8) ?? ""
} catch {
return String(data: data, encoding: .utf8) ?? ""
}
}
返却値がDataからStringに。
最後に
こういう時はエラー内容で探すよりも、純粋に公式のサンプルだったり、issueを見る方が早いですね。
ライブラリの理解も深まったので良かったです。