renpy/doc/iap.html
2023-01-18 23:13:55 +01:00

364 lines
22 KiB
HTML

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>In-App Purchasing &#8212; Ren&#39;Py Documentation</title>
<link rel="stylesheet" href="_static/renpydoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/bootstrap-3.3.6/css/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="_static/bootstrap-3.3.6/css/bootstrap-theme.min.css" />
<link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="_static/js/jquery-fix.js"></script>
<script type="text/javascript" src="_static/bootstrap-3.3.6/js/bootstrap.min.js"></script>
<script type="text/javascript" src="_static/bootstrap-sphinx.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Gestures" href="gesture.html" />
<link rel="prev" title="iOS" href="ios.html" />
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1'>
<meta name="apple-mobile-web-app-capable" content="yes">
</head><body>
<div id="navbar" class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<!-- .btn-navbar is used as the toggle for collapsed navbar content -->
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.html">
Ren&#39;Py Documentation</a>
<span class="navbar-text navbar-version pull-left"><b>7.5.3</b></span>
</div>
<div class="collapse navbar-collapse nav-collapse">
<ul class="nav navbar-nav">
<li><a href="https://www.renpy.org">Home Page</a></li>
<li><a href="https://www.renpy.org/doc/html/">Online Documentation</a></li>
<li class="dropdown globaltoc-container">
<a role="button"
id="dLabelGlobalToc"
data-toggle="dropdown"
data-target="#"
href="index.html">Site <b class="caret"></b></a>
<ul class="dropdown-menu globaltoc"
role="menu"
aria-labelledby="dLabelGlobalToc"><ul>
<li class="toctree-l1"><a class="reference internal" href="quickstart.html">Quickstart</a></li>
<li class="toctree-l1"><a class="reference internal" href="gui.html">GUI Customization Guide</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="language_basics.html">Language Basics</a></li>
<li class="toctree-l1"><a class="reference internal" href="label.html">Labels &amp; Control Flow</a></li>
<li class="toctree-l1"><a class="reference internal" href="dialogue.html">Dialogue and Narration</a></li>
<li class="toctree-l1"><a class="reference internal" href="displaying_images.html">Displaying Images</a></li>
<li class="toctree-l1"><a class="reference internal" href="menus.html">In-Game Menus</a></li>
<li class="toctree-l1"><a class="reference internal" href="python.html">Python Statements</a></li>
<li class="toctree-l1"><a class="reference internal" href="conditional.html">Conditional Statements</a></li>
<li class="toctree-l1"><a class="reference internal" href="audio.html">Audio</a></li>
<li class="toctree-l1"><a class="reference internal" href="movie.html">Movie</a></li>
<li class="toctree-l1"><a class="reference internal" href="voice.html">Voice</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="text.html">Text</a></li>
<li class="toctree-l1"><a class="reference internal" href="translation.html">Translation</a></li>
<li class="toctree-l1"><a class="reference internal" href="displayables.html">Displayables</a></li>
<li class="toctree-l1"><a class="reference internal" href="transforms.html">Transforms</a></li>
<li class="toctree-l1"><a class="reference internal" href="transitions.html">Transitions</a></li>
<li class="toctree-l1"><a class="reference internal" href="atl.html">Animation and Transformation Language</a></li>
<li class="toctree-l1"><a class="reference internal" href="matrixcolor.html">Matrixcolor</a></li>
<li class="toctree-l1"><a class="reference internal" href="layeredimage.html">Layered Images</a></li>
<li class="toctree-l1"><a class="reference internal" href="3dstage.html">3D Stage</a></li>
<li class="toctree-l1"><a class="reference internal" href="live2d.html">Live2D Cubism</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="style.html">Styles</a></li>
<li class="toctree-l1"><a class="reference internal" href="style_properties.html">Style Properties</a></li>
<li class="toctree-l1"><a class="reference internal" href="screens.html">Screens and Screen Language</a></li>
<li class="toctree-l1"><a class="reference internal" href="screen_actions.html">Screen Actions, Values, and Functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="screen_special.html">Special Screen Names</a></li>
<li class="toctree-l1"><a class="reference internal" href="screen_optimization.html">Screen Language Optimization</a></li>
<li class="toctree-l1"><a class="reference internal" href="config.html">Configuration Variables</a></li>
<li class="toctree-l1"><a class="reference internal" href="preferences.html">Preference Variables</a></li>
<li class="toctree-l1"><a class="reference internal" href="store_variables.html">Store Variables</a></li>
<li class="toctree-l1"><a class="reference internal" href="mouse.html">Custom Mouse Cursors</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="launcher.html">Launcher</a></li>
<li class="toctree-l1"><a class="reference internal" href="developer_tools.html">Developer Tools</a></li>
<li class="toctree-l1"><a class="reference internal" href="director.html">Interactive Director</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="nvl_mode.html">NVL-Mode Tutorial</a></li>
<li class="toctree-l1"><a class="reference internal" href="input.html">Text Input</a></li>
<li class="toctree-l1"><a class="reference internal" href="side_image.html">Side Images</a></li>
<li class="toctree-l1"><a class="reference internal" href="rooms.html">Image Gallery, Music Room, and Replay Actions</a></li>
<li class="toctree-l1"><a class="reference internal" href="drag_drop.html">Drag and Drop</a></li>
<li class="toctree-l1"><a class="reference internal" href="sprites.html">Sprites</a></li>
<li class="toctree-l1"><a class="reference internal" href="keymap.html">Customizing the Keymap</a></li>
<li class="toctree-l1"><a class="reference internal" href="achievement.html">Achievements</a></li>
<li class="toctree-l1"><a class="reference internal" href="history.html">Dialogue History</a></li>
<li class="toctree-l1"><a class="reference internal" href="multiple.html">Multiple Character Dialogue</a></li>
<li class="toctree-l1"><a class="reference internal" href="splashscreen_presplash.html">Splashscreen and Presplash</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="statement_equivalents.html">Statement Equivalents</a></li>
<li class="toctree-l1"><a class="reference internal" href="save_load_rollback.html">Saving, Loading, and Rollback</a></li>
<li class="toctree-l1"><a class="reference internal" href="persistent.html">Persistent Data</a></li>
<li class="toctree-l1"><a class="reference internal" href="trans_trans_python.html">Transforms and Transitions in Python</a></li>
<li class="toctree-l1"><a class="reference internal" href="gui_advanced.html">Advanced GUI</a></li>
<li class="toctree-l1"><a class="reference internal" href="screen_python.html">Screens and Python</a></li>
<li class="toctree-l1"><a class="reference internal" href="modes.html">Modes</a></li>
<li class="toctree-l1"><a class="reference internal" href="cdd.html">Creator-Defined Displayables</a></li>
<li class="toctree-l1"><a class="reference internal" href="cds.html">Creator-Defined Statements</a></li>
<li class="toctree-l1"><a class="reference internal" href="custom_text_tags.html">Custom Text Tags</a></li>
<li class="toctree-l1"><a class="reference internal" href="character_callbacks.html">Character Callbacks</a></li>
<li class="toctree-l1"><a class="reference internal" href="file_python.html">File Access</a></li>
<li class="toctree-l1"><a class="reference internal" href="color_class.html">Color Class</a></li>
<li class="toctree-l1"><a class="reference internal" href="matrix.html">Matrix</a></li>
<li class="toctree-l1"><a class="reference internal" href="model.html">Model-Based Rendering</a></li>
<li class="toctree-l1"><a class="reference internal" href="other.html">Other Functions and Variables</a></li>
</ul>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="build.html">Building Distributions</a></li>
<li class="toctree-l1"><a class="reference internal" href="updater.html">Web Updater</a></li>
<li class="toctree-l1"><a class="reference internal" href="android.html">Android</a></li>
<li class="toctree-l1"><a class="reference internal" href="chromeos.html">Chrome OS/Chromebook</a></li>
<li class="toctree-l1"><a class="reference internal" href="ios.html">iOS</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">In-App Purchasing</a></li>
<li class="toctree-l1"><a class="reference internal" href="gesture.html">Gestures</a></li>
<li class="toctree-l1"><a class="reference internal" href="raspi.html">Raspberry Pi</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="security.html">Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="problems.html">Dealing with Problems</a></li>
<li class="toctree-l1"><a class="reference internal" href="environment_variables.html">Environment Variables</a></li>
<li class="toctree-l1"><a class="reference internal" href="self_voicing.html">Self-Voicing</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="editor.html">Text Editor Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="skins.html">Skins</a></li>
<li class="toctree-l1"><a class="reference internal" href="translating_renpy.html">Translating Ren'Py</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="changelog.html">Changelog (Ren'Py 7.x-)</a></li>
<li class="toctree-l1"><a class="reference internal" href="changelog6.html">Changelog (Ren'Py 6.11 - 6.99)</a></li>
<li class="toctree-l1"><a class="reference internal" href="incompatible.html">Incompatible Changes</a></li>
<li class="toctree-l1"><a class="reference internal" href="distributor.html">Distributor Notes</a></li>
<li class="toctree-l1"><a class="reference internal" href="license.html">License</a></li>
<li class="toctree-l1"><a class="reference internal" href="credits.html">Credits</a></li>
<li class="toctree-l1"><a class="reference internal" href="sponsors.html">Ren'Py Development Sponsors</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="thequestion.html">Script of The Question</a></li>
<li class="toctree-l1"><a class="reference internal" href="thequestion_nvl.html">NVL-mode script for The Question</a></li>
</ul>
</ul>
</li>
</ul>
<form class="navbar-form navbar-right" action="search.html" method="get">
<div class="form-group">
<input type="text" name="q" class="form-control" placeholder="Search" />
</div>
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-3">
<div id="sidebar" class="bs-sidenav" role="complementary"><ul>
<li><a class="reference internal" href="#">In-App Purchasing</a><ul>
<li><a class="reference internal" href="#iap-functions">IAP Functions</a></li>
<li><a class="reference internal" href="#iap-actions">IAP Actions</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="col-md-9 content">
<div class="section" id="in-app-purchasing">
<h1>In-App Purchasing<a class="headerlink" href="#in-app-purchasing" title="Permalink to this headline"> link</a></h1>
<p>Ren'Py includes a high-level in-app purchasing framework. This framework
currently only supports unlock-style purchases from the Apple App Store,
Google Play, and the Amazon Appstore.</p>
<p>Using this framework is fairly simple, and consists of the following
functions.</p>
<ul class="simple">
<li>In the init phase of your game, register available purchases using the
<a class="reference internal" href="#iap.register" title="iap.register"><code class="xref py py-func docutils literal notranslate"><span class="pre">iap.register()</span></code></a> function.</li>
<li>Once the game has started, check to see if a purchase has been purchased
using the <a class="reference internal" href="#iap.has_purchased" title="iap.has_purchased"><code class="xref py py-func docutils literal notranslate"><span class="pre">iap.has_purchased()</span></code></a> function.</li>
<li>Allow the user to purchase an item using the <a class="reference internal" href="#iap.purchase" title="iap.purchase"><code class="xref py py-func docutils literal notranslate"><span class="pre">iap.purchase()</span></code></a> function
or the <a class="reference internal" href="#iap.Purchase" title="iap.Purchase"><code class="xref py py-func docutils literal notranslate"><span class="pre">iap.Purchase()</span></code></a> action.</li>
<li>Allow the user to restore purchases bought on other devices using the
<a class="reference internal" href="#iap.restore" title="iap.restore"><code class="xref py py-func docutils literal notranslate"><span class="pre">iap.restore()</span></code></a> function or the <a class="reference internal" href="#iap.Restore" title="iap.Restore"><code class="xref py py-func docutils literal notranslate"><span class="pre">iap.Restore()</span></code></a> action.</li>
</ul>
<p>To offer in-app purchases, the purchases (including an associated price)
must be set up on the various marketplaces.</p>
<div class="section" id="iap-functions">
<h2>IAP Functions<a class="headerlink" href="#iap-functions" title="Permalink to this headline"> link</a></h2>
<dl class="function">
<dt id="iap.get_price">
<code class="descclassname">iap.</code><code class="descname">get_price</code><span class="sig-paren">(</span><em>product</em><span class="sig-paren">)</span><a class="headerlink" href="#iap.get_price" title="Permalink to this definition"> link</a></dt>
<dd><p>Returns a string giving the price of the <cite>product</cite> in the user's
local currency. Returns None if the price of the product is unknown -
which indicates the product cannot be purchased.</p>
</dd></dl>
<dl class="function">
<dt id="iap.get_store_name">
<code class="descclassname">iap.</code><code class="descname">get_store_name</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#iap.get_store_name" title="Permalink to this definition"> link</a></dt>
<dd><p>Returns the name of the enabled store for in-app purchase. This
currently returns one of &quot;amazon&quot;, &quot;play&quot; (for Google Play), &quot;ios&quot;
or None if no store is available.</p>
</dd></dl>
<dl class="function">
<dt id="iap.has_purchased">
<code class="descclassname">iap.</code><code class="descname">has_purchased</code><span class="sig-paren">(</span><em>product</em><span class="sig-paren">)</span><a class="headerlink" href="#iap.has_purchased" title="Permalink to this definition"> link</a></dt>
<dd><p>Returns True if the user has purchased <cite>product</cite> in the past, and
False otherwise.</p>
</dd></dl>
<dl class="function">
<dt id="iap.init">
<code class="descclassname">iap.</code><code class="descname">init</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#iap.init" title="Permalink to this definition"> link</a></dt>
<dd><p>Initialize iap. This should be called after all calls to iap.register(),
but before any other iap function. If not called explicitly, this is
automatically called at the end of the initialization phase.</p>
</dd></dl>
<dl class="function">
<dt id="iap.is_deferred">
<code class="descclassname">iap.</code><code class="descname">is_deferred</code><span class="sig-paren">(</span><em>product</em><span class="sig-paren">)</span><a class="headerlink" href="#iap.is_deferred" title="Permalink to this definition"> link</a></dt>
<dd><p>Returns True if the user has asked to purchase <cite>product</cite>, but that
request has to be approved by a third party, such as a parent or
guardian.</p>
</dd></dl>
<dl class="function">
<dt id="iap.purchase">
<code class="descclassname">iap.</code><code class="descname">purchase</code><span class="sig-paren">(</span><em>product</em>, <em>interact=True</em><span class="sig-paren">)</span><a class="headerlink" href="#iap.purchase" title="Permalink to this definition"> link</a></dt>
<dd><p>This function requests the purchase of <cite>product</cite>.</p>
<p>It returns true if the purchase succeeds, or false if the purchase
fails. If the product has been registered as consumable, the purchase
is consumed before this call returns.</p>
</dd></dl>
<dl class="function">
<dt id="iap.register">
<code class="descclassname">iap.</code><code class="descname">register</code><span class="sig-paren">(</span><em>product</em>, <em>identifier=None</em>, <em>amazon=None</em>, <em>google=None</em>, <em>ios=None</em>, <em>consumable=False</em><span class="sig-paren">)</span><a class="headerlink" href="#iap.register" title="Permalink to this definition"> link</a></dt>
<dd><p>Registers a product with the in-app purchase system.</p>
<dl class="docutils">
<dt><cite>product</cite></dt>
<dd>A string giving the high-level name of the product. This is the
string that will be passed to <a class="reference internal" href="#iap.purchase" title="iap.purchase"><code class="xref py py-func docutils literal notranslate"><span class="pre">iap.purchase()</span></code></a>, <a class="reference internal" href="#iap.Purchase" title="iap.Purchase"><code class="xref py py-func docutils literal notranslate"><span class="pre">iap.Purchase()</span></code></a>,
and <a class="reference internal" href="#iap.has_purchased" title="iap.has_purchased"><code class="xref py py-func docutils literal notranslate"><span class="pre">iap.has_purchased()</span></code></a> to represent this product.</dd>
<dt><cite>identifier</cite></dt>
<dd><p class="first">A string that's used to identify the product internally. Once used
to represent a product, this must never change. These strings are
generally of the form &quot;com.domain.game.product&quot;.</p>
<p class="last">If None, defaults to <cite>product</cite>.</p>
</dd>
<dt><cite>amazon</cite></dt>
<dd>A string that identifies the product in the Amazon app store.
If not given, defaults to <cite>identifier</cite>.</dd>
<dt><cite>google</cite></dt>
<dd>A string that identifies the product in the Google Play store.
If not given, defaults to <cite>identifier</cite>.</dd>
<dt><cite>ios</cite></dt>
<dd>A string that identifies the product in the Apple App store for
iOS. If not given, defaults to <cite>identifier</cite>.</dd>
<dt><cite>consumable</cite></dt>
<dd>True if this is a consumable purchase. Right now, consumable purchases
are only supported on iOS.</dd>
</dl>
</dd></dl>
<dl class="function">
<dt id="iap.restore">
<code class="descclassname">iap.</code><code class="descname">restore</code><span class="sig-paren">(</span><em>interact=True</em><span class="sig-paren">)</span><a class="headerlink" href="#iap.restore" title="Permalink to this definition"> link</a></dt>
<dd><p>Contacts the app store and restores any missing purchases.</p>
<dl class="docutils">
<dt><cite>interact</cite></dt>
<dd>If True, renpy.pause will be called while waiting for the app store
to respond.</dd>
</dl>
</dd></dl>
</div>
<div class="section" id="iap-actions">
<h2>IAP Actions<a class="headerlink" href="#iap-actions" title="Permalink to this headline"> link</a></h2>
<dl class="function">
<dt id="iap.Purchase">
<code class="descclassname">iap.</code><code class="descname">Purchase</code><span class="sig-paren">(</span><em>product</em>, <em>success=None</em><span class="sig-paren">)</span><a class="headerlink" href="#iap.Purchase" title="Permalink to this definition"> link</a></dt>
<dd><p>An action that attempts the purchase of <cite>product</cite>. This action is
sensitive if and only if the product is purchasable (a store is
enabled, and the product has not already been purchased.)</p>
<dl class="docutils">
<dt><cite>success</cite></dt>
<dd>If not None, this is an action or list of actions that are run
when the purchase succeeds.</dd>
</dl>
</dd></dl>
<dl class="function">
<dt id="iap.Restore">
<code class="descclassname">iap.</code><code class="descname">Restore</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#iap.Restore" title="Permalink to this definition"> link</a></dt>
<dd><p>An Action that contacts the app store and restores any missing purchases.</p>
</dd></dl>
</div>
</div>
</div>
</div>
</div>
<footer class="footer">
<div class="container">
<p class="pull-right">
<a href="#">Back to top</a>
</p>
<p>
&copy; Copyright 2012-2022, Tom Rothamel.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.8.6.<br/>
</p>
</div>
</footer>
</body>
</html>