この記事は2018年09月26日に投稿しました。
この記事は2018年09月30日に更新しました。
目次
[改訂新版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)
- 作者: 石川洋資,西山勇世
- 出版社/メーカー: 技術評論社
- 発売日: 2018/01/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
1. はじめに
こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回はSwiftのFTPでファイル一覧を取得してみます。
PWEditorでは、SwiftでFTPを操作するため、
- BlackRaccoonライブラリ
を使用しています。
2. 前提
下記の記事を参考にBlackRaccoonライブラリを使用できる状態にしておいてください。
3. ファイル一覧取得処理
SwiftのFTPでファイル一覧を取得するには、BlackRaccoonライブラリのFTPディレクトリリスト(BRRequestListDirectory)オブジェクトを使用します。
以下に手順を示します。
- FTPファイル一覧を取得するViewControllerにBRReqeuestDelegateを設定します。
- FTPファイル一覧取得を行うFTPディレクトリリスト(BRRequestListDirectory)オブジェクトをインスタンス変数で用意します。
FTPディレクトリリスト(BRRequestListDirectory)オブジェクトを生成し、FTPで接続するパラメータ(ホスト名、ユーザ名、パスワード、パス名)を設定します。
- ホスト名は、IPアドレス形式またはURL形式で指定可能です。
- ホスト名、ユーザ名、パスワードに使用できる文字は1バイト文字のみです。
2バイト文字の場合、クラッシュします。 - パス名は、ルートディレクトリの場合は"/"、サブディレクトリの場合は"/<サブディレクトリ名>"を指定します。
FTPディレクトリリスト(BRRequestListDirectory)オブジェクトのstartメソッドを実行し、ファイル一覧取得を開始します。
ファイル一覧取得の結果は、以下のメソッドでコールバックされます。
- 正常な場合はrequestCompletedメソッド
- エラーの場合はrequestFaildメソッド
- ファイルの更新許可を判定する場合はshouldOverwriteFileWithRequestメソッド
コールバックメソッドはドキュメントをみるとわかるように、他のファイル操作を行った場合も呼び出されます。
そのため引数requestがFTPディレクトリリスト(BRRequestListDirectory)オブジェクトと等しいかチェックして、FTPファイル一覧処理の結果としてコールバックメソッドが呼び出されたか判断しています。shouldOverwriteFileWithRequestメソッドは、おそらくFTPアップロードの時にだけ必要なメソッドで、既存のファイルを上書きしてよいかどうかを返却します。
そのためFTPアップロードの時はtrue、それ以外はfalseを返却するようにしています。ファイルの情報はFTPディレクトリリスト(BRRequestListDirectory)オブジェクトのfilesInfoに格納されています。
filesInfoはNSDictionary型配列となっています。
1つのディレクトリ/ファイルの情報は、NSDictionary型配列の1つの要素に格納されています。
ディレクトリ/ファイルの"名前"、"サイズ"といった属性情報は、1つのNSDictionary型の要素に決められたキーで格納されています。
そのためPWEditorでは、ファイルの属性情報を取得するユーティリティクラス(FtpFileInfoUtils)を用意しています。ディレクトリかファイルかは、タイプで判断します。
タイプの値により以下のようになっています。- ディレクトリ : 4
- ファイル : 8
- リンク : 10
最後に2重起動防止のため、FTPディレクトリリスト(BRRequestListDirectory)オブジェクトをクリアします。
実装例
class FtpFileListViewController: UIViewController, BRRequestDelegate { // 2. FTPディレクトリリストオブジェクト var ftpListDirectory: BRRequestListDirectory! /** FTPでファイル一覧の取得を開始します。 */ func startGetFtpFileList(_ pathName: String) { if ftpListDirectory != nil { // FTPディレクトリリストオブジェクトが有効な場合、2重起動防止のため処理を終了します。 return } // 3. FTPディレクトリリストオブジェクトを生成し、FTPで接続するパラメータを設定します。 ftpListDirectory = BRRequestListDirectory(delegate: self) ftpListDirectory.hostname = <ホスト名> ftpListDirectory.username = <ユーザ名> ftpListDirectory.password = <パスワード> ftpListDirectory.path = pathName // 4. ファイル一覧取得を開始します。 ftpListDirectory.start() } /** 5. FTPのリクエストが完了した時に呼び出されます。 - Parameter request: FTPリクエスト */ func requestCompleted(_ request: BRRequest) { if let request == ftpListDirectory { // FTPリクエストがFTPディレクトリリストオブジェクトと等しい場合 // 正常終了の場合の処理を記述してください。 if let ftpFileInfo = ftpListDirectory.filesInfo as? [NSDictionary] { // 6.ディレクトリ/ファイル情報を取得できた場合の処理を記述してください。 } // 7. 2重起動防止のため、FTPディレクトリリストオブジェクトをクリアします。 self.ftpListDirectory = nil } } /** 5. FTPリクエストがエラーした時に呼び出されます。 - Parameter request: FTPリクエスト */ func requestFailed(_ request: BRRequest) { if let request == ftpListDirectory { // FTPリクエストがFTPディレクトリリストオブジェクトと等しい場合 // エラー終了の場合の処理を記述してください。 // 7. 2重起動防止のため、FTPディレクトリリストオブジェクトをクリアします。 self.ftpListDirectory = nil } } /** 5. 上書きリクエスト時に呼び出されます。 - Parameter request: FTPリクエスト */ func shouldOverwriteFileWithRequest(_ request: BRRequest) -> Bool { // 上書きを禁止します。 return false } }
import Foundation /** 6. FTPファイル情報ユーティリティクラス - Version: 1.0 新規作成 - Author: paveway.info@gmail.com */ class FtpFileInfoUtils: NSObject { /** 名前を取得します。 */ class func getName(_ ftpFileInfo: NSDictionary) -> String { let result = getString(ftpFileInfo, key: kCFFTPResourceName) return result } /** リンクを取得します。 */ class func getLink(_ ftpFileInfo: NSDictionary) -> String { let result = getString(ftpFileInfo, key: kCFFTPResourceLink) return result } /** グループを取得します。 */ class func getGroup(_ ftpFileInfo: NSDictionary) -> String { let result = getString(ftpFileInfo, key: kCFFTPResourceGroup) return result } /** サイズを取得します。 */ class func getSize(_ ftpFileInfo: NSDictionary) -> Int { let result = getInt(ftpFileInfo, key: kCFFTPResourceSize) return result } /** オーナーを取得します。 */ class func getOwner(_ ftpFileInfo: NSDictionary) -> String { let result = getString(ftpFileInfo, key: kCFFTPResourceOwner) return result } /** タイプを取得します。 */ class func getType(_ ftpFileInfo: NSDictionary) -> Int { let result = getInt(ftpFileInfo, key: kCFFTPResourceType) return result } /** 更新日時を取得します。 */ class func getModDate(_ ftpFileInfo: NSDictionary) -> String { let result = getDate(ftpFileInfo, key: kCFFTPResourceModDate) return result } /** モードを取得します。 */ class func getMode(_ ftpFileInfo: NSDictionary) -> Int { let result = getInt(ftpFileInfo, key: kCFFTPResourceMode) return result } // MARK: - Private /** 文字列型の値を取得します。 */ fileprivate class func getString(_ ftpFileInfo: NSDictionary, key: CFString) -> String { var result = "" let keyString = key as String if let value = ftpFileInfo.value(forKey: keyString) { if let resultString = value as? String { result = resultString } } return result } /** Int型の値を取得します。 */ fileprivate class func getInt(_ ftpFileInfo: NSDictionary, key: CFString) -> Int { var result = 0 let keyString = key as String if let value = ftpFileInfo.value(forKey: keyString) { if let resultInt = value as? Int { result = resultInt } } return result } /** Date型の値を取得します。 */ fileprivate class func getDate(_ ftpFileInfo: NSDictionary, key: CFString) -> String { var result = "" let keyString = key as String if let value = ftpFileInfo.value(forKey: keyString) { if let date = value as? Date { result = DateUtils.getDateString(date) } } return result } }
4. おわりに
他のFTP操作も大体同じような手順になります。
そのため一つできてしまえば、他のFTP操作は簡単に実装できると思います。
とりあえず稼ぎたいなら、ITエンジニア【IT派遣テクノウェイブ】
詳細!Swift 4 iPhoneアプリ開発 入門ノート Swift 4+Xcode 9対応
- 作者: 大重美幸
- 出版社/メーカー: ソーテック社
- メディア: Kindle版
- この商品を含むブログを見る
紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。
私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリやウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。
また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688