<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Many Niches &#187; marketplace</title>
	<atom:link href="http://www.manyniches.com/tag/marketplace/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.manyniches.com</link>
	<description>Jack of All Trades, Master of Some</description>
	<lastBuildDate>Mon, 14 Nov 2011 21:12:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Crawling the Windows Phone Marketplace</title>
		<link>http://www.manyniches.com/windows-phone/crawling-the-windows-phone-marketplace/</link>
		<comments>http://www.manyniches.com/windows-phone/crawling-the-windows-phone-marketplace/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 19:21:28 +0000</pubDate>
		<dc:creator>Brandon Watson</dc:creator>
				<category><![CDATA[Windows Phone]]></category>
		<category><![CDATA[crawl]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[marketplace]]></category>
		<category><![CDATA[wp7dev]]></category>

		<guid isPermaLink="false">http://www.manyniches.com/windows-phone/crawling-the-windows-phone-marketplace/</guid>
		<description><![CDATA[I have been asked by a few people how sites like WP7AppList get their data.&#160; The Windows Phone Marketplace, which you access on your PC via Zune software, uses XML to get data over the wire.&#160; I wanted to share a couple of code snippets which might help an erstwhile data junkie on their way.&#160; [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 5px; margin-right: 5px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.manyniches.com%2Fwindows-phone%2Fcrawling-the-windows-phone-marketplace%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.manyniches.com%2Fwindows-phone%2Fcrawling-the-windows-phone-marketplace%2F&amp;source=BrandonWatson&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>I have been asked by a few people how sites like <a href="http://www.wp7applist.com">WP7AppList</a> get their data.&#160; The Windows Phone Marketplace, which you access on your PC via Zune software, uses XML to get data over the wire.&#160; I wanted to share a couple of code snippets which might help an erstwhile data junkie on their way.&#160; This code works.&#160; It may not be the most elegant solution, but it works, and I wanted to share it with others in case they wanted to see how to parse the XML, or how to write LINQ queries against it.</p>
<p>Caveat – this is a geek enthusiast post.&#160; I used <a href="http://www.fiddler2.com/fiddler2/">Fiddler</a> to figure out how to parse the XML.&#160; This was something I did over Christmas break to give me a project about which I could be excited, and learn some more about parsing XML with LINQ.&#160; I also wanted to do some large database stuff, and this crawler throws off a ton of data.&#160; I did not use an proprietary knowledge about how our backend systems are working.&#160; This is all done against the public XML feeds.</p>
<p>First up, we are going to need to create some data structures to catch all of the inbound data.&#160; You can use anonymous types with LINQ, but I liked having a measure of control, and having the ability to handle null values and potential errors in the feed.</p>
<p><span id="more-494"></span>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> ZestAppData
{
    <span class="kwrd">public</span> <span class="kwrd">string</span> Title { get; set; }
    <span class="kwrd">public</span> <span class="kwrd">string</span> Id { get; set; }
    <span class="kwrd">public</span> DateTime ReleaseDate { get; set; }
    <span class="kwrd">public</span> DateTime Updated { get; set; }
    <span class="kwrd">public</span> <span class="kwrd">string</span> Version { get; set; }
    <span class="kwrd">public</span> <span class="kwrd">string</span> ShortDescription { get; set; }
    <span class="kwrd">public</span> <span class="kwrd">decimal</span> AverageUserRating { get; set; }
    <span class="kwrd">public</span> <span class="kwrd">int</span> UserRatingCount { get; set; }
    <span class="kwrd">public</span> <span class="kwrd">string</span> ImageId { get; set; }

    <span class="kwrd">public</span> IList&lt;ZestCategory&gt; Categories = <span class="kwrd">new</span> List&lt;ZestCategory&gt;();
    <span class="kwrd">public</span> IList&lt;ZestPublisher&gt; Publisher = <span class="kwrd">new</span> List&lt;ZestPublisher&gt;();
    <span class="kwrd">public</span> IList&lt;ZestOffer&gt; Offers = <span class="kwrd">new</span> List&lt;ZestOffer&gt;();
}

<span class="kwrd">public</span> <span class="kwrd">class</span> ZestCategory
{
    <span class="kwrd">public</span> <span class="kwrd">string</span> Id { get; set; }
    <span class="kwrd">public</span> <span class="kwrd">string</span> IsRoot { get; set; }
    <span class="kwrd">public</span> <span class="kwrd">string</span> Title { get; set; }
}

<span class="kwrd">public</span> <span class="kwrd">class</span> ZestOffer
{
    <span class="kwrd">public</span> <span class="kwrd">string</span> OfferId { get; set; }
    <span class="kwrd">public</span> <span class="kwrd">string</span> MediaInstanceId { get; set; }
    <span class="kwrd">public</span> <span class="kwrd">decimal</span> Price { get; set; }
    <span class="kwrd">public</span> <span class="kwrd">string</span> PriceCurrencyCode { get; set; }
    <span class="kwrd">public</span> <span class="kwrd">string</span> LicenseRight { get; set; }
    <span class="kwrd">public</span> List&lt;<span class="kwrd">string</span>&gt; PaymentType = <span class="kwrd">new</span> List&lt;<span class="kwrd">string</span>&gt;();
}

<span class="kwrd">public</span> <span class="kwrd">class</span> ZestPublisher
{
    <span class="kwrd">public</span> <span class="kwrd">string</span> Id { get; set; }
    <span class="kwrd">public</span> <span class="kwrd">string</span> Name { get; set; }
}</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
    font-size: small;
    color: black;
    font-family: consolas, "Courier New", courier, monospace;
    background-color: #ffffff;
    /*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
    background-color: #f4f4f4;
    width: 100%;
    margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>&#160;</p>
<p>You are also going to want to have a bunch of variables defined for the URLs where the XML is coming from, the XML namespaces, etc:</p>
<pre class="csharpcode"><span class="kwrd">const</span> <span class="kwrd">string</span> BaseAppsUrl = <span class="str">&quot;http://catalog.zune.net&quot;</span>;
<span class="kwrd">const</span> <span class="kwrd">string</span> BaseImageUrl = <span class="str">&quot;http://image.catalog.zune.net&quot;</span>;

<span class="kwrd">const</span> <span class="kwrd">string</span> ZestVersion = <span class="str">&quot;/v3.2/&quot;</span>;
<span class="kwrd">const</span> <span class="kwrd">string</span> ZestImageVersion = <span class="str">&quot;/v3.0/&quot;</span>;

<span class="kwrd">const</span> <span class="kwrd">string</span> BaseApps = <span class="str">&quot;apps/&quot;</span>;
<span class="kwrd">const</span> <span class="kwrd">string</span> BaseImage = <span class="str">&quot;image/&quot;</span>;

<span class="kwrd">const</span> <span class="kwrd">string</span> BaseAppsResource = <span class="str">&quot;?clientType=WinMobile%207.0&amp;store=Zest&amp;orderby=downloadRank&quot;</span>;
<span class="kwrd">const</span> <span class="kwrd">string</span> BaseCommentsResource = <span class="str">&quot;/reviews/?store=Zest&amp;chunkSize=10&quot;</span>;
<span class="kwrd">const</span> <span class="kwrd">string</span> BaseImageResource = <span class="str">&quot;?width=240&amp;height=240&quot;</span>;

ZestCrawlEntities ZestCrawlContext;

XNamespace ns = <span class="str">&quot;http://www.w3.org/2005/Atom&quot;</span>;
XNamespace zestns = <span class="str">&quot;http://schemas.zune.net/catalog/apps/2008/02&quot;</span>;

<span class="kwrd">public</span> <span class="kwrd">string</span> LangCode = <span class="str">&quot;en-us&quot;</span>; <span class="rem">//setting the default value</span>

<span class="kwrd">public</span> List&lt;<span class="kwrd">string</span>&gt; ValidLangCodes = <span class="kwrd">new</span> List&lt;<span class="kwrd">string</span>&gt;(
    <span class="kwrd">new</span> <span class="kwrd">string</span>[] {  <span class="str">&quot;en-us&quot;</span>, <span class="str">&quot;en-gb&quot;</span>, <span class="str">&quot;de-de&quot;</span>,
                    <span class="str">&quot;fr-fr&quot;</span>, <span class="str">&quot;es-es&quot;</span>, <span class="str">&quot;it-it&quot;</span>,
                    <span class="str">&quot;en-au&quot;</span>, <span class="str">&quot;de-at&quot;</span>, <span class="str">&quot;fr-be&quot;</span>,
                    <span class="str">&quot;fr-ca&quot;</span>, <span class="str">&quot;en-ca&quot;</span>, <span class="str">&quot;en-hk&quot;</span>,
                    <span class="str">&quot;en-in&quot;</span>, <span class="str">&quot;en-ie&quot;</span>, <span class="str">&quot;es-mx&quot;</span>,
                    <span class="str">&quot;en-nz&quot;</span>, <span class="str">&quot;en-sg&quot;</span>, <span class="str">&quot;de-ch&quot;</span>,
                    <span class="str">&quot;fr-ch&quot;</span> });

<span class="kwrd">public</span> <span class="kwrd">string</span> AppAfterMarkerUrl { get; set; }
<span class="kwrd">public</span> <span class="kwrd">bool</span> HasMoreApps = <span class="kwrd">true</span>;
<span class="kwrd">public</span> <span class="kwrd">string</span> AppsResponseString { get; set; }
<span class="kwrd">public</span> XElement ReturnedAppsXml;</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
    font-size: small;
    color: black;
    font-family: consolas, "Courier New", courier, monospace;
    background-color: #ffffff;
    /*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
    background-color: #f4f4f4;
    width: 100%;
    margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>&#160;</p>
<p>Have a look at the ValidLangCodes list.&#160; that’s the coding we have on the URLs for country specific data.&#160; So if you want to get the data from Mexico, us “es-mx.”&#160; The first two letters are the language code, and the second two are the country code.&#160; If an app is listed in the feed, it is active.&#160; The list returned is ordered, meaning the first app is ranked #1.&#160; I am pulling the ALL APPs list, which is the orderby clause on the BaseAppsResource.</p>
<p>The ZextCrawlContext is the ADO.NET DB model.&#160; Create your own and stuff the data however you want.</p>
<p>Now that we have the code segments, you are going to need a way to get the XML from MSFT servers.</p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">void</span> GetAppsResponse()
{
    <span class="kwrd">string</span> FullUrl;
    <span class="kwrd">bool</span> done = <span class="kwrd">false</span>;

    <span class="kwrd">if</span> (!String.IsNullOrEmpty(AppAfterMarkerUrl))
    {
        FullUrl = AppAfterMarkerUrl;
    }
    <span class="kwrd">else</span>
    {
        FullUrl = BaseAppsUrl + ZestVersion + LangCode + <span class="str">&quot;/&quot;</span>
            + BaseApps + BaseAppsResource;
    }

    <span class="kwrd">while</span> (!done)
    {
        <span class="kwrd">try</span>
        {
            var request = WebRequest.Create(FullUrl) <span class="kwrd">as</span> HttpWebRequest;
            request.KeepAlive = <span class="kwrd">false</span>;

            var response = request.GetResponse() <span class="kwrd">as</span> HttpWebResponse;

            <span class="kwrd">if</span> (request.HaveResponse == <span class="kwrd">true</span> &amp;&amp; response != <span class="kwrd">null</span>)
            {
                var reader = <span class="kwrd">new</span> StreamReader(response.GetResponseStream());
                ReturnedAppsXml = XElement.Parse(reader.ReadToEnd());
                done = <span class="kwrd">true</span>;
            }
        }
        <span class="kwrd">catch</span>
        {
            Console.WriteLine(<span class="str">&quot;yeah, your connection was likely aborted&quot;</span>);
            done = <span class="kwrd">false</span>;
        }
    }
}</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
    font-size: small;
    color: black;
    font-family: consolas, "Courier New", courier, monospace;
    background-color: #ffffff;
    /*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
    background-color: #f4f4f4;
    width: 100%;
    margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>&#160;</p>
<p>Now comes the fun part.&#160; Remember, the XML is coming over the wire, and it comes 100 elements at a time.&#160; So you have to parse the stream, stuff them somewhere and get the next stream.&#160; Included in the XML returned is the token for how you request the next bit of XML. (note, yes I know I am using RegEx where I could be using String.Replace; also sorry about the wonky formatting, but my blog has width issues)</p>
<pre class="csharpcode"><span class="kwrd">public</span> IEnumerable&lt;ZestAppData&gt; GetAppEntries()
{
    <span class="rem">//first we have to parse the feed which came back</span>
    IEnumerable&lt;ZestAppData&gt; entries =
        from e <span class="kwrd">in</span> ReturnedAppsXml.Elements(ns + <span class="str">&quot;entry&quot;</span>)
        select <span class="kwrd">new</span> ZestAppData
        {

            Title = e.Element(ns + <span class="str">&quot;title&quot;</span>).Value,

            Id = Regex.Replace(e.Element(ns + <span class="str">&quot;id&quot;</span>).Value, <span class="str">&quot;(urn:uuid:)(.)&quot;</span>, <span class="str">&quot;$2&quot;</span>),

            ReleaseDate = DateTime.Parse(e.Element(zestns + <span class="str">&quot;releaseDate&quot;</span>).Value),

            Updated = DateTime.Parse(e.Element(ns + <span class="str">&quot;updated&quot;</span>).Value),

            ShortDescription = e.Element(zestns + <span class="str">&quot;shortDescription&quot;</span>) == <span class="kwrd">null</span>
                ? <span class="str">&quot;&quot;</span> : e.Element(zestns + <span class="str">&quot;shortDescription&quot;</span>).Value,

            AverageUserRating = <span class="kwrd">decimal</span>.Parse(e.Element(zestns + <span class="str">&quot;averageUserRating&quot;</span>).Value),

            UserRatingCount = <span class="kwrd">int</span>.Parse(e.Element(zestns + <span class="str">&quot;userRatingCount&quot;</span>).Value),

            Version = e.Element(zestns + <span class="str">&quot;version&quot;</span>).Value,

            ImageId = Regex.Replace(e.Element(zestns + <span class="str">&quot;image&quot;</span>).Element(zestns + <span class="str">&quot;id&quot;</span>).Value, <span class="str">&quot;(urn:uuid:)(.)&quot;</span>, <span class="str">&quot;$2&quot;</span>),

            Categories = (
                from category <span class="kwrd">in</span> e.Elements(zestns + <span class="str">&quot;categories&quot;</span>).Elements(zestns + <span class="str">&quot;category&quot;</span>)
                select <span class="kwrd">new</span> ZestCategory
                {
                    Id = category.Element(zestns + <span class="str">&quot;id&quot;</span>).Value,
                    Title = category.Element(zestns + <span class="str">&quot;title&quot;</span>).Value,
                    IsRoot = category.Element(zestns + <span class="str">&quot;isRoot&quot;</span>).Value
                }).ToList(),

            Publisher = (
                from publisher <span class="kwrd">in</span> e.Elements(zestns + <span class="str">&quot;publisher&quot;</span>)
                select <span class="kwrd">new</span> ZestPublisher
                {
                    Id = publisher.Element(zestns + <span class="str">&quot;id&quot;</span>).Value,
                    Name = publisher.Element(zestns + <span class="str">&quot;name&quot;</span>).Value
                }).ToList(),

            Offers = (
                from offer <span class="kwrd">in</span> e.Elements(zestns + <span class="str">&quot;offers&quot;</span>).Elements(zestns + <span class="str">&quot;offer&quot;</span>)
                select <span class="kwrd">new</span> ZestOffer
                {
                    OfferId = offer.Element(zestns + <span class="str">&quot;offerId&quot;</span>).Value,
                    MediaInstanceId = offer.Element(zestns + <span class="str">&quot;mediaInstanceId&quot;</span>).Value,
                    Price = <span class="kwrd">decimal</span>.Parse(offer.Element(zestns + <span class="str">&quot;price&quot;</span>).Value),
                    PriceCurrencyCode = offer.Element(zestns + <span class="str">&quot;priceCurrencyCode&quot;</span>).Value,
                    LicenseRight = offer.Element(zestns + <span class="str">&quot;licenseRight&quot;</span>).Value,
                    PaymentType = (
                        from paymenttype <span class="kwrd">in</span> offer.Elements(zestns + <span class="str">&quot;paymentTypes&quot;</span>).Elements()
                        select paymenttype.Value).ToList()
                }).ToList()
        };

    <span class="rem">//now I need to get the AfterMarkerUrl from the XML feed</span>
    var afterMarker =
        from e <span class="kwrd">in</span> ReturnedAppsXml.Elements(ns + <span class="str">&quot;link&quot;</span>)
        <span class="kwrd">where</span> e.Attribute(<span class="str">&quot;rel&quot;</span>).Value == <span class="str">&quot;next&quot;</span>
        select (<span class="kwrd">string</span>)e.Attribute(<span class="str">&quot;href&quot;</span>).Value;

    <span class="kwrd">if</span> (afterMarker.Count() &gt; 0)
    {
        AppAfterMarkerUrl = BaseAppsUrl + afterMarker.Single();
    }
    <span class="kwrd">else</span>
    {
        HasMoreApps = <span class="kwrd">false</span>;
    }

    <span class="kwrd">return</span> entries;
}</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
    font-size: small;
    color: black;
    font-family: consolas, "Courier New", courier, monospace;
    background-color: #ffffff;
    /*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
    background-color: #f4f4f4;
    width: 100%;
    margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>Now you have all the data you need to crawl the marketplace whenever you want.&#160; The LINQ stuff is really, really fast.&#160; Crawling the marketplaces can be a bit slow.&#160; I crawl each one individually when my code runs, and I store app lists for each of the markets.</p>
<p>One of the mistakes I made was having ZestAppData.Udpated be a DateTime and not a Date.&#160; I only crawl once per day, so I don’t need all the extra data.&#160; The Zest feeds update daily, I think every couple of hours.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.manyniches.com/windows-phone/crawling-the-windows-phone-marketplace/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Marketplace Value Add For Devs and Customers</title>
		<link>http://www.manyniches.com/windows-phone/marketplace-value-add-for-devs-and-customers/</link>
		<comments>http://www.manyniches.com/windows-phone/marketplace-value-add-for-devs-and-customers/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 15:22:00 +0000</pubDate>
		<dc:creator>Brandon Watson</dc:creator>
				<category><![CDATA[Windows Phone]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[apps]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[marketplace]]></category>
		<category><![CDATA[windows phone 7]]></category>
		<category><![CDATA[wp7dev]]></category>

		<guid isPermaLink="false">http://www.manyniches.com/windows-phone/marketplace-value-add-for-devs-and-customers/</guid>
		<description><![CDATA[There was a story which surfaced yesterday about vulnerabilities exposed in a wide swath of Android apps.&#160; SMobile Systems conducted research in the Android app space and found that some 20% of the apps allow third-party apps to gain access to sensitive or private information. It would be easy to dismiss this article by pointing [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 5px; margin-right: 5px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.manyniches.com%2Fwindows-phone%2Fmarketplace-value-add-for-devs-and-customers%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.manyniches.com%2Fwindows-phone%2Fmarketplace-value-add-for-devs-and-customers%2F&amp;source=BrandonWatson&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<div class="wlWriterHeaderFooter" style="float:none; margin:0px; padding:4px 0px 4px 0px;"><iframe src="http://www.facebook.com/widgets/like.php?href=http://www.manyniches.com/windows-phone/marketplace-value-add-for-devs-and-customers/" scrolling="no" frameborder="0" style="border:none; width:450px; height:80px"></iframe></div>
<p>There was a story which surfaced yesterday about <a href="http://news.cnet.com/8301-27080_3-20008518-245.html?amp">vulnerabilities exposed in a wide swath of Android apps</a>.&#160; SMobile Systems conducted research in the Android app space and found that some 20% of the apps allow third-party apps to gain access to sensitive or private information.</p>
<p>It would be easy to dismiss this article by pointing out that by simply downloading an app, a customer is making a explicit allowance to an app to access data on the phone.&#160; What I found troubling about the findings wasn’t necessarily the point about access to the data, but rather that, 5% of the apps surveyed could make calls and 2% could send premium SMS messages.&#160; Talk about a surprise cell phone bill.</p>
<p>The key word in the above statements, however, is “could.&#8217;”&#160; Yes, customers make the decision to download those apps, but they have no way of knowing with certainty what those apps are doing behind the scenes.&#160; UPDATE: Ben points out below that the customer us warned of all the APIs used, which is true, but they aren’t told *how* they are used.</p>
<p>Further, because of the multi-tasking architecture of Android, the apps have the potential to be doing a bunch of bad things in the background when the phone is not in use.</p>
<p>Google has been quick to point out that the architecture of Android would limit what actual damage one of these apps could do, but that’s really not the point.&#160; What is being lost in this discussion is that there is no curation of the Android marketplace.&#160; For all the grumbling and grousing about the Apple AppStore, their review process would likely catch these abuses.&#160; There is no such level of certification for the Android marketplace.&#160; Customers don’t want to think about needing anti-spyware software for their phone, as the article implies is one solution for Android.</p>
<p>The Windows Phone Marketplace certainly believes in the curation model, and we have placed user security as a top priority.&#160; This is one of the main reasons that we have our app certification process, and why (UDPATE: “at least in version 1”) apps are run in sandboxes, with no access to any data other than its own isolated storage, or the ability to communicate with other apps.&#160; UPDATE: The goal is to ensure that absolute best customer experience when using their phone.</p>
<p>UDPATE 6/25/10</p>
<p>I’m not one who believes in conspiracy theories or anything, but I do find the timing of this <a href="http://news.cnet.com/8301-27080_3-20008922-245.html?tag=newsEditorsPicksArea.0">announcement from Google that they can remotely wipe apps from phones</a> a bit curious.&#160; I have to go do some digging, but I’d be interested to know if the Android developer agreement has specificity about what would constitute grounds for a remote wipe.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.manyniches.com/windows-phone/marketplace-value-add-for-devs-and-customers/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

