假设我有一个能够支持 handling deep links 的 Windows Phone 应用程序。带有“我的应用程序:”绰号。给定以下示例链接:
my-app://do/stuff/?artist=Macklemore%20%26%20Ryan%20Lewis&test=1
我们可以看到两个查询字符串参数,
artist = "Macklemore & Ryan Lewis"
和 test = "1"
.如果我创建一个带有该链接的网页并在手机中打开 Internet Explorer 中的页面,这就是应用程序 UriMapper 的内容:
/Protocol?encodedLaunchUri=my-app%3A%2F%2Fdo%2Fstuff%2F%3Fartist%3DMacklemore%20%26%20Ryan%20Lewis%26test%3D1
所以,似乎没有
%
编码值被重新编码,但它编码了 &
就在 test
之前范围…在我看来,这似乎是一个平台错误,因为我们无法区分在 UriMapper 上获得的 & 字符!
所以问题是,是否有人知道在 Windows Phone 深层链接中使用编码 & 符号 (%26) 的方法?
最佳答案
我怀疑这个问题的级别可能太低,无法使用任何公共(public) 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
数组现在包含两个元素(可以对其进行迭代并放入 Dictionary 以获得 Key-Value
访问权限)artist=Macklemore & Ryan Lewis
test=1
这必须使用包括字符的各种输入进行测试,但从快速测试来看,它似乎工作正常。
关于windows-phone-8 - Windows Phone 深层链接未正确编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17995226/