现实世界的 JavaScript Windows8 应用开发教程(五)
九、应用货币化:内幕
Abstract
说到底,大多数开发人员并不仅仅是为了创造性的表达。在大多数情况下,你希望从你所做的工作中获得一些经济上的收益——即使它仅够支付构建一个应用的费用。可以肯定的是,构建和维护现代应用会很快变得非常昂贵。首先,由于 Windows 8 应用的沙盒特性,许多功能——特别是那些针对传统桌面构建的应用——在 Windows 8 应用世界中不可用。Windows 8 应用当然是沙盒化的,这是有原因的——为了最大限度地减少行为不端的应用对设备造成的损害——但这些理所当然的限制的副作用是应用通常需要包含云组件。应用的这个驻留在云上的部分就像一个传统的应用一样,可以完全访问云服务器的环境。托管这样一个解决方案可以迅速将你的固定成本应用(用于构建应用的血汗资产与一次性价格相关联)转变为一个循环成本应用。
说到底,大多数开发人员并不仅仅是为了创造性的表达。在大多数情况下,你希望从你所做的工作中获得一些经济上的收益——即使它仅够支付构建一个应用的费用。可以肯定的是,构建和维护现代应用会很快变得非常昂贵。首先,由于 Windows 8 应用的沙盒特性,许多功能——特别是那些针对传统桌面构建的应用——在 Windows 8 应用世界中不可用。Windows 8 应用当然是沙盒化的,这是有原因的——为了最大限度地减少行为不端的应用对设备造成的损害——但这些理所当然的限制的副作用是应用通常需要包含云组件。应用的这个驻留在云上的部分就像一个传统的应用一样,可以完全访问云服务器的环境。托管这样一个解决方案可以迅速将你的固定成本应用(用于构建应用的血汗资产与一次性价格相关联)转变为一个循环成本应用。
市场加剧了这个问题。应用的消费者通常习惯于应用更新的便捷性和频繁性。这意味着对正在进行的开发的潜在期望扩展到市场上的任何应用,无论它是由像脸书这样的十亿美元的组织还是由你创建的。当你将一个应用发布到市场上时,你还必须考虑支持它所需的时间成本。
出于这些以及更多的原因,像 Windows Store、Windows Phone Store 和 Google Play 这样的数字市场都可以让你通过直接销售将应用货币化,市场就像商家一样。使用这种市场模式,潜在的 Windows 8 用户可以从 Windows 商店发现和购买应用。利润的一部分归开发目标应用的开发者,其余部分归微软,以帮助抵消维护 Windows 商店的成本。图 9-1 显示了 Windows Store 的登陆屏幕。
图 9-1。
Windows Store landing page
本章讨论了通过你的应用赚钱的两种常见方式:销售应用和在应用内销售。许多应用也通过应用内广告创收,但这种方法的细微差别超出了本书的范围。
销售您的应用
如果你有机会拥有一部 iPhone,并浏览苹果的应用商店购买流程,你可能会注意到许多非免费/收费应用有两个版本:一个免费的“演示”版本,用于展示应用可以做什么,以及一个附带的全功能版本。演示版要么功能有限,要么完全开放,但支持广告。附带的全功能版本通常不支持广告。用户可以习惯这样的约定,但在开发方面,这可能会导致头痛,因为特性必须跨两个代码库进行管理:一个用于应用的演示版本,另一个用于完整版本。
微软的 Windows Store 通过让你发布付费应用作为试用版来帮助解决这个问题。这允许开发人员维护应用的一个版本,作为试用版和完整版,并指定应用可以从一个版本迁移到另一个版本的条件。从 Windows Store 的角度来看,这避免了像苹果应用商店那样不必要的重复。从最终用户的角度来看,它提供了一种简单易行的方法来试用一个应用,如果你喜欢就购买它。图 9-2 显示了一个 Windows Store 付费应用页面,用户可以使用试用模式。
图 9-2。
Application with trial mode
从开发人员的角度来看,构建用于销售但包含试用组件的应用的工作流程相对简单:
Build the application as a full-featured application without worrying about which pieces of functionality are trial bits and which aren’t. After the application is built and tested and you’re sure everything works as intended, determine which features you want available to trial-version users and which bits you want to make visible only to paid-version users. Use the Microsoft-provided classes to gate the sections of the application that a trial user can’t access.
每个应用都有自己控制试用用户的方法。对于一些应用,比如游戏,你可能想展示应用能做的一切,但是对高级功能(或者应用的整体使用)有时间限制。
试用的想法不仅仅是对应用进行测试;这也是为了推销这款应用的好处。当你为了赚钱而开发应用时,请记住这个核心概念:追加销售,追加销售,追加销售!
接下来,让我们看看示例试用应用。
试用应用示例
考虑到上一节中的三个步骤,清单 9-1 在步骤 1 的末尾给出了一个非常简单的应用。
Listing 9-1. Simple Application with Two Features and a Buy App Button
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Listing1</title>
<!-- WinJS references -->
<link href="//Microsoft.WinJS.1.0/css/ui-dark.css" rel="stylesheet" />
<script src="//Microsoft.WinJS.1.0/js/base.js"></script>
<script src="//Microsoft.WinJS.1.0/js/ui.js"></script>
<link href="Listing1.css" rel="stylesheet" />
<script src="Listing1.js"></script>
</head>
<body>
<div class="Listing1 fragment">
<section aria-label="Main content" role="main">
<header aria-label="Header content" role="banner">
<button class="win-backbutton" aria-label="Back" disabled type="button"></button>
<h1 class="titlearea win-type-ellipsis">
<span class="pagetitle">Trial Mode Sample</span>
</h1>
</header>
</section>
<section aria-label="Main content" role="main">
<input type="button" id="btn_buyapp" value="buy app" />
</section>
<section aria-label="Main content" role="main">
<input type="button" id="btn_coolfeature" value="cool feature" />
</section>
<section aria-label="Main content" role="main">
<input type="button" id="btn_coolerfeature" value="even cooler feature" />
</section>
</div>
</body>
</html>
应用试用模式
试用模式应用向用户呈现了两个特性:一个很酷,另一个更酷。想必你想让这款应用的用户能够使用酷炫的功能,但只能看到更酷的功能。此外,当应用处于试用模式时,您希望购买应用按钮可见,但在购买应用后,您希望该按钮消失——否则用户可能会感到困惑,认为他们的购买没有注册或应用有缺陷。
对于 Windows 8 应用,购买是通过 Windows 商店 API 管理的,该 API 通过Windows.ApplicationModel.Store命名空间提供。这是所有相关信息的入口,这些信息包括用户是否在使用试用版,如果是,还有多长时间可以试用。不幸的是,这些类只针对实际生产的 Windows 应用商店数据,这意味着它们期望您的应用在商店中并处于活动状态。这当然带来了一个问题,因为一个未发布的应用没有可用的信息,因此不可能测试试用模式的工作流。为了帮助解决这一困境,Windows 应用商店 API 包括一个模拟器 API 集,它模仿实时版本的功能,但针对您提供的 XML 文件工作。以这种方式使用 Windows Store commerce 基础架构的 Windows Store 应用需要您构建和管理这个 XML 文件,该文件称为WindowsStoreProxy.xml,并且始终位于%userprofile%\appdata\local\packages\<package-moniker>\localstate\microsoft\Windows Store\Apidata文件夹中。由开发人员决定是否放置/修改该文件,以适应您打算在应用中进行测试的场景(在这种情况下,测试以查看应用在试用模式和购买模式下的行为)。清单 9-2 显示了这个文件格式的一个例子。
Listing 9-2. WindowsStoreProxy.xml
<?xml version="1.0" encoding="utf-16" ?>
<CurrentApp>
<ListingInformation>
<App>
<AppId>2B14D306-D8F8-4066-A45B-0FB3464C67F2</AppId>
<LinkUri>http://apps.microsoft.com/app/2B14D306-D8F8-4066-A45B-0FB3464C67F2</LinkUri
<CurrentMarket>en-us</CurrentMarket>
<AgeRating>6</AgeRating>
<MarketData xml:lang="en-us">
<Name>Trial management full license</Name>
<Description>Sample app for demonstrating trial license management</Description>
<Price>4.99</Price>
<CurrencySymbol>$</CurrencySymbol>
</MarketData>
</App>
</ListingInformation>
<LicenseInformation>
<App>
<IsActive>true</IsActive>
<IsTrial>true</IsTrial>
<ExpirationDate>2011-01-01T00:00:00.00Z</ExpirationDate>
</App>
</LicenseInformation>
</CurrentApp>
许可您的应用
下一节将更详细地介绍WindowsStoreProxy.xml文件的各种元素。现在,让我们把注意力集中在LicenseInformation部分,重点放在IsTrial节点上——在本文档中它被设置为true。
您主要通过一个类与 Windows 商店进行交互:CurrentApp。(由于上述原因,在这个例子中,您使用了另一个类——使用了WindowsStoreProxy.xml的那个类——叫做CurrentAppSimulator。它模拟了CurrentApp的 API 表面积。)CurrentApp公开了一个LicenseInformation类型的LicenseInformation属性,您可以用它来读取与应用相关的许可数据。清单 9-2 中的WindowsStoreProxy.xml文件的粗体部分对应于这个部分。LicenseInformation提供IsActive、IsTrial、ExpirationDate等属性。在正常情况下(当你的应用已经发布到 Windows Store 并且是公开的),调用Windows.ApplicationModel.Store.CurrentApp.licenseInformation返回应用的LicenseInformation实例。在这种情况下,因为您的应用还没有发布,所以您必须使用CurrentAppSimulator,当属性被调用时,它期望WindowsStoreProxy.xml文件位于前面讨论的位置;否则会出现错误。
在此示例中,您没有在 Windows 应用商店文件夹中查找该文件的放置位置并手动将其复制到该位置,而是创建了该文件的临时版本,您可以根据需要对其进行编辑。您将它放在应用的安装目录中;然后,每次应用启动时,您动态创建适当的 Windows Store 文件夹,在该文件夹中创建WindowsStoreProxy.xml文件,并将临时代理文件的内容复制到最终位置。这样,您可以轻松地使用本地副本。
在您的示例项目中,添加storeproxy文件夹;在其中,添加文件TrialManagement.xml,这是默认的WindowsStoreProxy.xml文件的副本。清单 9-3 显示了带有刚才描述的功能的样例应用的 JavaScript。
Listing 9-3. JavaScript for Example App
(function ()
{
"use strict";
var _listing_information = null;
var _license = null;
WinJS.UI.Pages.define("/Listing1/Listing1.html", {
// This function is called whenever a user navigates to this page. It
// populates the page elements with the app's data。
ready: function (element, options)
{
initializePurchaseState();
},
});
function initializePurchaseState()
{
var proxy_folder = null;
var install_location = null;
var temp_proxy_file = null;
Windows.Storage.ApplicationData.current.localFolder。
createFolderAsync("Microsoft\\Windows Store\\ApiData",ⅵ
Windows.Storage.CreationCollisionOption.replaceExisting)
.then(
function (folder)
{
proxy_folder = folder;
return Windows.ApplicationModel.Package.current.installedLocation
.getFolderAsync("storeproxy");
})
.then(function (location)
{
install_location = location;
return install_location.getFileAsync("trialmanagement.xml");
})
.then(function (temp)
{
temp_proxy_file = temp;
return proxy_folder.createFileAsync("WindowsStoreProxy.xml",ⅵ
Windows.Storage.CreationCollisionOption.replaceExisting);
})
.then(function (proxy_file)
{
temp_proxy_file.copyAndReplaceAsync(proxy_file);
})
.done(function ()
{
_license = Windows.ApplicationModel.Store↩
.CurrentAppSimulator.licenseInformation;
});
}
})();
清单 9-3 从调用initializePurchaseState开始。无论您是使用代理文件还是去 Windows 应用商店获取有关应用许可的信息,预先做这些都是有意义的。毕竟,您使用这些信息来确定向用户公开什么功能以及隐藏什么功能。initializePurchaseState相当直白;您打开或创建代理文件所在的目标文件夹,在那里创建正式的代理文件,然后将您的临时代理文件(您使用和修改的那个)的内容复制到正式的WindowsStoreProxy.xml文件。注意使用文件 I/O 时使用的承诺。在这种情况下,因为这只是为了开发目的,所有参数和文件名都在您的控制之下,所以您省略了每个then函数的第二个参数,它是错误条件的处理程序。正常情况下,这个应该包括在内!
在async链的末端是done函数,在这里您最终读取了LicenseInformation。同样,因为您使用的是CurrentAppSimulator,所以这是从您的WindowsStoreProxy.xml文件中读取的,而不是实际的 Windows 应用商店。图 9-3 显示了此时应用的外观和感觉。
图 9-3。
Trial mode sample app
现在您已经有了应用许可的详细信息,您可以根据需要开始显示和隐藏功能。在这种情况下,您需要做的就是读取IsTrial的值,并基于此切换购买应用按钮的可见性和更酷功能按钮的可交互性。清单 9-4 相应地更新了应用。
Listing 9-4. Trial App Updated with IsTrial Logic
(function ()
{
"use strict";
var _listing_information = null;
var _license = null;
WinJS.UI.Pages.define("/Listing1/Listing1.html", {
// This function is called whenever a user navigates to this page. It
// populates the page elements with the app's data。
ready: function (element, options)
{
initializePurchaseState();
btn_coolfeature.onclick = function ()
{
var v = new Windows.UI.Popups
.MessageDialog("This feature available to ALL customers");
v.showAsync();
};
btn_coolerfeature.onclick = function ()
{
if (_license.isTrial)
{
var v = new Windows.UI.Popups
.MessageDialog("This feature is only available to PAYING customers");
v.showAsync();
} else
{
var v = new Windows.UI.Popups
.MessageDialog("PAYING customer feature");
v.showAsync();
}
};
},
});
function initializePurchaseState()
{
var proxy_folder = null;
var install_location = null;
var temp_proxy_file = null;
Windows.Storage.ApplicationData.current.localFolder。
createFolderAsync("Microsoft\\Windows Store\\ApiData",ⅵ
Windows.Storage.CreationCollisionOption.replaceExisting)
.then(
function (folder)
{
proxy_folder = folder;
return Windows.ApplicationModel.Package.current.installedLocation
.getFolderAsync("storeproxy");
})
.then(function (location)
{
install_location = location;
return install_location.getFileAsync("trialmanagement.xml");
})
.then(function (temp)
{
temp_proxy_file = temp;
return proxy_folder.createFileAsync("WindowsStoreProxy.xml",ⅵ
Windows.Storage.CreationCollisionOption.replaceExisting);
})
.then(function (proxy_file)
{
temp_proxy_file.copyAndReplaceAsync(proxy_file);
})
.done(function ()
{
_license = Windows.ApplicationModel.Store.CurrentAppSimulator
.licenseInformation;
loadAppPurchaseStateUI();
});
}
function loadAppPurchaseStateUI()
{
if (_license.isTrial)
{
btn_buyapp.style.visibility = "visible";
} else
{
btn_buyapp.style.visibility = "hidden";
}
}
})();
粗体显示的变化很简单。当应用启动时,以及当用户点击更酷的特性按钮时,您实际上切换了基于IsTrial标志的行为。图 9-4 、 9-5 、 9-6 和 9-7 显示了基于用户点击的应用的各种状态。
图 9-7。
App view when Even Cooler Feature is clicked (IsTrial is true)
图 9-6。
App view when Even Cooler Feature is clicked (IsTrial is false)
图 9-5。
Prompt when Cool Feature is clicked
图 9-4。
App main screen when IsTrial is false
将代码添加到应用
该流程的最后一个部分是添加执行应用的实际购买所必需的代码。一旦应用被激活,您可以通过再次调用loadAppPurchaseStateUI来刷新用户界面。清单 9-5 显示了 Buy App 按钮的onclick事件的函数回调。
Listing 9-5. Simulating the User Purchasing the Application
btn_buyapp.onclick = function ()
{
Windows.ApplicationModel.Store.CurrentAppSimulator
.requestAppPurchaseAsync(true)
.then(function (receipt)
{
_license = Windows.ApplicationModel.Store.CurrentAppSimulator
.licenseInformation;
loadAppPurchaseStateUI();
});
};
应用购买请求
通过调用CurrentApp或CurrentAppSimulator的requestAppPurchaseAsync方法,应用可以代表用户提出购买请求(这必须通过用户驱动的事件来完成,如鼠标点击)。虽然 API 是相同的,但是随后的操作会根据使用的类而有所不同。CurrentApp调用 Windows 商店购买用户界面,而CurrentAppSimulator启动一个传统的 Windows 对话框,您可以在其中选择您希望模拟器返回到您的应用的响应类型。您可以使用该功能来模拟快乐之路之外的各种用例。图 9-8 显示了点击购买应用按钮时出现的对话框。
您的代码应该能够处理这些场景,这样您的应用就不会崩溃。为此,您需要整合清单 9-5 中的错误处理函数。回想一下第一章中的,您使用的then承诺可以接受三个函数:正常的完成处理程序、异步处理过程中发生错误时的错误处理程序,以及提供操作进度洞察的进度处理程序。在图 9-8 的对话框中选择的值作为参数传递给错误事件处理器。您可以使用该值向用户显示适当的消息。
图 9-8。
CurrentAppSimulator purchasing dialog for testing purchasing scenarios
在应用内销售
您已经了解了如何构建一个支持试用的应用。这种方法的前提是将您的应用发布为付费应用。付费应用代表了通过 Windows Store 应用赚钱的主要方式,但只是触及了总体模式的表面。
提供试用版是让潜在客户下载你的应用并在承诺支付费用前进行试运行的好方法,但这种方法在与免费同行竞争时有一些明显的缺点。毫无疑问,统计数据显示(在所有主要的应用商店中),免费应用的下载量远远超过付费应用,并且与之相关的活动和对话也更多。虽然从技术上来说,试用应用是免费的,但它仍然在 Windows Store 的付费类别中列出,这使得发现你的应用成为一个问题。此外,正如您在前面的例子中看到的,付费/试用模式的灵活性有限。
作为一名开发者,你实际上只有两种产品可以呈现给最终用户:应用的免费版本和完整版本。实现的二进制性质限制了应用中自然存在的商业机会。例如,在这个例子中,假设您创建了一个“最酷的特性”功能,您额外给了它一美元。这将把应用的成本提高到 5.99 美元(根据WindowsStoreProxy.xml文件,该产品目前的成本为 4.99 美元)。不仅高昂的价格点可能难以消化,而且它还消除了用户只为一个功能付费的选择。通过应用内购买,你可以将购买的压力从整个应用转移到应用内的特定功能上。这一举两得。一方面,你把你的应用转移到世界上流量更高的地方,让它更容易被发现。另一方面,你继续将你的应用货币化,这一次你可以更好地控制你免费提供的应用。
在应用内购买方面,一个突出的应用类别是游戏。用户经常偶然发现免费游戏,由于不存在的价格标签,他们会很快下载。一旦参与(上瘾是一个常见的术语),用户更倾向于为额外的功能付费。
将应用内购买添加到应用
让我们修改示例应用以使用应用内购买。清单 9-6 从稍微修改应用的用户界面开始。
Listing 9-6. Modified User Interface for the Trial App
<section aria-label="Main content" role="main">
<input type="button" id="btn_buyapp" value="buy app" />
</section>
<section aria-label="Main content" role="main">
<input type="button" id="btn_coolfeature" value="cool feature" />
</section>
<section aria-label="Main content" role="main">
<input type="button" id="btn_coolerfeature" value="please wait..." />
</section>
<section aria-label="Main content" role="main">
<input type="button" id="btn_coolestfeature" value="please wait..." />
</section>
到目前为止,您已经添加了一个新按钮btn_coolestfeature,并且修改了btn_coolerfeature的内容,以向用户表明他们的内容正在加载。正如你马上看到的,你这样做是为了利用应用内购买的一个好处:你可以在应用外定义你的产品目录。你不再需要硬编码你正在销售的特性的名字;您可以直接从 Windows 应用商店阅读它们。
第十章将详细介绍如何在商店中设置你的应用。为了帮助解决这个问题,应用内购买向WindowsStoreProxy.xml文件引入了一些新的元素类型。清单 9-7 更新了您的本地副本,包含了表示应用内购买功能所需的所有元素。
Listing 9-7. WindowsStoreProxy.xml with Product Listing Information Included
<?xml version="1.0" encoding="utf-16" ?>
<CurrentApp>
<ListingInformation>
<App>
<AppId>2B14D306-D8F8-4066-A45B-0FB3464C67F2</AppId>
<LinkUri>http://apps.microsoft.com/app/2B14D306-D8F8-4066-A45B-0FB3464C67F2</LinkUri
<CurrentMarket>en-us</CurrentMarket>
<AgeRating>6</AgeRating>
<MarketData xml:lang="en-us">
<Name>Trial management full license</Name>
<Description>Sample app for demonstrating trial license management</Description>
<Price>0.00</Price>
<CurrencySymbol>$</CurrencySymbol>
</MarketData>
</App>
<Product ProductId="coolerfeature">
<MarketData xml:lang="en-us">
<Name>Cooler Feature</Name>
<Price>1.99</Price>
<CurrencySymbol>$</CurrencySymbol>
</MarketData>
</Product>
<Product ProductId="coolestfeature">
<MarketData xml:lang="en-us">
<Name>Coolest Feature</Name>
<Price>2.99</Price>
<CurrencySymbol>$</CurrencySymbol>
</MarketData>
</Product>
</ListingInformation>
<LicenseInformation>
<App>
<IsActive>true</IsActive>
<IsTrial>false</IsTrial>
</App>
<Product ProductId="coolerfeature">
<IsActive>false</IsActive>
</Product>
<Product ProductId="coolestfeature">
<IsActive>false</IsActive>
</Product>
</LicenseInformation>
</CurrentApp>
实现应用内购买
实现应用内购买会以多种方式改变应用。在前面的方法中,您让用户单击更酷的特性按钮,然后用一条消息提示他们,要使用该特性,他们必须购买该应用。既然您正在将应用转换为商业风格的应用,那么您应该提前为用户提供信息,以帮助他们做出购买决定。为此,您需要访问产品列表信息,以确定每个特性的名称以及该特性的价格。
清单 9-6 修改了两个目标按钮来显示文本请等待。现在让我们进入下一步,用直接从WindowsStoreProxy.xml文件中提取的适当内容填充每个按钮。清单 9-8 显示了支持应用内购买的加载过程的修改。
Listing 9-8. Loading Content from the Windows Store
function initializePurchaseState()
{
var proxy_folder = null;
var install_location = null;
var temp_proxy_file = null;
Windows.Storage.ApplicationData.current.localFolder。
createFolderAsync("Microsoft\\Windows Store\\ApiData",ⅵ
Windows.Storage.CreationCollisionOption.replaceExisting)
.then(
function (folder)
{
proxy_folder = folder;
return Windows.ApplicationModel.Package.current.installedLocation
.getFolderAsync("storeproxy");
})
.then(function (location)
{
install_location = location;
return install_location.getFileAsync("trialmanagement.xml");
})
.then(function (temp)
{
temp_proxy_file = temp;
return proxy_folder.createFileAsync("WindowsStoreProxy.xml",
Windows.Storage.CreationCollisionOption.replaceExisting);
})
.then(function (proxy_file)
{
temp_proxy_file.copyAndReplaceAsync(proxy_file);
})
。then( function ()
{
_license = Windows.ApplicationModel.Store.CurrentAppSimulator
.licenseInformation;
返回窗口。applicationmodel.store.currentappsimulator↩
.loadListingInformationAsync();
})
.done(function (listing)
{
_listing_information = listing;
loadAppUI();
});
}
function loadAppUI()
{
if (_listing_information.productListings["coolerfeature"] != null)
{
GenerateButtonUI(btn_coolerfeature, "coolerfeature");
}
if (_listing_information.productListings["coolestfeature"] != null)
{
GenerateButtonUI(btn_coolestfeature, "coolestfeature");
}
}
function GenerateButtonUI(btn_target, feature_name)
{
var feature = _listing_information.productListings[feature_name];
var action_type = "Buy for " + feature.formattedPrice;
var feature_license = _license.productLicenses[feature_name];
if (feature_license.isActive)
{
action_type = "Use now";
}
btn_target.value = feature.name + " - " + action_type;
}
在清单 9-8 中你做的第一件事是通过调用Windows.ApplicationModel.Store.CurrentAppSimulator.loadListingInformationAsync来扩展async链。这个调用返回向用户展示特性名称和价格所需的列表信息。此时运行应用会产生如图 9-9 所示的视图。
图 9-9。
User interface elements populated from the Windows Store listing
现在,您需要添加必要的逻辑,以便在单击任一按钮时购买或激活相应的功能。清单 9-9 显示了对每个按钮的onclick事件的更改,以启用该功能。
Listing 9-9. Enabling In-App Commerce
btn_coolerfeature.onclick = function ()
{
var feature_license = _license.productLicenses["coolerfeature"];
var feature_listing = _listing_information.productListings["coolerfeature"];
if (feature_license.isActive)
{
var v = new Windows.UI.Popups
.MessageDialog("Using " + feature_listing.name + "!");
v.showAsync();
}
else
{
//buy the product
Windows.ApplicationModel
.Store.CurrentAppSimulator
.requestProductPurchaseAsync(feature_license.productId, true)
.then(function (receipt)
{
//refresh after purchase
loadAppUI();
});
}
};
btn_coolestfeature.onclick = function ()
{
var feature_license = _license.productLicenses["coolestfeature"];
var feature_listing = _listing_information.productListings["coolestfeature"];
if (feature_license.isActive)
{
var v = new Windows.UI.Popups
.MessageDialog("Using " + feature_listing.name + "!");
v.showAsync();
}
else
{
//buy the product
Windows.ApplicationModel
.Store.CurrentAppSimulator
.requestProductPurchaseAsync(feature_license.productId, true)
.then(function (receipt)
{
//refresh after purchase
loadAppUI();
});
}
};
逻辑很简单:当用户单击任一按钮时,您检查产品功能是否有有效的许可证。如果是,则调用特征功能。如果没有,则向商店发起购买该特征的请求。与 app 购买一样,CurrentAppSimulator显示了之前在图 9-8 中显示的对话框。一旦购买了一个特性,就调用loadAppUI来重新加载用户界面。这一次,您不会看到与该特定功能相关的价格,因为它已经被购买,并且现在处于活动状态。图 9-10 说明了。
图 9-10。
App after both features have been purchased
图 9-11 显示了当点击其中一个按钮时会发生什么——在这个例子中,是最酷的功能按钮。
图 9-11。
Using a purchased feature in an app
应用内购买和试用应用是帮助您将应用货币化的强大功能,因此确保正确的功能至关重要。考虑到从用户的角度来看,对应用稳定性的信心对购买体验有多么重要,你最不希望的事情就是你的应用在购买场景中不能正常运行。在测试这些场景时,结合使用CurrentAppSimulator和WindowsStoreProxy.xml文件是至关重要的。来自 MSDN 文档( http://msdn.microsoft.com/en-us/library/windows/apps/hh779766.aspx )的以下部分详细概述了该文件的各个节点。如果你有兴趣将你的应用货币化,请确保你了解这些节点是如何工作的:
ListingInformation: Represents data that would normally be found in the app’s listing and includes these elements: App: Represents data about the app and contains these elements: AppId: The GUID that identifies the app in the store. This can be any GUID for testing. LinkUri: The URI of the listing page in the store. This can be any valid URI for testing. AgeRating: An integer that represents the minimum age rating of the app. This is the same value you would specify in the Dashboard when you submit the app. The values used by the Windows Store are: 3, 7, 12, and 16. CurrentMarket: The customer’s country/region. For each country/region in which the app is listed, there must be a MarketData element: MarketData: Info about the app for this country/region. Requires the xml:lang attribute, which specifies the country/region for which this info applies: Name: The name of the app in this country/region. Description: The description of the app for this country/region. Price: The price of the app in this country/region. CurrencySymbol: The currency symbol used in this country/region. Product: Describes a product or a feature in this app that is enabled when the customer makes an in-app purchase. Requires the ProductId attribute, which contains the string used by the app to identify the product or feature. Requires the LicenseDuration attribute, which contains the number of days the license will be valid after the purchase. The expiration date of the new license created by a product purchase is the purchase date plus the license duration: MarketData: Info about the product or feature for this country/region. Requires the xml:lang attribute, which specifies the country/region for which this information applies: Name: The name of the product or feature in this country/region. Price: The price of the product or feature in this country/region. CurrencySymbol: The currency symbol used in this country/region. CurrencyCode: The currency code used in this country/region. LicenseInformation: Represents data that describes the licenses available for this app and includes the following elements: App: Describes the app’s license: IsActive: Describes the current license state of this app. true indicates the license is valid. Normally this value is true, whether the app has a trial mode or not. false indicates an invalid license. Set this value to false to test how your app behaves when it has an invalid license. IsTrial: Describes the current trial state of this app. true indicates the app is being used during the trial period. false indicates the app isn’t in a trial, either because the app has been purchased or because the trial period has expired. ExpirationDate: The date the trial period for this app expires. The date must be express as: yyyy-mm-ddThh:mm:ss.ssZ. For example, 05:00 on January 19, 2012 is specified as 2012-01-19T05:00:00.00Z. This element is required when IsTrial is true. Otherwise, it isn’t required. DefaultResponse: Describes the default error code returned by a given method. The MethodName attribute allows you to specify one of these methods: RequestAppPurchaseAsync_GetResult, RequestProductPurchaseAsync_GetResult, or LoadListingInformationAsync_GetResult. The HResult attribute allows you to specify the error code. Product: Describes the license status of a product or feature in the app: IsActive: Describes the current license state of this product or feature. true indicates the product or feature can be used. false indicates the product or feature can’t be used or has not been purchased. ExpirationDate: The date the product or feature expires. The date must be express as: yyyy-mm-ddThh:mm:ss.ssZ. For example, 05:00 on January 19, 2012 is specified as 2012-01-19T05:00:00.00Z. If this element is present, the product or feature has an expiration date. If this element isn’t present, the product or feature doesn’t expire.
摘要
无论采取措施让你的应用赚钱是必要的坏事还是锦上添花,这都是你应该知道的事情,并且可以从现实世界的应用开发中受益。本章提供了要遵循的步骤,以及一些有用的见解,以最有效地将你的应用货币化。本章涵盖的要点包括以下内容:
- Microsoft Windows 应用商店可以将付费应用发布为试用版,允许您创建和维护单个应用的试用(免费)和全功能(付费)版本,并指定应用从一个版本迁移到另一个版本的条件。
- 实现单个应用的试用版和全功能版有助于提升应用的销量。
- 在测试场景中,结合使用
CurrentAppSimulator和WindowsStoreProxy.xml文件是很重要的。 - 通过销售你的应用来赚钱和通过在应用内销售来赚钱是不同的。
- 提供免费应用、付费应用或带有免费试用选项的付费应用都有潜在的利弊。
- 实现应用内购买是一种强大的应用货币化方法。
十、在 Windows 应用商店获取你的应用
Abstract
前一章深入探讨了你的应用的货币化。但你还没到那一步。为了让你的应用在 Windows 应用商店中发布,一些管理职责是不容忽视的。注意:你已经完成了与世界分享你的 Windows 8 应用的最后一步。
前一章深入探讨了你的应用的货币化。但你还没到那一步。为了让你的应用在 Windows 应用商店中发布,一些管理职责是不容忽视的。注意:你已经完成了与世界分享你的 Windows 8 应用的最后一步。
作为一名开发人员,在 Windows Store 上下载你的应用可能是旅程中最乏味的部分。但是请放心,遵循前几章提出的指导方针会让你的应用尽可能无缝地被接受发布。本章讨论设置开发者帐户、应用提交、应用跟踪和应用管理。您将了解发布后功能,包括提供销售数据、下载、激活和遥测视图的工具。抓紧了:你就要——你的应用就要——出来了!
创建应用包
让我们直接进入 Windows 应用商店提交流程。您熟悉开发人员中心和开发人员仪表板。这就是神奇继续发生的地方——你进入 Windows 应用商店的入口。
若要创建应用包,请在 Visual Studio 2012 的“商店”子菜单中选择“创建应用包”项。如果您选择为 Windows 应用商店构建应用包的选项,系统会提示您使用 Windows 开发人员帐户登录应用商店,您将被定向到“选择应用名称”屏幕。图 10-1 显示了 Visual Studio 中的提交应用菜单和子菜单选项。
图 10-1。
Visual Studio Submit App drop-down menu and submenu selections
图 10-2 显示了选择应用名称屏幕。
图 10-2。
Visual Studio Select an App Name screen
图 10-2 中列出的 Windows 应用商店应用名称是您之前必须通过 Windows 应用商店开发者中心注册的名称。选择其中一个名称会将您正在处理的项目与该特定应用相关联。截至本文撰写之时,您还不能通过 Visual Studio 2012 界面注册应用名称。你将在本章后面了解更多关于注册应用名称的信息;现在,让我们专注于配置您的应用,以便它可以发布到商店。
如果您选择不创建 Windows 应用商店包,则不必登录,但生成的应用包只能安装在开发人员计算机上或支持侧加载的环境中。(侧装是绕过 Windows 商店,直接在 PC 上安装 Windows 8 应用的过程。)点击 Next,你会看到一个 package settings 屏幕,在这里你可以指定包输出位置、版本号和构建配置(见图 10-3 )。
图 10-3。
Package settings screen
应用包使用符合 Windows 8 应用风格指南的.zipAPPX 打包格式。APPX 包是在您从 Windows 应用商店安装应用时下载到您的计算机上的包,它是您用于提交到 Windows 应用商店的格式。APPX 软件包可以部署为 x86(适用于 32 位操作系统)、x64(适用于 64 位 Windows 8 版本)、ARM(适用于基于 ARM 的平板电脑和 PC,如微软 Surface 和华硕 VivoTab)或 Neutral(适用于所有平台的版本)。
完成应用包创建方式的配置后,单击创建按钮构建包。Visual Studio 将您的项目编译成适当的可执行格式,并将其打包成 APPX(包括证书和包清单)。至此,向导完成。它为您提供了可以找到您创建的包的位置。图 10-4 显示了最终屏幕(显示了我机器上所有学习包的路径)。
图 10-4。
The wizard’s final screen
验证你的应用包
为了让您将应用提交到 Windows 应用商店,它必须满足 Microsoft 确定的特定标准。这确保了 Windows 应用商店中的应用对于最终用户来说是安全的,他们可以在所有目标平台上无缝地安装和工作,没有例外。Microsoft 希望您的应用使用经过批准的标准化 API 外围应用,并遵循与 Windows 应用商店主题相匹配的设计、风格和内容指南。验证内容和样式组件需要人工输入;但作为应用提交过程的一部分,Windows Store 会自动检查应用包,以确定您使用了哪些 API 和编程模式。如果包不满足必要的要求,它不会被接受,并且您不能继续提交过程。
微软提供了一个名为 Windows 应用认证工具包(WACK)的有用的认证工具,它可以在本地运行你的应用,并执行一系列旨在找到常见且容易检测到的应用认证失败的测试。要启动它,只需使用搜索符并输入它的名称。图 10-5 显示了 WACK 接口(双关语)。
图 10-5。
WACK interface
正如你可能想象的那样,WACK 工具可以帮助你识别和解决应用中的任何问题,否则这些问题会阻止应用提交到 Windows 应用商店。表 10-1 列出了 WACK 工具进行的一些测试。
表 10-1。
WACK App Tests
| 试验 | 描述 | | --- | --- | | 遵守系统重启消息 | 测试您的应用在收到系统关闭通知时是否尽快退出。 | | 应用清单策略 | 测试应用清单的内容,以确保其正确无误且格式正确。 | | 应用清单资源 | 测试应用清单中定义的资源,以确保它们存在并且有效。这包括用适当的图像/字符串来呈现应用的各种状态。 | | 干净可逆安装 | 确保应用正确安装和卸载,没有残留文件或注册表项。 | | 兼容性和弹性 | 验证应用没有使用任何 Windows 兼容性修复程序。 | | 崩溃和挂起 | 通过执行启动、运行和关闭过程来检查应用是否崩溃或挂起。 | | 调试配置 | 确认应用包是使用发布配置构建的。 | | 数字签名文件 | 验证有效的数字签名。 | | 直接 3d 特征级别 | 测试 Microsoft Direct3D 应用,以确保它们可以在所有 Windows 8 图形硬件上运行。 | | 文件编码 | 确认所有文件编码为 UTF-8。 | | 安装并写入正确的文件夹 | 确保应用将程序和数据文件写入正确的文件夹。 | | 表演 | 通过计时应用启动和暂停来确认性能速度。 | | 支持 Windows 8 商店 API | 确认使用 Windows 8 风格支持的 API。 | | Windows 安全功能 | 确认没有篡改默认的 Windows 安全保护。 |WACK 测试要么在后台运行,要么在一个小的应用窗口中运行,这取决于您启动该工具的方式。在 WACK 运行整套测试的几分钟内,您会看到您的应用出现和消失几次。无论你做什么,不要试图在测试期间与你的应用交互,否则你的电脑可能会过热并爆炸。不完全是,但是你的应用将会关闭,你将不能与之互动。一旦 WACK 工具完成测试,就会出现结果屏幕。如果测试失败,WACK tool 报告会传达失败的原因。如果 WACK 测试通过,你可以直接去 Windows 商店继续提交你的应用,或者从结果窗口查看链接的详细报告。
提交您的应用
您已经用一个经过验证的应用结束了上一节,您确信可以毫无问题地提交到 App Store。你之所以确定这一点,是因为在尝试提交之前,你使用了 WACK 工具来验证该应用是否符合 Windows 应用商店允许的最低标准。本节介绍了如何使用开发者仪表盘将此经过验证的应用包上传到 Windows 应用商店,以及如何通过提交应用商店认证来完成此过程。
您可以通过导航到 http://msdn.microsoft.com/en-US/windows/apps 来访问 Windows 应用商店开发中心。在那里,你用你的 Windows 应用商店帐户(通常是一个Hotmail/live/outlook.com电子邮件地址)登录。图 10-6 显示了开发中心登陆页面。
图 10-6。
Dev Center landing page
到目前为止,您所做的一切都不需要您注册任何东西,但您需要一个开发人员帐户来保留应用名称并向 Windows 应用商店提交应用。您可以在以下网站开始注册: http://msdn.microsoft.com/en-us/library/windows/apps/jj193592.aspx 。
注册并登录后,单击仪表板链接(如图 10-6 所示)将带您进入 Windows 8 应用的 Windows 应用商店仪表板。图 10-7 显示了 Windows 应用商店仪表盘。出于隐私原因,登录名(通常出现在屏幕的右上角)和应用列表已被隐藏。
图 10-7。
Windows Store dashboard
向 Windows 应用商店提交应用的主要方式是通过开发中心仪表板中的提交应用链接。单击此链接将进入一个工作流,从为应用命名到提供详细描述。作为提交过程的一部分,你还必须为你的申请提供销售细节——结合你在第九章中学到的一切。这意味着不仅要为应用整体定价,还要为应用中的功能定价(应用内优惠包含在该流程的高级功能步骤中)。
作为提交过程的一部分,您还需要提供内容分级信息。这确保了发布到商店的应用可以针对适当的年龄组。你可以指定你的应用使用的任何加密技术,然后通过一个步骤将你的应用上传到商店。如果你的应用已经通过了 WACK 工具的验证,那么这应该是一种形式;否则,这可能会是一个非常令人沮丧的过程,因为运行该工具会增加上传时间。(请注意,应用认证不会在上传过程中进行,而是作为整体提交的一部分在其他任何事情之前运行。)
最后一步,提供你的应用描述,可能看起来微不足道,但它很可能是这个过程中最吸引人的部分(特别是如果你没有一个图形设计师和定义良好的图标)。在这一步中,您不仅要为您的应用提供文本描述,还要包括您正在运行的应用的各种屏幕截图、不同分辨率的宣传图片、隐私政策 URL、电子邮件地址以及更多详细信息。图 10-8 显示了提交应用屏幕。
图 10-8。
App submission screen
命名您的应用
提交工作流程从命名应用开始。与网络域名一样,应用名称是先到先得的。幸运的是,在应用的世界里,房地产是购买的首选——这与如今的网络域名形成了鲜明的对比。
当你点击应用名称图标或链接时,你会被带到一个简单的屏幕,屏幕上有一个输入框,你可以在其中输入应用的名称(见图 10-9 )。输入您选择的名称,然后点按“保留应用名称”。如果名称不可用,您会看到一条错误消息。
图 10-9。
Reserving an app name
一旦选定的名称被保留,您有一年的期限来提交您的应用。在那之后,这个名字会回到池中。
销售详情
现在,你将进入销售详情页面。图 10-10 显示了页面的顶部,在这里你可以选择是将你的应用列为免费还是付费,或者使用基于应用功能/版本的多样化定价,正如在第九章中深入讨论的。你还需要提供免费试用的详细信息,以及你想在哪里销售应用的信息。
图 10-10。
Upper portion of the Selling Details screen
图 10-11 显示了销售详情屏幕的底部。您可以在这里指定您的应用何时发布。您需要提供应用类别和子类别,还需要指定任何硬件要求和辅助功能。
图 10-11。
Lower part of the Selling Details screen
高级功能
接下来,系统会提示您指定应用提供的任何高级功能。其中包括背景磁贴更新的推送通知、Live Connect 服务以及将通过 Windows 8 应用提供的任何应用内服务。如果您已经将产品添加到您的应用中(产品是上一章讨论的应用内购买功能的一部分),您可以在这里指定这些添加内容;它们允许你提供一些功能,用户可以在使用你的应用时购买。图 10-12 显示了 Windows 应用商店开发者仪表板的高级功能屏幕。
图 10-12。
Advanced Features screen
年龄评级和评级证书
接下来,你需要从表 10-2 中列出的选项中为你的应用选择一个年龄等级。这些评级是游戏所必需的。然而,即使你的应用不是游戏,如果包含成人内容,最好保持谨慎或保守,并提供评级。这样做将有助于确保你不会仅仅因为没有通过认证而失败。如果您不确定如何对您提供的内容进行分级,我建议使用对所提供的内容有意义的最高年龄分级。(还是那句话,保守有益。)
还要注意的是,对于游戏、在线访问和在线互动等活动,有不同的年龄要求,您可能不会立即意识到这一点(并且可能因国家而异)。例如,尽管社交 Web 应用本质上是良性的,但它们通常需要更高的评级,因为没有办法完全控制用户最终查看的内容。如果您正在构建这样的应用,如果成人和未成年人之间存在潜在的交互,那么显示明确禁止儿童的警告是很重要的。拥有更高的评级允许父母和监护人限制访问此类应用。
表 10-2。
Windows Store App Ratings
| 评级 | 描述 | | --- | --- | | 3+适合幼儿 | 这些应用被认为适合幼儿。在非现实的卡通形式中,可能会有很少的喜剧暴力。角色不应与现实生活中的角色相似或相关联。不应有可能令人恐惧的内容,也不应有裸露或涉及性或犯罪活动。具有此年龄分级的应用也不能启用可能访问不适合幼儿的内容或功能的功能。这包括但不限于访问在线服务、收集个人信息或激活麦克风或网络摄像头等硬件。 | | 7+适合 7 岁及以上儿童 | 这种年龄分级的应用与 3+应用具有相同的标准,只是这些应用可能包含可能会吓到年轻观众的内容,并且可能包含部分裸体,只要裸体不涉及性活动。 | | 12 岁以上适合 12 岁及以上儿童 | 如果您不确定要为您的应用选择哪个年龄分级,请选择此分级。具有此年龄分级的应用可能包含更多非性本质的裸露,对非现实人物的轻微图形暴力,或对现实人物或动物角色的非图形暴力。这个年龄等级也可能包括亵渎,但不是性的性质。此外,具有此年龄分级的应用可能包括对在线服务的访问,并启用麦克风和网络摄像头等功能。 | | 16 岁以上适合 16 岁及以上的人 | 具有这种年龄分级的应用可以用最少的鲜血描绘真实的暴力,并且可以描绘性活动。在认证要求规定的限制范围内,它们还可能包含毒品或烟草使用和犯罪活动,以及比 12+应用允许的更多的亵渎内容。 | | 18 岁以上仅适合成人。 | 除了适合 16 岁以上的应用的内容之外,具有此年龄分级的应用可能包含激烈、粗俗或特定的暴力,以及只适合成年观众的血腥或血腥。 |如果你的应用是一个游戏,或者根据判断需要评级,下一步就是提交并保存你的评级。提交的应用内容将根据您在认证过程中给出的评分进行评估。对于归类为游戏的 Windows 8 应用,会显示一个评级板,其中有一个针对该应用列出的每个地理市场的证书。基于这些地理市场,特别是巴西、韩国、南非和台湾,如果您计划在全球范围内提供游戏应用,则必须获得列出的证书。当然,如果获得证书有问题,你可以选择放弃在某些市场的销售。
密码系统
如果您的应用使用任何形式的数据文件加密、使用公钥基础架构、使用安全通信通道或使用平台 DRM 功能,系统会要求您回答一系列问题,并验证您对加密的使用仅限于常见情况,如密码、复制保护、数字签名或 DRM。图 10-13 显示了该页面。
图 10-13。
Cryptography screen
如果应用的加密超出了这些常见情况,您必须从美国商务部获取、输入并保存出口商品分类编号。(有关此过程的信息可在 http://export.gov/logistics/eg_main_018803.asp 找到)。)
上传你的应用
您已经到达了实际准备上传您的包的步骤。首先,您需要在 Visual Studio 中恢复您的包。打开应用包的文件夹,找到保存它的文件系统。您可以使用文件对话框找到该文件,或者您可以将当前版本的 APPX 上传文件拖放到软件包页面上的拖放区(参见图 10-14 )。为了确保所有需要的文件和资源都包含在包中,系统会执行验证,验证完成后会显示一条错误或成功消息。
图 10-14。
Packages screen
描述
现在是有趣的部分。通过在描述页面上输入对您的应用的描述,为您的辛勤工作感到自豪。系统还会提示您输入应用的功能、关键词和屏幕截图,并附有简短描述。潜在用户和审批者将看到相同的信息,因此内容应该准确、简洁、有说服力。图 10-15 显示了描述页面的顶部,在这里您可以提供描述和应用功能。
图 10-15。
Top part of the Description page
所有应用必须提供至少一个,最多八个截图。您可以选择使用 Windows 8 模拟器,它也会将图像存储在您的Pictures library 文件夹中,方法是在 Visual Studio 中打开您的应用并使用 Capture Screenshots 项。图 10-16 显示了描述页面的这一部分。
图 10-16。
The screenshots section of the Description page
描述页面的下一部分允许您提供搜索关键字以及额外信息,如应用的许可条款、版权信息以及所需或推荐的硬件。如果你在某个时候返回并编辑你的应用提交(例如,如果你有一个新版本),你需要包括一个单独的更新描述。硬件字段是您指定应用是否需要传感器或设备才能运行的地方。图 10-17 显示了描述页面的这一部分。
图 10-17。
Extra description information on the Description page
最后,你可以上传你的应用的宣传图片。其中包括任何用于 App Store 营销目的的图片。您可以输入与您的应用或公司关联的网站(如果有)。您还可以提供所有这些最终但重要的详细信息,包括支持联系地址和 URL 以及您的在线隐私声明的链接。参见图 10-18 。
图 10-18。
The Promotional Images section of the Description page
测试人员注意事项
下一个也是最后一个屏幕,如图 10-19 所示,允许您输入您选择提供给测试人员的任何其他信息。请注意,这是输入登录测试凭据的地方。
图 10-19。
Notes to Testers screen
让您的应用获得认证
现在是最容易的部分——或者最难的部分,取决于你如何看待它——在你等待你的应用的认证和随后的发布时,监控你的仪表板。提交后,您将收到来自 Windows 应用商店团队的确认电子邮件,让您知道这不仅仅是一个梦。这封电子邮件还提供了到您的仪表板的链接,用于跟踪应用在批准过程中的进度。
这个过程需要六个步骤,估计需要六天的等待时间。如果测试失败,您会通过仪表板和电子邮件得到通知,并允许您在解决错误后重新提交:
The submitted app is run through a series of automated tests. The app proceeds to security testing. (Everyone appreciates downloading secure apps to their Windows 8 devices, after all.) The app is put through a technical compliance test, which, if you had no problems running the WACK tool, should be smooth sailing, because Microsoft is running the WACK tool on its own servers. This completes the automated testing of the app. Your humble creation is sent to an actual tester (what a fun job!) for compatibility testing. Your dashboard provides an estimate in terms of days, but because this is the most subjective stage of the approvals, there can be some variance in this estimation. Once it passes this step, your app is ready to be published. The app receives digital signage and proceeds to the Windows Store servers and on to release in the Windows Store! But, ugh, there is still a potential for post-publication failure during what’s called the Manual Content Compliance test. In this environment, your app is tested for bugs, security, and appropriateness. You’ll receive an e-mail if the app fails this final step, directing you to the report detailing the fail reasons and actions to resolve in the Dev Center.
更新你的应用
希望你的应用会做得很好,随着技术的进步,更新应用功能的需求也会增加。请放心,亲爱的读者,你会收到忠实用户的反馈——也许比你预想的还要多!这种用户反馈可以提供关于可用性问题的有价值的见解,什么对你的用户有用,什么对你的用户没用,以及你的应用的当前版本中可能缺少什么。
当更新版本的开发完成后,您会发现商店更新流程是初始提交流程的简化版本。Windows 应用商店要求提交新的应用包,应用更新也要经过同样的六步验证过程。您可以再次运行 WACK 工具进行您自己的本地测试。幸运的是,提交更新的应用版本并获得批准应该更简单,只要遵守风格指南,减少错误风险和其他潜在问题。
以下是需要做和记住的事情的快速清单:
- 单击更新按钮,在应用页面上启动新的更新。
- 在提交新版本 2.0 之前,请记住在创建应用包向导中创建新版本号。
- 拿起您更新的应用包,回到仪表板。
- 在提交认证之前,我建议对变更或新增功能进行简要描述。更新页面看起来类似于新应用的提交页面,只是大部分信息已经提供了。
- 如果您需要更新关于您的应用的任何信息,从其功能或许可条款到屏幕截图或应用内购买优惠,您可以重新访问相关部分并相应地更新信息。否则,您可以直接进入上传软件包步骤,上传最新版本的应用。上传完成后,转到“详细信息”步骤,填写“更新描述”字段,这是必填字段。
摘要
恭喜你!你不仅完成了这本书,还完成了让你的 Windows 8 应用进入 Windows 应用商店的最后一步。通过阅读这一章,你知道这个过程的步骤是简单明了的;然而,您可能也可以确定,这可能是一个紧张的体验,可能会导致大量的调试或错误修复。但是一旦你走到这一步,不要放弃或沮丧。如果有的话,从你的代码中休息一下,用新鲜的眼光重新审视它。现在,我们来简要回顾一下本章的要点:
- 为您的应用保留名称。此名称保留一年,在此期间,您可以使用此名称发布您的应用。之后,该名称被重新分配到池中。
- 提交您的应用和您在 Windows 应用商店提交过程中使用的工具,包括创建应用包向导、开发中心和您的开发者仪表板。
- 一款名为 Windows 应用认证工具包(WACK)的认证工具,可用于测试你的应用。
- 认证过程,包括自动化测试、人工测试和手动内容合规性测试。
- 通过发布新版本来更新您的应用。这是让你的应用保持相关性,让你的用户满意,并保持应用处于技术进步前沿的一个重要方面。