以编程方式检查 Windows Store 应用更新

8

我实际上正在尝试找到一种检查Windows Store应用程序更新是否可用的方法。是否有使用API进行此操作的方法?谢谢! Essam


也想了解这个。 - Jacob Morrison
三年后,现在有更好的解决方案吗? - nhouser9
2个回答

5

Windows商店没有专门用于检查更新的API。但是有一个相当简单的解决方法。

  var package = Windows.ApplicationModel.Package.Current;
        PackageVersion t = package.Id.Version;

这将获取用户正在运行的软件包版本。您可以使用此选项检查其中一个服务器上的当前版本。如果您尚未为应用程序设置 fancy 服务,则无需设置 fancy 服务,您可以在 Web 服务器上使用简单的文本文件。比如说“myappversion.txt”。通过 Web 请求下载该文件即可。
例如:
        WebRequest req = WebRequest.Create(new Uri(@"http://myurl.com/MyAppversion.txt"));

        var result = await req.GetResponseAsync();

我知道这并不是理想的解决办法。另外需要考虑到Windows 8.1应该会默默地更新应用程序,所以这可能并不需要,尽管还有待观察是否在应用程序启动前进行更新。

如果需要更多帮助,请告诉我。


3
这篇文章中提到了一个未经记录的访问Windows Store数据的方法:

http://jasonthomascarter.blogspot.com/2013/08/the-friendly-developers-guide-to.html

今天,我收到了一位其他开发者在我的Windows Store应用程序App Roulette的支持电子邮件上的询问。这非常令人耳目一新,我非常乐意与其他开发者分享信息。我更加期待看到他们将创造出什么,而不是担心竞争的潜力。所以我来和大家分享一下。无论如何,这位开发者想知道如何获取这个应用程序的信息,我将解释我如何访问它以及你也可以如何访问。

首先,自我推广一下,除了App Roulette之外,我还在几个其他应用程序中使用这些信息。Developer Dashboard是一个一站式商店,可以查看所有国家/地区的评论以及简单翻译每个评论,Windows Store Developers是一个包含Windows Store中所有开发者(超过10000)和他们的应用程序的目录,Most Active Reviewers是一个最活跃的应用程序评论者和他们的评论的目录,并且在我自己的作品集应用程序Software Developer中,列出了我在Windows Store发布的所有其他应用程序,请试用其中的一些。

我们开始吧!首先,我们将从Windows Store网站的Robots.txt文件开始。

http://apps.microsoft.com/robots.txt

网站使用robots.txt文件来指导网络爬虫如何行动,告诉它们想要让它们看到什么,不想让它们看到什么。

http://www.robotstxt.org/

网络机器人(也称为网络漫游者、爬虫或蜘蛛)是自动遍历网络的程序。搜索引擎如Google使用它们来索引网络内容,垃圾邮件发送者使用它们来扫描电子邮件地址,它们还有许多其他用途。
在这种情况下,我们感兴趣的是Sitemaps.xml索引文件。 http://apps.microsoft.com/windows/sitemap_index.xml

http://www.sitemaps.org/

站点地图是网站管理员向搜索引擎通报其网站上可供爬行的页面的简单方法。在其最简单的形式中,站点地图是一个XML文件,其中列出了一个站点的URL以及每个URL的其他元数据(例如,它上次更新的时间、通常更改的频率以及相对于站点中其他URL的重要性),以便搜索引擎可以更智能地爬行该站点。
站点地图索引文件列出了每个单独的站点地图XML文件。截至本文撰写时,apps.microsoft.com网站有141个单独的站点地图XML文件。
在各个文件中包含着数千个Windows Store应用程序的网页URL,例如PlayTo Receiver应用程序的URL:http://apps.microsoft.com/windows/en-us/app/playto-receiver/72a6ba17-2d4e-4a1c-bcfb-cdc5d4b32d0e
这些应用程序的网页确实包含了我们可以从HTML中抓取的大量信息,但我们可以做得更好...我们获取的关键信息是应用程序ID及其在商店发布的地理位置。例如:72a6ba17-2d4e-4a1c-bcfb-cdc5d4b32d0een-us等...

