kitoko552.memo

kitoko552のメモ

AlamofireのSwift 3対応バージョンをiOS 8対応のプロジェクトでも使えるようにする

要点

  • AlamofireのSwift 3対応バージョンである4.0.0は対応OSがiOS 9以上
  • iOS 8でも使いたい場合は、フォークしてURLSessionStreamTaskを使っている部分をコメントアウトすると使える

Swift 3登場

先日正式版のiOS 10, Xcode 8がリリースされ、既存のアプリをSwift 3で書き換えようと思っているプロジェクトが多いのではないでしょうか。

Swiftのアップデートではアプリそのもののコードだけでなく、使っているライブラリもアップデートしなければいけません。
使っているライブラリが全てSwift 3対応バージョンをリリースしている、かつ、自分のアプリの対応OSバージョンをカバーしているのであれば単純にライブラリのバージョンをアップデートすればいいだけですが、そうでない場合もあります。

ライブラリがSwift 3に対応する気配がない場合は、管理者を催促したり、自分でプルリクエストを送ったりしなければいけません。
自分のアプリの対応OSバージョンをカバーしていない場合は、フォークしてなんとか動くように変更し自分のプロジェクトに入れるか、使用を諦めるかする他ありません。

Alamofire 4.0.0の対応OSバージョンがiOS 9+に

多くのアプリが使っているであろうAlamofireも例外ではありません。
AlamofireのSwift 3対応バージョンである4.0.0は対応OSがiOS 9以上となっています。

自分のアプリがiOS 9以上しか対応しないのであればなんの問題もありませんが、プロジェクトの事情でiOS 8のユーザーを切り捨てることができないところも多いのではないでしょうか。

元凶はURLSessionStreamTask

しかし、Alamofire 4.0.0のコードを見ていくと、少しいじるだけでiOS 8をカバーしつつSwift 3で使えるようにすることが可能そうです。

まず、Alamofire 4.0.0のコードを読むと、iOS 9以上の理由がURLSessionStreamTaskであることがわかります。
URLSessionStreamTask自体がiOS 9以上でしか使えないクラスなのです。

Alamofire.swiftを覗いてみると、以下の2つのメソッドがURLSessionStreamTaskを使っている箇所のようです。

// Alamofire.swift

@discardableResult
public func stream(withHostName hostName: String, port: Int) -> StreamRequest {
    return SessionManager.default.stream(withHostName: hostName, port: port)
}

@discardableResult
public func stream(with netService: NetService) -> StreamRequest {
    return SessionManager.default.stream(with: netService)
}

逆にこの部分さえなければiOS 8でも動くのがわかります。

この2つのメソッドはもちろん4.0.0で追加されたメソッドなので、既存プロジェクトで使っていることはありません。
なのでコメントアウトしても何のの問題もありません。

更にこのメソッドから辿ってこのメソッドからしか使われていない箇所を全てコメントアウトしてやると、iOS 8のプロジェクトでもビルドが通ります。

フォークして以上の作業をやってプロジェクトに取り込めばiOS 8対応のプロジェクトでも使えるようになるでしょう。