4

"my-app:" モニカでディープ リンクを処理できる Windows Phone アプリがあるとします。次のサンプル リンクがあるとします。

my-app://do/stuff/?artist=Macklemore%20%26%20Ryan%20Lewis&test=1

2 つのクエリ文字列パラメーターartist = "Macklemore & Ryan Lewis"test = "1".

そのリンクを含む Web ページを作成し、電話の Internet Explorer 内でそのページを開くと、アプリ UriMapper に次のように表示されます。

/Protocol?encodedLaunchUri=my-app%3A%2F%2Fdo%2Fstuff%2F%3Fartist%3DMacklemore%20%26%20Ryan%20Lewis%26test%3D1

したがって、エンコードされた%値はどれも再エンコードされていないように見えますが&、パラメーターの直前にエンコードされていtestます…</p>

UriMapper で取得した & 文字を区別できないため、これはプラットフォームのバグのように思えます!

問題は、Windows Phone のディープ リンクでエンコードされたアンパサンド (%26) を使用する方法を誰かが知っているかどうかです。

4

1 に答える 1

2

この問題は、パブリック API でアクセスするにはレベルが低すぎるのではないかと思います。

出発点として、私たちが自由に使えるもの (ユーザー側で変更する必要はありません) を考えました。それは、&兆候がどこにあるかを検出する機能です。&そこから、 が値またはクエリ文字列区切り文字の一部であるかどうかを判断できます。後者の場合は、ランダムな文字に置き換えて、その文字で分割します。

Regex rx = new Regex(@"(\b&.*?)=");

上記の正規表現&は、後に続く のみに一致します=(したがって、&test=以下には一致しますが、 には一致しませんMacklemore & Ryan Lewis)。

次に、上記の正規表現に一致する のすべてのインスタンスを&、他の場所では使用されないランダムな文字に置き換えます。この例では、 を使用し|ました。

string mapperInput = @"Protocol?encodedLaunchUri=my-app://do/stuff/?artist=Macklemore & Ryan Lewis&test=1";

string final = rx.Replace(mapperInput, 
                       new MatchEvaluator(
                       new Func<Match, string>(x =>  x.Value.Replace('&', '|'))
                       ));

次に、その結​​果をコレクションに入れます。

//skip 2 because the first two matches include the protocol section
var values = final.Split(new char[] { '?', '|' }).Skip(2).ToArray();

配列には 2 つのvalues要素が含まれるようになりました (反復して Dictionary に配置してKey-Valueアクセスできます) 。

artist=Macklemore & Ryan Lewis
test=1

これは、文字を含むさまざまな入力でテストする必要がありますが、簡単なテストでは問題なく動作するように見えました。

于 2013-08-01T14:36:41.277 に答える