现在进入重点,我们可以使用新发现的应用程序ID和地理信息调用一些Web服务。

https://services.apps.microsoft.com/browse/6.2.9200-1/615/en-US_en-US/c/US/cp/10005001/Apps/72a6ba17-2d4e-4a1c-bcfb-cdc5d4b32d0e

这个网络服务提供了大量信息,但元素名称并没有清晰地说明。以下是我对其中许多(而不是全部)元素的解释,以帮助您开始使用。
sSubCategoryName = rawXML.getElementsByTagName('Sc')[0].getElementsByTagName('N')[0].childNodes[0].nodeValue;
sSubCategoryId = rawXML.getElementsByTagName('Sc')[0].getElementsByTagName('I')[0].childNodes[0].nodeValue;
sHasTrial = rawXML.getElementsByTagName('Try')[0].childNodes[0].nodeValue;
sDescription = rawXML.getElementsByTagName('D')[0].childNodes[0].nodeValue;
sDeveloper = rawXML.getElementsByTagName('Dev')[0].childNodes[0].nodeValue;
sWebsite = rawXML.getElementsByTagName('Ws')[0].childNodes[0].nodeValue;
sSupport = rawXML.getElementsByTagName('Sws')[0].childNodes[0].nodeValue;
sPrivacy = rawXML.getElementsByTagName('Pu')[0].childNodes[0].nodeValue;
sCategoryName = rawXML.getElementsByTagName('C')[0].getElementsByTagName('N')[0].childNodes[0].nodeValue;
sCategoryId = rawXML.getElementsByTagName('C')[0].getElementsByTagName('I')[0].childNodes[0].nodeValue;
sPrice = rawXML.getElementsByTagName('P')[0].childNodes[0].nodeValue;
sForegroundColor = rawXML.getElementsByTagName('Fg')[0].childNodes[0].nodeValue;
sBackgroundColor = rawXML.getElementsByTagName('Bg')[0].childNodes[0].nodeValue;
sAppIcon = rawXML.getElementsByTagName('Ico')[0].childNodes[0].nodeValue;
sAppName = rawXML.getElementsByTagName('T')[0].childNodes[0].nodeValue;
sPackageFamilyName = rawXML.getElementsByTagName('Pfn')[0].childNodes[0].nodeValue;
sResourceId = rawXML.getElementsByTagName('R')[0].childNodes[0].nodeValue;
sId = rawXML.getElementsByTagName('I')[0].childNodes[0].nodeValue;
sCapabilities = sCapabilities + arrCapabilities[k].childNodes[0].nodeValue+",";
sUpdate = rawXML.getElementsByTagName('Ud')[0].childNodes[0].nodeValue;
sFeatures1 = rawXML.getElementsByTagName('Dbp')[0].childNodes[0].nodeValue;
sFeatures2 = rawXML.getElementsByTagName('Dbp')[1].childNodes[0].nodeValue;
sFeatures3 = rawXML.getElementsByTagName('Dbp')[2].childNodes[0].nodeValue;
sFeatures4 = rawXML.getElementsByTagName('Dbp')[3].childNodes[0].nodeValue;
sFeatures5 = rawXML.getElementsByTagName('Dbp')[4].childNodes[0].nodeValue;
sFeatures6 = rawXML.getElementsByTagName('Dbp')[5].childNodes[0].nodeValue;
sFeatures7 = rawXML.getElementsByTagName('Dbp')[6].childNodes[0].nodeValue;
sFeatures8 = rawXML.getElementsByTagName('Dbp')[7].childNodes[0].nodeValue;
sFeatures9 = rawXML.getElementsByTagName('Dbp')[8].childNodes[0].nodeValue;
sScreenshot1 = rawXML.getElementsByTagName('Ss')[0].getElementsByTagName('U')[0].childNodes[0].nodeValue
sScreenshot2 = rawXML.getElementsByTagName('Ss')[1].getElementsByTagName('U')[0].childNodes[0].nodeValue
sScreenshot3 = rawXML.getElementsByTagName('Ss')[2].getElementsByTagName('U')[0].childNodes[0].nodeValue
sScreenshot4 = rawXML.getElementsByTagName('Ss')[3].getElementsByTagName('U')[0].childNodes[0].nodeValue
sScreenshot5 = rawXML.getElementsByTagName('Ss')[4].getElementsByTagName('U')[0].childNodes[0].nodeValue
sScreenshot6 = rawXML.getElementsByTagName('Ss')[5].getElementsByTagName('U')[0].childNodes[0].nodeValue
sScreenshot7 = rawXML.getElementsByTagName('Ss')[6].getElementsByTagName('U')[0].childNodes[0].nodeValue
sScreenshot8 = rawXML.getElementsByTagName('Ss')[7].getElementsByTagName('U')[0].childNodes[0].nodeValue
sScreenshot9 = rawXML.getElementsByTagName('Ss')[8].getElementsByTagName('U')[0].childNodes[0].nodeValue
sCaption1 = rawXML.getElementsByTagName('Ss')[0].getElementsByTagName('Cap')[0].childNodes[0].nodeValue
sCaption2 = rawXML.getElementsByTagName('Ss')[1].getElementsByTagName('Cap')[0].childNodes[0].nodeValue
sCaption3 = rawXML.getElementsByTagName('Ss')[2].getElementsByTagName('Cap')[0].childNodes[0].nodeValue
sCaption4 = rawXML.getElementsByTagName('Ss')[3].getElementsByTagName('Cap')[0].childNodes[0].nodeValue
sCaption5 = rawXML.getElementsByTagName('Ss')[4].getElementsByTagName('Cap')[0].childNodes[0].nodeValue
sCaption6 = rawXML.getElementsByTagName('Ss')[5].getElementsByTagName('Cap')[0].childNodes[0].nodeValue
sCaption7 = rawXML.getElementsByTagName('Ss')[6].getElementsByTagName('Cap')[0].childNodes[0].nodeValue
sCaption8 = rawXML.getElementsByTagName('Ss')[7].getElementsByTagName('Cap')[0].childNodes[0].nodeValue

