Swift転職なら=>【LevTech】
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

頭痛が減ったので共有です!

rebuild.fmを応援しています!

HOME > NSURLSession

NSURLSessionでバックグラウンドで通信処理

サンプル画像

NSURLConnectionの進化版のような立ち位置に私は感じております。アプリがバックグラウンドになっても通信処理を続けてくれる優れものです。 以前まではどうやら音声や位置情報だけに限られていましたが、このクラスによって大きなデータをユーザに気持ちよくDLしてもらうことも可能にです。

プロトコルはHTTPだけですが、 ZIPファイルなんかを大量にデータを詰め込んでDLする等利用価値はかなり高いのではと思います。NSURLConnectionは汎用的でFTP等の通信プロトコルにも対応していますので、 臨機応変にご利用いただければ感謝です。

NSURLSessionのクラス階層


NSObject

NSURLSession


参考:NSURLSession のまとめ
参考:Foundation Framework Reference NSURLSession Class Reference
参考:iOS 7で一新された通信周り〜NSURLSessionってなに?〜
参考:iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

やってみた

Swifサラリーマンのサーバにある25KB程度のZIPをダウンロードするサンプルです。


import UIKit

class ViewController: UIViewController, NSURLSessionDownloadDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let newsUrlString = "http://swift-salaryman.com/files/download/ssziparchive_sample.zip"
        
        //ネットワーク上からZIPをダウンロードする
        var sessionConfiguration:NSURLSessionConfiguration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.company")
        var session:NSURLSession! = NSURLSession(configuration: sessionConfiguration, delegate: self, delegateQueue: nil)
        var downloadTask:NSURLSessionDownloadTask = session.downloadTaskWithURL(NSURL(string:newsUrlString)!);
        downloadTask.resume()
        
    }
    //ZIPファイルをネットワーク上からDL完了後に呼ばれる
    func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL){
        println(location);
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

このZIPファイルを解凍する方法は過去記事のSSZipArchiveをご一読いただければ感謝です

カスタマイズ

少しだけNSURLSessionConfigurationの設定に関して説明します。


HTTPMaximumConnectionsPerHost

ホストに対しての同時接続の上限です。バックグラウンドで実行できる非同期のNSURLSessionですので重複しますので、 ホストに対しての上限をこのプロパティで調整することが可能です


allowsCellularAccess

こちらはセルラーアクセスが可能かどうかです。Wifi接続ではなく3Gとか4Gとかですね。通信をWifiだけに限定して ユーザフレンドリーにしたりも可能です。僕的にも4Gの時なんかに大きなファイルを勝手にDLしているのは止めてほしいです。。。


timeoutIntervalForRequest

リクエスト毎のタイムアウトと判断する閾値の設定です。デフォルトは60秒。

まとめ

非同期セッション関連の作業は面倒な処理が多いと思っていましたが、ソースを整理してみると以外に短くほっとしました。 よろしければご利用いただければ感謝です:)

↓こんな記事もありますよ!

アイコン一括作成サービス紹介

アプリのアイコンを作るのは手間で面倒くさい。と、思いながらPhotoshopで一つ一つサイズを変えて作っていたのですが、 簡単につくれるサービスやっぱりありました。Macのスクリプトだったり、Webサービスだったりと揃っていましたので共有します。

デバッグ時とリリース時に処理を変更する#ifdef DEBUG のやり方

DEBUG時だけ特定の動作をさせて、リリース時に排除したい、そんな時に利用する方法です。Swiftでは標準ではDEBUGとリリースの判断がつかないので、 コンパイル時に設定する必要があります

SqliteのDBファイル保存+レビュー却下

2回既にレビューを通過していたアプリが、バイナリレビューで却下されてしまいました。理由は、2.23 Details On launch and content download, your app stores 26.48MB on the user's iCloud, which does not comply with the iOS Data Storage となっていてiCouldに保存される量にしては多いから管理してください、といった旨の内容でした。別に却下理由に難癖つけるつもりではないのですが、最初のレビュー時にいってほしい。。。
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!