1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Moyaのver13.0から14.0へアップデート

Posted at

はじめに

現場では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.SessionManagerAlamofire.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を見る方が早いですね。
ライブラリの理解も深まったので良かったです。

参考

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?