Windows Store不仅提供应用程序,还有很多评论。目前,在Windows Store中有超过210,000条应用程序评论。这些评论来自世界各地,因此您需要一些国家代码、手动输入的App Id以及注意末尾的pn/1,您会发现该服务每页只返回10条评论,只需将此值递增为pn/2、pn/3等,直到您没有评论为止。
var arrCounntryCodes = ["AE", "AR", "AT", "AU", "BE", "BG", "BH", "CA", "CH", "CL", "CN", "CO", "CR", "CY", "CZ", "DE", "DK", "DZ", "EE", "EG", "ES", "FI", "FR", "GB", "GR", "HK", "HR", "HU", "ID", "IE", "IL", "IN", "IQ", "IT", "JO", "JP", "KW", "KZ", "LB", "LK", "LT", "LU", "LV", "LY", "MA", "MT", "MX", "MY", "NL", "NO", "NZ", "OM", "PE", "PH", "PK", "PL", "QA", "RO", "RS", "RU", "SA", "SE", "SG", "SI", "SK", "TH", "TN", "TR", "TT", "UA", "US", "UY", "VE", "VN"];

https://services.apps.microsoft.com/4R/6.2.9200-1/1/en-US/m/US/Apps/f514d64b-8705-43b7-a400-c4f4f3dedfc0/Reviews/all/s/date/1/pn/1

这段话讲述了如何从Windows Store中获取大量信息。第一段提到了元素名称、全名、显示名称和用户选择的图像等信息,不需要进一步解释。第二段介绍了一些搜索操作,其中包含了应用程序ID。第三段总结了如何利用这些信息进行开发和分享,并鼓励读者在评论中提供反馈或额外的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接