Xamarin 使いあるあるなのですが, ググっても Obj-C (Swift) の記事しか出てこなくて かなり 苦労したのでメモします. 自アプリの URL Scheme で起動して引数sを List で受け取るためのやり方です. 現在22:15に職場でこの記事を書いています. 早く帰りたい
自アプリの URL Scheme 追加
自分のURL追加:
info.plist
→ Advanced
→ URL Types
→ Add URL Type
ここで追加した 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 } }
余談
個人的に一番感動したのは
segments.ForEach(Console.WriteLine);
ですね! LinQ すげえ! ってなりました.
foreach (var segment in segments)
{
}
とはもう書けませんね
[…] ム( カスタムURL) を使って, 外部アプリから自アプリを起動させたときのハンドリングについてです. ネイティブの (Javaの) 作法とはちょっと違くて数時間ほどハマりました. (iOS版はこちら) […]
[…] 【Xamarin .iOS】【C#】自アプリの URL Scheme で起動して引数を受け取る […]