だいたいそれでいいんじゃないの

つれつれなるkixixixixiの技術的なストック。http://reload.co.jp

iOS強制アップデートの機構について

強制アップデートを実装しておいた方が、今後機能拡張した際に助かるはず!
ということで実装したのですが、わざわざそれのためにエンドポイントを作るのは微妙だし毎回確認してたら無駄なオーバーヘッドが増えるなと思います。
なので、考えた手段は、
- HTTPヘッダーにバージョン番号を記したヘッダーを追加
- UserAgentにバージョン番号を付加
どっちもクライアントでする作業はとってもらくで2〜3行くらいでよさそう。
AFSessionManegerでheaderを追加するならこれだけ。

let manager :AFHTTPSessionManager = AFHTTPSessionManager()
let serializer:AFJSONRequestSerializer = AFJSONRequestSerializer()
if let ver: AnyObject = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion")
{
    manager.requestSerializer.setValue("\(ver)", forHTTPHeaderField: "App-Version")
}

サーバー側で毎回わかりやすいstatus codeを返してやればいけそう。
railsだと before_action

def check_version!
    version = request.headers['App-Version']
    if version && version.to_i < 2
        render json: { error: 'Need Update' }, status: 303
    end
end

303でいいのかわからないけど、とりあえずつかわなそうな See Other をつかってみる。503とかのがいいのかな。
それでクライアント側ではFailureのcallbackでひろってやれば、あとはUIAlertなどを飛ばせば、大丈夫なはず。

if let response = operation.response as? NSHTTPURLResponse
{
    if response.statusCode == 303
    {
        // do something
        return
    }
}

以上。