创建WP7试用版应用:更高阶的现在购买功能

junwong 发布于 2012/02/11 17:17
阅读 522
收藏 1

英文原文:
http://windowsphonegeek.com/articles/Creating-a-Windows-Phone-7-Trial-Application-Advanced-Buy-Now-Implementation

这篇文章是我们开创的“创建WP7试用版应用”专题系列的第三篇文章。
当然你可以查看我们的第一篇第二篇

这里我将展示一下如何依据玩家第一次启动试用版应用的日期来让应用程序自动显示/隐藏一些关键性信息(主要是试用版将限制用户的总共累计使用时间)。大家请放心,和以前一样,我会在文章最后放上所有示例的源代码。

首先,我们来创建一个标准的Windows Phone 7应用程序,如同我们第一篇文章讲到的那样,设置好DebugTrial配置最后添加 IsTrial 静态属性。然后开始了我们关键的一步:添加“现在购买”的功能。

更高阶的“现在购买”功能实现 - 通过试用版应用第一次启动的日期来自动决定显示/隐藏关键信息 (即试用版限制用户的累计使用时间)

这里我们通过弹窗的方式在 Application_Launching 以及 Application_Activated 的事件中处理通过特定是时间计算来决定显示/隐藏某些消息。

注意:声明一下,理解整个试用版与完整版的模式区别是非常重要的,包括WP7的应用程序生命周期以及墓碑机制,你可以从该系列的第一篇文章参考一下。

这里我们主要使用IsolatedStorageSettings(独立存储) 去存储 FirstLauchDate 值(第一次启动的日期)(如果你想知道更多关于独立存储的知识,你可以参考这个系列的所有文章)。

好了,以下就是我们需要实现这个案例所要的步骤:

step1:首先我们需要创建一个新的WP7用户控件,命名为 BuyNowUserControl.xaml ,通过添加以下代码:

XAML:

<Grid Background="Black">
    <Grid.RowDefinitions>
        <RowDefinition Height="90"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Border Grid.Row="0">
    <TextBlock   TextWrapping="Wrap" FontSize="32" Padding="10"
                   Text="Do not forget to buy the full version!" />
    </Border>
    <StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Center">
        <Button x:Name="btnBuyNow" Content="Buy Now" Click="btnBuyNow_Click" />
        <Button x:Name="btnContinueTrial" Content="Continue Trial" Click="btnContinueTrial_Click" />
    </StackPanel>
</Grid>

因为我们打算使用动态的弹窗方式来显示特定信息给用户,所以我们需要在BuyNowUserControl用户控件实现ClosePopup()方法:
C#
public partial class BuyNowUserControl : UserControl
{
    private Popup popup = null;
 
    public BuyNowUserControl()
        : this(null)
    {
    }
 
    public BuyNowUserControl(Popup popup)
    {
        InitializeComponent();
        this.popup = popup;
    }
 
    private void btnBuyNow_Click(object sender, RoutedEventArgs e)
    {
        MarketplaceDetailTask marketplaceDetailTask = new MarketplaceDetailTask();
        marketplaceDetailTask.Show();
        this.ClosePopup();
    }
 
    private void btnContinueTrial_Click(object sender, RoutedEventArgs e)
    {
        this.ClosePopup();
    }
 
    private void ClosePopup()
    {
        if (this.popup != null)
        {
            this.popup.IsOpen = false;
        }
    }
}


step2:App.xaml.cs中添加以下代码,在我们今天这个示例中我将使用10秒作为过期时间,但如果在你的应用中,这个时间当然就要长得多了,所以在今天我们这个示例中始终要记住你必须等待稍微多一点时间以致试用版过期并且显示对应的信息!(基本就是提示没法继续免费下去了)

private static TimeSpan TrialPeriodLength = TimeSpan.FromSeconds(10.0);
private const string FirstLauchDateKey = "FirstLaunchDate";


step3:接着到App.xaml.cs。我们将创建 CheckTrialPeriodExpired() 方法来检测/判断是否试用版已经过期了:
1,使用IsolatedstorageSettings来存储第一次应用被启动的日期(firstLauchDate)
2,如果firstLauchDate是存在的,则计算从firstLauchDate到现在的时间长度
3,然后将计算出的时间长度与规定好的试用版使用期限进行比较
4,还需要订阅页面导航事件的处理,这里主要为了在页面加载完成后来显示提示过期的弹窗
5,如果firstLauchDate是不存在的,则立即存储当前时间为firstLauchDate

