Chomado's Blog
You Are Reading

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

0
C#

【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)
{
}

とはもう書けませんね


Madoka Chomado (ちょまど)

千代田まどかです。よく「ちょまど」と呼ばれます。Microsoft 社員。文系出身プログラマ兼マンガ家です。

(2) Comments

  1. […] ム( カスタムURL) を使って, 外部アプリから自アプリを起動させたときのハンドリングについてです. ネイティブの (Javaの) 作法とはちょっと違くて数時間ほどハマりました. (iOS版はこちら) […]

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

Xamarin.FormsのWebアプリでJavascriptからC#を呼び出す方法 | 蒼いねずみのお仕事 へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です