2014年9月12日金曜日

Chilkat Softwareさんのftp2ライブラリ for iOS objective-c

まぁ、いろいろあって、iPad用に急遽日本語エンコーディングを明示的に指定できるライブラリが必要になった次第です。

以前から目をつけていたのはChilkat Softwareさんのライブラリ。まぁ通信系のライブラリを探していてこのバナーを見たことのあるヒトは少なくないのでは。


当該プロジェクトでも当初コレを使おうと提案していたのですが、当時はsftpを使う予定でSecureな部分が輸出規制にひっかかるためボツになったという経緯がありました。

で、今回背に腹は変えられず、ともかく動作確認のためのプロジェクトを作ってみました。

■評価版ライセンス■

static libraryの形で配布されており、30日間、シミュレータ上でだけ動作させることができます。

このページからダウンロードリファレンスなどへ飛べます。とりあえずはリファレンスObjective-C FTP Examplesのページを見るのが一番手っ取り早いと思います。

■リファレンスをざっと見る■

よくある通信系ライブラリと同様、まず処理のためのインスタンスを作り、そこにメッセージを送っていくというタイプです。Propertiesを眺めていくと、ftpってこんなに色々あるんかいwってぐらい機能が沢山あります。

今回問題になったencodingに関しても、CommandCharsetとDirListCharset propertyがあります。ディレクトリ作成などに作用するCommandCharsetにansi, SJIS, UTF8などを代入すれば、FEATでサーバと相談した上で適切なエンコーディングを実施してくれます。lsでディレクトリを取ってくる場合のencodingはDirListCharsetを使います。

ftp.CommandCharset = @"SJIS";
ftp.DirListCharset = @"SJIS";
NSString *xml = [ftp GetXmlDirListing:@"*.jpg"];
if  (xml == nil) {
    // エラー処理
}

って感じです。ディレクト作成やget/putなどに関しては、予めカレントディレクトリを設定してから操作することも、フルパスで指定することもできます。今回は同期しか試しませんでしたが、非同期も用意されています(何でもかんでも非同期にしてしまうのではなく、getfile/putfileが対象…かな? AcyncGetFileStart/AsyncPutFileStart)。

■動かして見る■

例によってロクにドキュメントも読ますに、「ダウンロードしてきたライブラリをプロジェクトにドラッグ&ドロップすりゃ動くだろw」とやっていたら案の定ハマりました。

上のライセンス条項に「シミュレータ上でだけ」とあります。つまり評価版として使えるのはi386 static libraryだけなのでプロジェクトにドラッグ&ドロップするのは「cpp_include」「include」「lib/i386」だけにします。TARGETS > Build Settings > Architectures > Valid Architecturesには「i386」だけ設定します。

なお、プロジェクトへのライブラリのドラッグ&ドロップで試行錯誤してたら、Linkerへのpathにゴミが溜まってwarningの嵐になったりしますのでご注意を。ライブラリを一旦削除してもpathの設定がそのまま残っちゃうんですよね。

今回評価目的だったので使いませんでしたが、ダウンロードしたファイルには各バイナリ向けを1つに束ねたunivarsal static libraryにするためのshスクリプトも付属しています(リンク先の5)。コマンドライン一発でエラーもでません。

【追記】その他、c++を通すための設定が必要なのですが、サポートページにも書いてあるようにダミーのcppクラスを追加するのが一番手っ取り早いです。File▶New...▶File...▶iOS/C and C++▶C++ Classあとは「DummyClassForChilkat」など適当な名前を付けて保存します。

あとはコードを書いて動かすだけ。API名やエラー戻り値もすっきりしていて、サクサク書けます。余談ですが、API名に美しい規則性と論理性があると書いてて指が止まらないよね。好きなライブラリです。

今のところ私が個人でこのライブラリを使う予定はないのですが、何か通信系の案件が立ち上がったら真っ先にこれ使います。

ちゃんとしたftpサーバが相手なら、AppleのSimpleFTPSampleでも使われているCFFTPStream系でも用が足りるんですけどね…。あー疲れた。MetaWareとかで遊んで疲れを癒やしたい。

MetaWareをJack-inする電脳たれぱんだ

■余談ですが■

今週の水曜日が最終出社日だったんですが、本番サーバでのエンコーディング問題が発覚したのが先週木曜日。それから怒涛の日々だった。水曜日の午後から退職前の有給休暇消化期間だったけど、「それなに?美味しいの?」状態。PMのYさんがいい人なので、とりあえず今週は無報酬でお手伝いするって伝えたんですが…しんどかった。

ちなみに会社都合で有給休暇を取り消して作業させた場合には、休日出勤とみなされて6割増し以上の賃金を支払う義務があるんですよね(苦笑)。

0 件のコメント:

コメントを投稿