読者です 読者をやめる 読者になる 読者になる

Xamarin 日本語情報

Xamarin(ザマリン) の代理店だったエクセルソフト田淵のブログです。主に Xamarin に関するエントリーをアップしていきます。(なるべく正しい有益な情報を掲載していきたいと考えていますが、このブログのエントリーは所属組織の公式見解ではありませんのでご注意ください)

Xamarin.iOS で CFBundleDocumentTypes で指定したファイルを受け取れるようにするには

こんにちは。エクセルソフトの田淵です。

本当は Share Extension を使わないといけないんです。テキストの共有をしたい場合は。でも、今回はテキスト「ファイル」を他のアプリから共有する方法をメモします。

公式ドキュメントはこれかな?

developer.apple.com

Share Extensions については以下が詳しいです。

qiita.com

blog.asobicocoro.com

次回以降にちゃんと Share Extensions でテキスト共有したいと思います。

メール添付されたテキストファイルを受け取りたい

テキストファイル、画像ファイル(png, jpg など)など、ファイルを処理したい場合は、Share Extensions を使わなくてもなんとかなります。

safx-dev.blogspot.jp

にもある、

CFBundleDocumentTypes

です。

準備

info.plist を編集します。

Xamarin Studio では Info.plist を開き、[詳細]タブの[ドキュメントの種類]から[ドキュメントタイプの追加]ボタンをクリックして、適切な「Types」を指定してあげれば大丈夫です。

f:id:ytabuchi:20170206221148p:plain:w450

ドキュメントタイプは公式の以下のサイトを参考にしてください。

developer.apple.com

今回は LSItemContentTypespublic.textpublic.png を指定してみました。

Visual Studio では、GUI では設定できないので、右クリックから[ファイルを開くアプリケーションの選択]をクリックし、[自動エディター付きセレクター]を選択して XML の最後に以下を追加します。

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>TEXT</string>
        <key>LSHandlerRank</key>
        <string>Alternate</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>public.text</string>
        </array>
    </dict>
    <dict>
        <key>CFBundleTypeName</key>
        <string>PNG</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>public.png</string>
        </array>
    </dict>
</array>

PNG の方は Xamarin Studio の GUI で設定したもので LSHandlerRank の記述がありませんが、問題なく共有リストには出て来ました。

こんな感じ

f:id:ytabuchi:20170206225117p:plain:w300

 受け取った後は

AppDelegate クラスの OpenUrl(UIApplication app, NSUrl url, NSDictionary options) メソッドをオーバーライドして受け取り時の処理を追加します。受け取り後、専用の ViewController を呼ぶことも出来ると思います。

f:id:ytabuchi:20170206222446p:plain:w450

NSUrl 型の url に共有されたデータの情報が含まれています。

url.Scheme でデータのスキーマが取得できます。今回はファイルの共有なので「file」です。App Link で独自スキーマを設定した場合は、ここで処理を分岐してください。

file スキーマの場合は、url.AbsoluteString で string 型を取得できるので、今回はファイル名のみ LINQ で抜き出して Static な string のプロパティに格納しました。

public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
{
    try
    {
        if (url.Scheme == "file")
        {
            FileData.FileName = url.AbsoluteString.Split('/').Last();
        }
        else if (url.Scheme == "MyApp")
        {
            // CustomUrlSchemeの対応
        }
        return true;
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.InnerException);
    }
    return false;
}

ファイルを受け取ると、アプリ内の Documents/Inbox にファイルが保存されます。

後は、ViewController で

var dir = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
var file = Path.Combine(dir, "Inbox", FileData.FileName);
var text = File.ReadAllText(file);

で、Documents/Inbox のファイルを読み込めます。Environment.GetFolderPath(Environment.SpecialFolder.Personal)Documents フォルダなので、後は Combine するだけですね。

Environment.SpecialFolder で取れる各種フォルダは、id:ch3cooh393 酢酸先生の

blog.ch3cooh.jp

が参考になるかと思います。

Xamarin 気になった方は

是非 ダウンロード して触ってみてください。Visual Studio 2015 をご利用の方は Update 3 にアップデートする際にカスタムインストールで Xamarin を追加しましょう。 学習用リソースJXUG リンクページ に参考資料を纏めてますので併せてどうぞ。

Xamarin の導入支援サービスを始めました。ベースは基本的なアプリを一緒に作ることで Xamarin を使えるようになって頂く内容ですが、ご要望に応じて講習内容のカスタマイズも可能です。詳しくは田淵までお問い合わせください(^^)

有償セミナー、トレーニング | Xamarin : XLsoft エクセルソフト

Xamarin の情報が欲しい方はこのブログも購読いただいたり、私のTwitterアカウントをフォローいただいたりすると嬉しいです。

私が所属している エクセルソフト の宣伝を少しさせてください。弊社は開発者向けの様々なソフトウェアを扱っています。おなじみの ReSharper (JetBrains)、 や Atlassian の JIRA, Confluence、Office/PDF ファイルを .NET/Java で操作するライブラリ Aspose(アスポーズ)Windows アプリ、Web ページ、iOS/Android アプリの UI テストができる TestComplete などお勧めです(^^) また、Visual Studio Professional/Enterprise with MSDN も販売してますし、日本で売っていない海外のソフトウェア、開発ツールなどを弊社経由で日本円で購入頂くことも可能です。ご興味あれば 弊社ページ を覗いてみてください。

以上です。