Windows phone 8 Windows Phone深层链接未正确编码
假设我有一个Windows Phone应用程序,可以使用“我的应用:”名字。给定以下示例链接: 我的-app://do/stuff/?artist=Macklemore%20%26%20Ryan%20Lewis&test=1 我们可以看到两个查询字符串参数,Windows phone 8 Windows Phone深层链接未正确编码,windows-phone-8,windows-phone,deep-linking,Windows Phone 8,Windows Phone,Deep Linking,假设我有一个Windows Phone应用程序,可以使用“我的应用:”名字。给定以下示例链接: 我的-app://do/stuff/?artist=Macklemore%20%26%20Ryan%20Lewis&test=1 我们可以看到两个查询字符串参数,artist=“Macklemore&Ryan Lewis”和test=“1” 如果我创建了一个带有该链接的网页,并在手机的Internet Explorer中打开该网页,这就是应用程序UriMapper的功能: /协议?encodedLau
artist=“Macklemore&Ryan Lewis”
和test=“1”
如果我创建了一个带有该链接的网页,并在手机的Internet Explorer中打开该网页,这就是应用程序UriMapper的功能:
/协议?encodedLaunchUri=我的应用程序%3A%2F%2Fdo%2Fstuff%2F%3Fartist%3DMacklemore%20%26%20Ryan%20Lewis%26测试%3D1
因此,似乎没有一个%
编码值被重新编码,但它在测试
参数之前编码了&
在我看来,这似乎是一个平台错误,因为我们将无法区分我们在UriMapper上得到的&字符
因此,问题是,是否有人知道在windows phone深度链接中使用编码的符号(%26)的方法?我怀疑问题的级别可能太低,无法使用任何公共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('&', '|'))
));
values
数组现在包含两个元素(可以对其进行迭代并将其放入字典中以具有Key-Value
访问权限)
这需要使用包括字符的各种输入进行测试,但从快速测试来看,它似乎工作正常。的确,这很麻烦。也许你可以先用HTML编码你的
artist
参数(以便用&;
)然后用HTML解码你的Windows Phone应用程序中的URL。当然,我可以这样做,甚至可以用其他字符替换,但最后我只是绕过了Windows Phone处理深度链接的真正问题。。。最后,我要做的是获得一组深度链接的规则,并告诉用户在创建url之前使用HtmlEncode参数…:\是的,但我不知道你还能做什么。据我所知,您无法控制Windows Phone对URL的编码方式。只有两个部分可以操作:您提供的URL和您解码URL的方式。您已经正确地得出结论,无法将编码的符号与URL中已有的%26区分开来(除非您实现了一些智能模式检测逻辑,以检测&xxxx=
)。所以剩下的唯一办法就是改变深层链接。。。也许有一种不用UriMapper就能检索URL的方法?我将稍微浏览一下API,特别是像部署
或应用程序
这样的对象。下面是智能模式检测逻辑。做得很好:)谢谢:)需要进一步测试,但尝试了多个值,似乎工作正常。我们将尝试看看是什么导致了这个问题,希望在将来的更新中能够修复它。上面的一个改进是检测不是分隔符的&
,以便可以替换它,并且可以使用标准的QueryString
方法来尽可能地分割.Dug。在UriMapper中放置断点,调用quickwatch窗口,然后执行Microsoft.Phone.TaskModel.Interop.ApplicationHost.Current.Uri
。结果是一个已经编码的URL。再往前走,我们就进入了本机代码。@KooKiz-我感觉可能是这样的。我尝试使用HttpUtility
encode/decode方法和Uri
Escape string方法重新创建它提供的输出,但无法获得输出Pedro所看到的内容的组合。可能本机实现有一个bug,或者与导致此问题的托管实现一起使用。
//skip 2 because the first two matches include the protocol section
var values = final.Split(new char[] { '?', '|' }).Skip(2).ToArray();
artist=Macklemore & Ryan Lewis
test=1