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

## はじめに

現場ではMoyaという通信ライブラリを使用しています。
落ち着いたタイミングだったので使用しているライブラリをアップデートしたのですが、若干修正がありましたので備忘録として。

## 変更内容

- **AlamoFireのバージョンが4系から5系（記事作成時点で５.４）になったことでSessionManagerからSessionに変更**
[Moya/issue2601](https://github.com/Alamofire/Alamofire/issues/2601)
[Moya/issue2722](https://github.com/Alamofire/Alamofire/issues/2722)


- **MoyaProviderのinitパラメータが変更になったため修正。**
以下のページ参考
[Providers](https://github.com/Moya/Moya/blob/master/docs/Providers.md)
[Logging](https://github.com/Moya/Moya/blob/master/docs/Plugins.md#logging)
[Logging Sample](https://github.com/Moya/Moya/blob/master/Examples/_shared/GitHubAPI.swift)


### SessionManagerからSessionに変更

1つ目はMoyaというよりAlamoFireのマイグレーション。

```swift

//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時に必要なパラメータが変更

なのでこちらを対応しました。

```swift

// 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 `を修正。

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


## 参考

- [AlamoFire/github](https://alamofire.github.io/Alamofire/)
- [Moya/github](https://github.com/Moya/Moya)