Android 高级应用程序每月或每年订阅

Posted

技术标签:

【中文标题】Android 高级应用程序每月或每年订阅【英文标题】:Android premium App monthly or yearly Subscriptions 【发布时间】:2017-02-07 10:33:53 【问题描述】:

我正在制作一个应用程序,在使用该应用程序 20 次后,用户将在初始屏幕上停止并显示文本“演示版已结束”,然后弹出一个按钮“购买应用程序”。单击该按钮后,将出现一个新页面,显示每月或每年。 示例: 如果用户想要订阅一个月,则在付款后(使用任何支付网关)应用程序将从当前日期运行到接下来的 30 天(一个月)。在相同的程序之后。我需要的是从我的应用程序中的当前日期通过代码维护这 30 天。 30 天有效期结束后,显示相同的短信“购买您的订阅”。 谢谢。

【问题讨论】:

展示你自己做了什么,阅读了一些东西等等。不要只是请求解决方案。 做一些工作,当你有问题在这里问。 我已经完成了我的应用程序的所有编码。现在我想在我可以维护应用程序的地方实现这种代码。对于一个月的示例当我购买一个月订阅时,计数器设置为 30 天后设置为 30 天,如果用户购买了 1 年,它将显示购买订阅的消息计数器将从当前日期设置为 365 天。我想要类似的东西,先生,我很困惑如何使用它。谢谢你 我不使用计数器,而是存储一个到期日期。只需在应用启动时比较该日期即可。如果到期,则显示一个对话框(只有 OK 按钮),然后在单击该按钮时完成应用程序。简单。 不要从应用程序中进行操作,应用程序端解决方案很容易受到攻击,如果用户清除数据或重新安装应用程序,他/她将失去订阅功能,而是将其保存在服务器上边。如果您使用的是谷歌应用内购买,它有自己的订阅模块,您可以直接使用。 【参考方案1】:

您可以在 sharedPreferences 中保留一个计数器,该计数器将在每次后续启动时递增 1。设置条件以在每次应用启动时检查计数器的值并将您的逻辑写入其中。

SharedPreferences sharedPreferences;

     sharedPreferences = getSharedPreferences(sharedPreferencesName, 0);

     if(sharedPreferences.getString("firstDate","").equals(null)||sharedPreferences.getString("firstDate","").equalsIgnoreCase("")) 
               sharedPreferences.edit().putString("firstDate",getCurrentDate()).commit();
            else
                  compareDates()  
            
    

要比较日期逻辑,请访问https://www.tutorialspoint.com/java/util/date_compareto.htm

【讨论】:

是的,但是每次启动应用程序时都会运行计数器,先生需要的是“天”,例如从当前日期到接下来的 30 天。谢谢 您可以在首次启动时将日期存储在 sharedPrefereces 中。然后在每次后续发布时将此日期与第一个数据进行比较,并相应地编写您的逻辑。 先生,你能不能给我这样的逻辑,这将是一个很大的帮助。【参考方案2】:

使用类似的东西

创建此方法以将所需数据存储在共享首选项中

private void setSubscription() 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putBoolean(SUBSCRIBED, true);
    editor.commit();


private boolean getSubscription(boolean defaultValue) 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    return prefs.getBoolean(SUBSCRIBED, defaultValue);


private String getSubscriptionDate() 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    return prefs.getString(SUBSCRIBED_DATE, "");


private void setSubscriptionDate(String strDate) 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(SUBSCRIBED_DATE, strDate);
    editor.commit();


private int getCounter() 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    return prefs.getInt(COUNTER, 0);


private void setCounter(int count) 

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putInt(COUNTER, count);
    editor.commit();



private void setOneMonthSubscription() 
    Date date = new Date();

    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.add(Calendar.DATE, 30); // add 30 days

    date = cal.getTime();

    setSubscriptionDate(String.valueOf(date));


private void setOneYearSubscription() 
    Date date = new Date();

    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.add(Calendar.DATE, 365); // add 365 days

    date = cal.getTime();

    setSubscriptionDate(String.valueOf(date));

使用 OnCreate 的 Activity 或根据需要尝试此逻辑

if(getCounter() == 0) 
        int counter  = getCounter();
        counter++;
        setCounter(counter);

        //this is first time loaded

     else 

        if(getCounter() >= 20) 

            //reached to 20

            if(getSubscription(false)) 

                Date date;
                //user subscribed
                DateFormat dateFormat = new SimpleDateFormat();

                try 
                    date = dateFormat.parse(getSubscriptionDate());
                 catch (ParseException e) 
                    e.printStackTrace();
                    date = new Date();
                

                //Check if Subscription End or not
                if(date.getTime() < new Date().getTime()) 
                    //user subscription ends
                    //make counter to 0
                    setCounter(0);
                    //make subscription date to empty
                    setSubscriptionDate("");

                 else 
                    //allow user because subscribed
                


             else 

                //means user not subscribed yet show please subscription message

            
         else 
            int counter = getCounter();

            counter++;

            setCounter(counter);
            //allow user because it not reached to 20th times

        

    

你需要这个会员

private final String SUBSCRIBED = "subscribed";
private final String SUBSCRIBED_DATE = "subscribed_date";
private final String COUNTER = "counter";

【讨论】:

这只是通过和活动。更好的解决方案是在服务器端保存数据,因为如果用户卸载应用程序,那么用户将再次获得 20 天的使用时间。 实际上应用程序是这样的,它不能一直与服务器连接......只有当用户购买订阅时。 好的,那么上面的逻辑是有道理的。

以上是关于Android 高级应用程序每月或每年订阅的主要内容,如果未能解决你的问题,请参考以下文章

用于设置每月订阅的架构

在 Android 中检查应用内订阅的状态

如何在应用订阅android中使用按比例分配模式

报告以列出新老用户的每日、每月或每年访问

处理“终身”订阅以及自动续订应用内购买

苹果会强迫您通过Apple Pay进行应用内购买和订阅吗?