【Xamarin .iOS】【C#】自アプリの URL Scheme で起動して引数を受け取る


Xamarin 使いあるあるなのですが, ググっても Obj-C (Swift) の記事しか出てこなくて かなり 苦労したのでメモします. 自アプリの URL Scheme で起動して引数sを List で受け取るためのやり方です. 現在22:15に職場でこの記事を書いています. 早く帰りたい

自アプリの URL Scheme 追加

自分のURL追加:
info.plist
→ Advanced
→ URL Types
→ Add URL Type

スクリーンショット 2015-05-21 22.17.47

ここで追加した URL Schemes が, 仮に『myapp』だとすると,
Safari など web ブラウザで『myapp://』と入力して開くと自アプリが起動するはずです.
さらにそこに引数を追加すればアプリ側で制御が可能ですね.

それで, 『外部アプリから URL によって開かれた時にそれをフックして操作する』方法について:

外部アプリから URL によって開かれた時に

AppDelegate.cs 内にオーバーライドを書きます

public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
{
    try
    {
        Console.WriteLine(url); // myapp://myapp.jp/801 (例)
    }
    catch (NotImplementedException)
    {
    }
    return false;
}

この url という引数が, 開かれた時にそのURLを持っています.
これをパースしてゴニョゴニョすればよろしいかと

URL を Parse する

たとえば

myapp://myapp.jp/comment/view/801

というURLでアプリが起動された場合,

comment/view/801

が欲しいですよね.

これらの { comment, view, 801 } を List で抜く方法をメモします. (よく使うと思うので自分用メモ)

using System;
using System.Linq;
using System.Collections.Generic;

// --- (略)
// --- OpenUrl() 内 . 引数 url を使う----

// url: "myapp://myapp.jp/comment/view/801"

if (url != null)
{
    // Parse します
    var segments = url
        .Segments
        .Skip(1)
        .Select(s => s.TrimEnd('/'))
        .ToList();

    // Parseした結果を確認
    segments.ForEach(Console.WriteLine);
    // { comment, view, 801 }
}

スクリーンショット 2015-05-22 11.58.02
↑ 画像クリックでコードページに移動

余談

個人的に一番感動したのは

segments.ForEach(Console.WriteLine);

ですね! LinQ すげえ! ってなりました.

foreach (var segment in segments)
{
}

とはもう書けませんね


「【Xamarin .iOS】【C#】自アプリの URL Scheme で起動して引数を受け取る」への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。