private void CheckTrialPeriodExpired()
{
    // when the application is activated
    // show message to buy the full version if trial period has expired
    IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
    DateTime firstLauchDate;
    if (settings.TryGetValue<DateTime>(FirstLauchDateKey, out firstLauchDate))
    {
        TimeSpan timeSinceFirstLauch = DateTime.UtcNow.Subtract(firstLauchDate);
        if (timeSinceFirstLauch > TrialPeriodLength)
        {
            // subscribe to the Navigated event in order to show the popup
            // over the page after it has loaded
            this.RootFrame.Navigated += new NavigatedEventHandler(RootFrame_Navigated);
        }
    }
    else
    {
        // if a value cannot be found for the first launch date
        // save the current date and time 
        settings.Add(FirstLauchDateKey, DateTime.UtcNow);
        settings.Save();
    }
}


step4:在App.xaml.cs的RootFrame_Navigated事件处理中添加以下代码(注意我们之前在step3中已经订阅了Navigated事件)。这里我们将展现step1里创建的 BuyNowUserControl 用户控件

void RootFrame_Navigated(object sender, NavigationEventArgs e)
{
    // remove the Navigated event handler as it is no longer necessary
    this.RootFrame.Navigated -= new NavigatedEventHandler(RootFrame_Navigated);
 
    Popup popup = new Popup();
    BuyNowUserControl content = new BuyNowUserControl(popup);
    // set the width of the popup to the width of the screen
    content.Width = System.Windows.Application.Current.Host.Content.ActualWidth;
    popup.Child = content;
    popup.VerticalOffset = 300;
    popup.IsOpen = true;
}


step5:接下来我们添加CheckTrialState()方法,主要用来检查当前应用是否为试用版,我们首先在DetermineIsTrial()方法中刷新IsTrial属性,如果不是完整版的话就通过调用CheckTrialPeriodExpired()方法检测一下当前的试用版是否已经过期
private void CheckTrialState()
{
    // refresh the value of the IsTrial property 
    this.DetermineIsTrial();
 
    if (!IsTrial)
    {
        // do not execute further if app is full version
        return;
    }
 
    this.CheckTrialPeriodExpired();
}

// Use static property for caching and easy access to the trial state
public static bool IsTrial
{
    get;
    // setting the IsTrial property from outside is not allowed
    private set;
}
 
private void DetermineIsTrial()
{
#if TRIAL
    // return true if debugging with trial enabled (DebugTrial configuration is active)
    IsTrial = true;
#else
    var license = new Microsoft.Phone.Marketplace.LicenseInformation();
    IsTrial = license.IsTrial();
#endif
}

step6:在 Application_Launching事件处理中添加以下代码:

private void Application_Launching(object sender, LaunchingEventArgs e)
{
    this.CheckTrialState();
}

step7:在Application_Activated事件处理中添加以下代码:

private void Application_Activated(object sender, ActivatedEventArgs e)
{
    this.CheckTrialState();
}

step8: 运行一下吧!

注意:请选择DebugTrial的生成配置,至于DebugTrial的生成配置是什么玩意,请参考此系列的第一篇文章


为了模拟出真实的试用版体验,请按照如下的步骤进行:
1,运行程序
2,按Home按钮
3,按Back按钮

下图就是我们要的结果:

特别注意: 当你测试你的试用版程序时(此程序还未通过Marketplace的审核),你必须设定一个可用的验证符(就是WP7应用的唯一卖场ID)
笔者自己的话:但是如果你的应用是准备发布到Marketplace的话,你必须去除 task.ContentIdentifier的赋值,否则确认购买就是跳到别人的应用确认购买界面了,到时候你就哭吧 : (

所以请格外注意以下的代码:

MarketplaceDetailTask task = new MarketplaceDetailTask();
task.ContentType = MarketplaceContentType.Applications;
task.ContentIdentifier = "82a23635-5bd9-df11-a844-00237de2db9e";
task.Show();




好了下面该放出大家最关心的源码下载了:-)

WP7TrialAppAdvanced

希望这个系列文章对大家有帮助!
加载中
返回顶部
顶部