Appstore SDK发行说明
Appstore SDK发行说明
Appstore SDK包含多种功能,包括应用内购买 (IAP)、数字版权管理 (DRM) 和简单登录 (SSI)。
提示: 此页面仅包含Appstore SDK中所含功能的发行说明。有关Appstore SDK中未包含的IAP功能的相关发行说明,请参阅
应用内购买发行说明。
| 日期 |
描述 |
| 2025年8月12日 |
Appstore SDK: 已发行版本3.0.8。更新了Appstore SDK通信渠道,使其符合最新的Android签名要求。 |
| 2025年4月7日 |
Appstore SDK: 已发行版本3.0.7:
- 现在,调用
getUserData() 会检索用户居住国的国家/地区代码。有关详细信息,请参阅获取用户信息。
- 使用
modifySubscription() 方法实现分级订阅。重要须知: 分级订阅功能仅面向部分合作伙伴开放。
|
| 2024年12月18日 |
Appstore SDK: 已发行版本3.0.6。在快速订阅中一键创建账户不再需要与Login with Amazon集成。有关详细信息,请参阅设置快速订阅。 |
| 2024年11月4日 |
Appstore SDK: 将示例应用构建脚本更新为AGP和Gradle的最新稳定版本,以支持JDK 21。示例应用已准备就绪,无需进行其他更改即可使用。 |
| 2023年12月4日 |
Appstore SDK: 发布了版本3.0.5。添加了对快速订阅中一键创建账户的支持。 |
| 2023年3月13日 |
Appstore SDK: 版本3.0.4已发布,具有以下功能。
- 待定购买。可以通过Amazon Kids体验发起待定购买。儿童可以提出购买请求,然后由父母在自己的设备上异步进行审查和批准。文档。
- 简单登录。利用简单登录 (SSI),客户在多台设备上登录应用时不用再记住并手动键入登录凭证,简化了Fire OS设备上应用的登录体验。文档。
|
| 2022年6月30日 |
添加了促销定价功能。
Appstore SDK: 发布了版本3.0.3。在getProductData调用中,如果客户有资格享受促销,开发者就可以获取促销详情。文档。 |
| 2022年5月23日 |
Appstore SDK: 对Appstore SDK随附的IAP示例应用的改进。IAP示例应用现已开箱即用,无需开发者进行更改。为兼容Android Studio,已更改示例应用的项目结构。MySku.java文件已更新,因此可以在市场级别设置SKU不可用。修复了示例应用源代码中的拼写错误和注释。
受影响的示例应用: SampleIAPConsumablesApp、SampleIAPEntitlementsApp和SampleIAPSubscriptionsApp。
下载最新Appstore SDK,获取示例应用。 |
| 2021年10月18日 |
Appstore SDK: Appstore SDK提供了在Java Android应用中处理数字版权管理 (DRM) 和应用内购买 (IAP) 的功能。Appstore SDK支持面向Fire TV、Fire平板电脑以及可安装亚马逊应用的第三方设备的应用。
Appstore SDK将替换以前的SDK,即IAP v2.0。对于提交到亚马逊应用商店的所有新应用,请使用Appstore SDK。对于所有现有应用,可以继续使用IAP v2.0,也可将其转换至新的Appstore SDK。
在文档中更详细地了解Appstore SDK:
转换 | 集成 | 下载
|
Last updated: 2025年8月12日
").insertBefore(this);
}
});
});
$(document).ready(function() {
if ($("#jumpoffset").length) {
var scrollhash = document.getElementById('jumpoffset');
scrollhash.scrollIntoView(true);
if (location.hash) {
location.href = location.hash;
} else {
var scrollbody = document.querySelector('.mainColumn');
scrollbody.scrollIntoView(true);
window.scroll(0, -500);
}
}
});
$(document).ready(function() {
if ($("#jump").length) {
var scrollold = document.getElementById('jump');
scrollold.scrollIntoView(true);
window.scroll(0, -100);
if (location.hash) {
location.href = location.hash;
}
}
});
//resize container on local builds
$(document).ready(function() {
if (window.location.href.indexOf("/127.0.0.1:4000/") > -1) {
document.querySelector('.container-fluid').style.position = 'fixed';
}
});
//add underline to headers
$(document).ready(function() {
if ($(".productTitle").is(':contains("Alexa Skills Kit")')) {
$(".dppnItem a").each(function() {
if ($(this).is(':contains("Alexa Skills Kit")')) {
$(this).css("border-bottom", "1.3px solid #FFFFFF");
}
});
}
if ($(".productTitle").is(':contains("Alexa Presentation Language (APL)")')) {
$(".dppnItem a").each(function() {
if ($(this).is(':contains("Alexa Skills Kit")')) {
$(this).css("border-bottom", "1.3px solid #FFFFFF");
}
});
}
if ($(".productTitle").is(':contains("Alexa Connect Kit")')) {
$(".dppnItem a").each(function() {
if ($(this).is(':contains("Alexa Connect Kit")')) {
$(this).css("border-bottom", "1.3px solid #FFFFFF");
}
});
}
if ($(".productTitle").is(':contains("A/B Testing")')) {
$(".dppnItem a").each(function() {
if ($(this).is(':contains("Alexa Skills Kit")')) {
$(this).css("border-bottom", "1.3px solid #FFFFFF");
}
});
}
if ($(".productTitle").is(':contains("Alexa Smart Properties")')) {
$(".dppnItem a").each(function() {
if ($(this).is(':contains("Alexa Smart Properties")')) {
$(this).css("border-bottom", "1.3px solid #FFFFFF");
}
});
}
if ($(".productTitle").is(':contains("Alexa Conversations Developer Guide")')) {
$(".dppnItem a").each(function() {
if ($(this).is(':contains("Alexa Skills Kit")')) {
$(this).css("border-bottom", "1.3px solid #FFFFFF");
}
});
}
if ($(".productTitle").is(':contains("Alexa Design Guide")')) {
$(".dppnItem a").each(function() {
if ($(this).is(':contains("Alexa Design Guide")')) {
$(this).css("border-bottom", "1.3px solid #FFFFFF");
}
});
$(".dppnItem a").each(function() {
if ($(this).is(':contains("Alexa Design Guide")')) {
$(this).css("padding", "0");
}
});
}
if ($(".productTitle").is(':contains("Alexa Gadgets Toolkit")')) {
$(".dppnItem a").each(function() {
if ($(this).is(':contains("Alexa Gadgets Toolkit")')) {
$(this).css("border-bottom", "1.3px solid #FFFFFF");
}
});
$(".dppnItem a").each(function() {
if ($(this).is(':contains("Alexa Gadgets Toolkit")')) {
$(this).css("padding", "0");
}
});
}
if ($(".productTitle").is(':contains("Alexa Voice Service")')) {
$(".dppnItem a").each(function() {
if ($(this).is(':contains("Alexa Voice Service")')) {
$(this).css("border-bottom", "1.3px solid #FFFFFF");
}
});
}
if ($("h1").is(':contains("Alexa Reference Content")')) {
$(".dppnItem a").each(function() {
if ($(this).is(':contains("Reference")')) {
$(this).css("border-bottom", "1.3px solid #FFFFFF");
}
});
}
if ($("h1").is(':contains("Alexa Videos")')) {
$(".dppnItem a").each(function() {
if ($(this).is(':contains("Videos")')) {
$(this).css("border-bottom", "1.3px solid #FFFFFF");
}
});
}
if ($("h1").is(':contains("Alexa Code Samples")')) {
$(".dppnItem a").each(function() {
if ($(this).is(':contains("Code Samples")')) {
$(this).css("border-bottom", "1.3px solid #FFFFFF");
}
});
}
if ($("h1").is(':contains("Documentation Home")')) {
$(".dppnItem a").each(function() {
if ($(this).is(':contains("Home")')) {
$(this).css("border-bottom", "1.3px solid #FFFFFF");
}
});
}
});
$(document).ready(function () {
const myScrollspy = $("#myScrollspy");
if (myScrollspy.length) {
const containsList2orList3 = myScrollspy.find(".list2, .list3").length > 0;
if (containsList2orList3) {
myScrollspy.css("display", "block");
$(".fa.fa-info-circle").show();
} else {
myScrollspy.css("display", "none");
$(".fa.fa-info-circle").hide();
}
}
});
/**
* This function moves the 'page-not-translated' section from its original position
* to a new position after the 'atd-categories-header' and ensures it is displayed
* only in the new location. This is achieved by hiding the section initially,
* moving it, and then displaying it again once it is in the correct position.
*/
$(document).ready(function() {
const $pageNotTranslatedMessage = $('#page-not-translated');
const $desktopCategoriesHeader = $('.navigation-header.atd-categories-header');
const $mobileToggleHeader = $('.mobile-toggle');
if ($pageNotTranslatedMessage.length) {
if ($mobileToggleHeader.length) {
$pageNotTranslatedMessage.insertAfter($mobileToggleHeader);
} else if ($desktopCategoriesHeader.length) {
$pageNotTranslatedMessage.insertAfter($desktopCategoriesHeader);
}
$pageNotTranslatedMessage.show();
}
});
// Function to handle smooth scrolling to target elements when links are clicked
$(document).ready(function () {
$('.customspy a, .mainColumn a').on('click', function (event) {
const targetId = $(this).attr('href');
if (targetId && targetId.startsWith('#')) {
event.preventDefault();
const targetElement = document.querySelector(`[id="${targetId.replace('#', '')}"]`);
if (targetElement) {
const hash = targetId.substring(1);
window.history.pushState(null, '', `#${hash}`);
targetElement.scrollIntoView(true);
window.scroll(0, -500);
}
}
});
});
window.addEventListener('DOMContentLoaded', function () {
const targetId = window.location.hash;
if (targetId) {
const targetElement = document.querySelector(targetId);
if (targetElement) {
setTimeout(() => {
targetElement.scrollIntoView(true);
window.scrollBy(0, -500);
}, 10);
}
}
});
function activateContentBasedOnHash() {
const currentHash = window.location.hash.substring(1);
if (currentHash) {
const contentElement = document.getElementById(currentHash);
if (contentElement) {
activateTabAndContent(contentElement);
}
}
}
function activateTabAndContent(contentElement) {
const tabSection = contentElement.closest('.tab-pane');
if (tabSection) {
const parentTabLink = document.querySelector(`a[href='#${tabSection.id}']`);
if (parentTabLink) {
const parentNavTabs = parentTabLink.closest('.nav-tabs');
if (parentNavTabs) {
parentNavTabs.querySelectorAll('.nav-link').forEach(link => {
link.classList.remove('active', 'show');
});
parentTabLink.classList.add('active', 'show');
}
const parentTabContent = tabSection.closest('.tab-content');
if (parentTabContent) {
parentTabContent.querySelectorAll('.tab-pane').forEach(tab => {
tab.classList.remove('active', 'show');
});
tabSection.classList.add('active', 'show');
}
}
}
}
function scrollToHashWithOffset() {
const tabHash = window.location.hash;
const targetTabLink = document.querySelector(`.nav-tabs a[href="${tabHash}"]`);
const mainContentColumn = document.querySelector('.inline');
if (targetTabLink && mainContentColumn) {
const totalHeaderHeight = getTotalHeaderHeight() + 40;
targetTabLink.scrollIntoView({behavior: 'smooth', block: 'start'});
setTimeout(() => {
mainContentColumn.scrollBy(0, -totalHeaderHeight);
}, 20);
}
}
function getTotalHeaderHeight() {
return [...document.querySelectorAll('.atd-services-header, .atd-categories-header')]
.reduce((total, header) => total + (header ? header.offsetHeight : 0), 0);
}
function handleClick(event) {
event.preventDefault();
const link = event.currentTarget;
const hash = link.getAttribute('href').substring(1);
const contentElement = document.getElementById(hash);
if (contentElement) {
activateTabAndContent(contentElement);
scrollToHashWithOffset();
}
}
function handleBackToTopClick(event) {
event.preventDefault();
const mainContentColumn = document.querySelector('.inline');
if (mainContentColumn) {
mainContentColumn.scrollTo({top: 0, behavior: 'smooth'});
}
window.scrollTo({top: 0, behavior: 'smooth'});
}
document.addEventListener('DOMContentLoaded', () => {
activateContentBasedOnHash();
scrollToHashWithOffset();
const myScrollspy = document.getElementById('myScrollspy');
if (myScrollspy) {
myScrollspy.querySelectorAll('a[href^="#"]').forEach(link => {
link.addEventListener('click', handleClick);
});
}
document.querySelectorAll('.dpfBackToTopLink, .backToTop').forEach(link => {
link.addEventListener('click', handleBackToTopClick);
});
});
// Show tab link as selected when clicked
$(document).ready(function() {
$('.nav-tabs > li > a').on('click', function(e) {
e.preventDefault();
$(this).tab('show');
$(this).addClass('active show');
});
});
// Fix for when version dropdown is on the same page as nav tab dropdown
// closes other dropdown menu to avoid overlap/usability issues
$(document).ready(function() {
// Version selector dropdown
$('.versionsButton').click(function(e) {
// Close the nav tab dropdown if open
$('.nav-link.dropdown-toggle').siblings('.dropdown-menu').removeClass('show');
});
// Nav tab selector dropdown
$('.nav-link.dropdown-toggle').click(function(e) {
// Close the version dropdown if open
$('.versionsButton').siblings('.dropdown-menu').removeClass('show');
});
});
// Handle active state management for dropdown menu in nav-tabs
// Fixes edge case issues for when version selector dropdown and
// nav-tab dropdown appear on the same page
$(document).ready(function() {
// Function to deactivate all tab panes and reset dropdown items
function deactivateAllTabs() {
$('.position .nav-item.dropdown .dropdown-menu .dropdown-item').each(function() {
const targetId = $(this).attr('href');
$(targetId).removeClass('active show');
$(this).removeClass('active show');
});
}
// Store the original pushState function
const originalPushState = history.pushState;
// Create a custom event for pushState
const pushStateEvent = new Event('pushState');
// Override pushState
history.pushState = function() {
originalPushState.apply(this, arguments);
// Dispatch the custom event
window.dispatchEvent(pushStateEvent);
};
// Add pushState listener
window.addEventListener('pushState', function() {
const params = new URLSearchParams(window.location.search);
const vValue = params.get('v');
// Handle query parameter change from version selector
if (vValue) {
// Remove active classes from all tabs
deactivateAllTabs();
$('.position').each(function() {
var firstTabPane = $(this).find('.tab-pane').first();
if (firstTabPane.length > 0) {
var tabId = firstTabPane.attr('id');
var dropdownItem = $('.dropdown-menu .dropdown-item[href="#' + tabId + '"]');
// Make first tab in each version active
dropdownItem.addClass('active show');
firstTabPane.addClass('active show');
}
});
}
});
// Handle dropdown item clicks
$('.position .nav-item.dropdown .dropdown-menu .dropdown-item').click(function(e) {
e.preventDefault();
// Remove active classes from all tabs
deactivateAllTabs();
// Add active class to clicked item
$(this).addClass('active show');
// Show corresponding tab content
const targetId = $(this).attr('href');
$(targetId).addClass('active show');
});
// Handle initial load from URL hash
if (window.location.hash) {
const tabId = window.location.hash;
if ($(tabId).length) {
// Deactivate all tabs first
deactivateAllTabs();
// Activate the correct tab and content
$(`.position .nav-item.dropdown .dropdown-menu .dropdown-item[href="${tabId}"]`).addClass('active show');
$(tabId).addClass('active show');
}
}
});
// Fix issue when anchor linking into a tab with a dropdown menu
$(document).ready(function() {
// Handle initial load from URL hash
if (window.location.hash) {
const tabId = window.location.hash;
if ($(tabId).length) {
// Deactivate active links in dropdown
$('.nav-item.dropdown .dropdown-menu .dropdown-item').each(function() {
$(this).removeClass('active show');
});
}
}
});
// Remove show class from caption elements to preserve table-caption display
// (fixes issue where the show class, which forces the display style to block,
// caused the table caption to appear inside the table, rather than above it)
$(document).ready(function() {
if (window.location.hash) {
const anchorId = window.location.hash.substring(1);
const targetElement = document.getElementById(anchorId);
if (targetElement) {
const captionParent = $(targetElement).closest('caption');
if (captionParent.length) {
captionParent.removeClass('show');
}
}
}
});