うさぎ駆動開発

UWP, Xamarin.Macを中心によしなしごとを書いていきます。

<週刊 自分のごちうサーチを作る> #7 URLがドロップされたときの処理

前回記事はこちら。

aile.hatenablog.com

今回のお品書き。

  • コンテナディレクトリを作る
  • アプリケーション終了時にコンテナディレクトリを消す
  • URL がドロップされたときにコンテナディレクトリにファイルを保存する
  • 保存されたファイルをもとに検索する

コンテナディレクトリとは

サンドボックス化しないなら特に考える必要はありませんが,せっかくなのでAppStore審査基準にマッチさせる方法を学びましょう。サンドボックス下で使えるパスについてはこちらを。

developer.apple.com

App Container Directory はユーザーの明示的な許可無しでアクセスできます。NSHomeDirectory で取得でき,サンドボックス化されている場合は ~/Library/Containers/{app identifier}/Data になり,されていない場合はホームフォルダが返ります。

ただこのAPIはXamarinでは実装されていないため,P/Invokeしましょう。適当な場所にNativeMethods静的クラスを作り,下記のように実装します。

一時ディレクトリの作成と削除

アプリケーション起動時,コンテナディレクトリに一時ディレクトリを作成し,終了時に削除しましょう。

AppDelegate.csDidFinishLaunching, WillTerminate が実装すべき場所です。このようになります。

MainWindowController のコンストラクタで,作成した一時ディレクトリのパスを受け取りましょう。

画像のダウンロード

日本語URLが飛んできたときも大丈夫なように,Punycode対応もしておきましょう。ImageUrlDropped イベントを購読して,下記のように実装します。

コンストラクタで受け取った一時ディレクトリにパスを追加して,その場所にダウンロードしています。前回作成したFindImageにパスを渡せば,あとはよろしくやってくれるはずです。では画像URLをブラウザからドラッグ&ドロップしてみましょう。

f:id:ailen0ada:20160605151857p:plain

サンドボックス有効にしていないので,ホームフォルダ配下に.browserフォルダが作成されているのがわかります。もちろん被る可能性があるので,Guidを使うなど工夫の余地はあります。サンドボックスを有効にした場合には自分の管理下であることが保証できるので,名前は何でもかまいません。

今後やること

Xamarin.Mac 基礎は完了しました。ここまでで基本的な機能は実装できているので,ここから先は「優しさ」になっていきます。