Windows Phone深层链接未正确编码

时间:2013-08-01 13:19:38

标签: windows-phone-8 windows-phone deep-linking

假设我有一个能够handling deep links和“my-app:”名字对象的Windows Phone应用程序。给出以下示例链接:

  

我的应用内://做/东西/艺术家=了Macklemore%20%26%20Ryan%20Lewis&安培;测试= 1

我们可以看到两个查询字符串参数artist = "Macklemore & Ryan Lewis"test = "1"

如果我在其上创建一个包含该链接的网页并在手机中的Internet Explorer中打开该页面,那么这就是应用程序UriMapper的内容:

  

/协议?encodedLaunchUri =我的应用内%3A%2F%2Fdo%2Fstuff%2F%3Fartist%3DMacklemore%20%26%20Ryan%20Lewis%26test%3D1

因此,似乎没有%个编码值重新编码,但它在&参数之前编码test ...

在我看来,这似乎是一个平台错误,因为我们无法区分&我们得到UriMapper的字符!

所以问题是,是否有人知道在Windows手机深层链接中使用编码&符号(%26)的方法?

1 个答案:

答案 0 :(得分: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();

values数组现在包含两个元素(可以迭代并放入字典中以Key-Value访问)

artist=Macklemore & Ryan Lewis
test=1

这必须使用包含字符的各种输入进行测试,但是通过快速测试,它似乎工作正常。