iap(内置付费)中,无论是交易成功还是交易失败总是多次弹出相应的android 自定义对话框框,本来应该只弹出一次的。。。。

i&应用内置付费好处多多,第一次植入问题也是多多!
开始加的时候,习惯性的上网找同行写过的经验文章参考,Apple官方文档看着就头疼,找了一篇,看似写的很完整,跟着一步一步做,结果最后request
product的时候一直返回Invalid ID!开始在iTunes Connect上折腾,传了删,删了传的辗转了好几次,各种设置调来调去,各种search结果看了又看,最后总算是搞定了,也写点自己的心得吧。
虽然我说Apple官方IAP文档,iTunes Connect开发文档看着头疼,但最后找到的一篇官方TN技术Note看着还是不错的,不是很繁琐,而且提到的点都是比较重要的,传送门:,建议第一次尝试IAP的朋友都好好看看。
首先,iTunes Connect上的部分信息一定要填写完整,并且确认Contract Type为&Paid
Applications的协议已生效,就是位于Contracts In Effect中(默认只有1个&Free
Applications生效)。这块本人的遭遇是:一开始App创建完了,发现根本没有Manage In-App Purchases选项,记得此时上面有黄色的警告提示说没有生效的iOS Paid Applications协议,然后就去request了一下,也没完成需要的3项具体信息,发现警告没了,管理选项也有了,就没再管(最后一直的Invalid Id应该就是这个原因,所以这里一定要完整处理且生效,具体可以参考上面的TN)。
其次,就是一些比较常规的事项了,像不能用带*的App ID,必须用对应的Provision等,这块纠结了很久的是第一篇教程上说一定要submit一次binary,然后立刻developer reject才能test IAP,这里我折腾过很多次,最后认为完全不需要上传,否则apple也太2了,程序还没做完,想测试还非得上传一下,这点TN里写的也很清楚,说程序没完成一定不要上传,给他们评审找事等等,blah,blah,blah,而且这里TN写了个不是很事实的东西,就是说一旦错误的上传了未完成的bin,最后不管是被apple
reject还是开发人员自己reject了,就都不能再sandbox test IAP了,必须得想办法上传一个review能过的bin,才能接着测,而事实是我现在的app一直是大红灯的developer rejected,IAP的item一直是waiting for review,照样可以测。这里可能要注意的就是iTunes Connect上的app里要勾上已经填好的IAP产品,产品本身的cleared for sale我想应该都会勾吧。顺带一提,关于submit bin的操作,网站上说要下个什么程序上传,第一篇文章里说是网页上有上传选项(这个是老版本的了估计),其实不用这么麻烦,xcode(我用的4),里直接给项目进行archive,然后在Organizer里找到刚才的归档直接submit
app store就可以了,会提示你输入iTunes Connect账号的,注意这部build一定要把release项的签名设置成dist版的,或者能让xcode自动选择到dist版证书也行!
UPDATE1:发现部分设备上依然会出现Invalid ID问题,一样的代码,一样的Provision,就是有些不行的机器,怀疑是越狱的原因……
UPDATE2:找了几部同事的机器试了试,80%是越狱的问题了,凡是有cydia的,都是Invalid ID,4.3.3系统的iphone4 touch4和ipad1均是如此,但有一个越狱的iphone4没有cydia,测试就可以正常sandbox购买。
UPDATE3:又经过了几次不同条件的测试,已确认是cydia装了AppSync导致的IAP sandbox不能问题,越狱可以、装cydia也可以,但是不能装AppSync,装了就会导致IAP沙盒测试失败,估计是影响了Provision Profile所致…
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:63753次
排名:千里之外
转载:24篇
(1)(2)(1)(2)(1)(3)(2)(2)(1)(3)(3)(2)(3)excel中的各个工作表之间切换,总是弹出这个对话框,是怎么回事?_百度知道
1、先把工作簿另存为“启用宏的Excel工作簿”,后缀为xlsm.2、“视图”=》“宏”=》“录制宏”,建立一个默认名为&macro1&的宏。3、“视图”=》“宏”=》“查看宏”,选择“macro1”,再选编辑按钮,进入microsoft visual basic编辑器。4、在编辑器左上方,“VBAProject”=》“Microsoft Excel对象”=》双击“ThisWorkbook”,进入代码编辑窗口。5、加入以下代码:Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)MsgBox &该表格无法更改,详情请咨询某某某&End Sub6、保存后即可。后续打开后缀为xlsm的文件,编辑时即提示“该表格无法更改,详情请咨询某某某”。
其他类似问题
为您推荐:
你检查一下,就是工控机控制系统报表查询定义了一个EXCEL宏(为什么要这样没搞懂,按我的想法直接做个SOL的数据表查询就可以了)仅供参考,必须先运行这个宏文件,怀疑还是宏文件造成的问题,然后以后每次运行或切换excel报表就正常了,否则老出现类似情况,然后在excel报表里点宏-执行,很久以前的事儿),选择宏文件名(具体的操作有点记不清了,在机器重装后要用EXCEL查询数据报表时:我以前遇到过类似情况
恩,我怀疑是宏文件搞的。这个文件不是我建立的,别人发我的。我非常想搞明白怎么弄的。该表中我找不到可以运行的宏。宏列表是空白的。
你只有问发给你表的人。因为宏文件没有运行,宏列表为空是正常的。
来自团队:
其他2条回答
你的工作薄中引用了其它工作薄的数据。(被引用的工作薄打开后,将出现这个提示,当这个工作薄没有打开时出现提示的原因是,等于删除了公式引用,应该是选择性粘贴了数值,再打开就不会出现提示)用复制粘贴到新工作薄,当然就不会出现提示了
不是选择性粘贴,再说了,我把所有单元格都删除了,只留工作表依然如此。我个人感觉应该是宏引起的,公式没有这种效果
如果所有工作表中没有引用,这个文档应该编写了宏,在宏中进行了其它工作薄的引用。
$固定引用符号。\r\n$A1表示固定引用A列。\r\nA$1表示固定引用1行。\r\n$A$1表示固定引用A1单元格。
excel的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁查看: 939|回复: 0
iOS应用内置付费 IAP Store Kit Guide翻译
阅读权限90
在线时间 小时
当用户需要购买某件产品时,程序调用StoreKit来收集购买信息。下图即为基本的store kit 模型:Store Kit的API只是为程序添加In App Purchase功能的一小部分。你需要决定如何去记录那些你想要提交的产品,如何在程序中将商店功能展现给用户,还要考虑如何将用户购买的产品提交。
一、In App Purchase概览Store Kit代表App和App Store之间进行通信。程序将从App Store接收那些你想要提供的产品的信息,并将它们显示出来供用户购买。当用户需要购买某件产品时,程序调用StoreKit来收集购买信息。下图即为基本的store kit 模型:Store Kit的API只是为程序添加In App Purchase功能的一小部分。你需要决定如何去记录那些你想要提交的产品,如何在程序中将商店功能展现给用户,还要考虑如何将用户购买的产品提交。本章的剩余部分会展示整个流程。Products产品可以是任意一项你想要出售的特性。产品在iTunes Connect中被组织,这和你添加一个新的App是一样的。支持的产品种类共有四种:1. 内容型。包括电子书,电子杂志,照片,插图,游戏关卡,游戏角色,和其他的数字内容。2. 扩展功能。这些功能已经包含在App内部。在未购买之前被锁定。例如,你可以在一个游戏程序中包含若干个小游戏,用户可以分别来购买这些游戏。3. 服务。允许程序对单次服务收费。比如录音服务。4. 订阅。支持对内容或服务的扩展访问。例如,你的程序可以每周提供财务信息或游戏门户网站的信息。应该设定一个合理的更新周期,以避免过于频繁的提示困扰用户。要记住:你将负责跟踪订阅的过期信息,并且管理续费。App Store不会替你监视订阅的周期,也不提供自动收费的机制。In App Purchase为创建产品提供了一种通用的机制,如何操作将由你负责。当你设计程序的时候,有以下几点需要注意:1. 你必须提供电子类产品和服务。不要使用In App Purchase 去出售实物和实际服务。2. 不能提供代表中介货币的物品,因为让用户知晓他们购买的商品和服务是很重要的。
1.png (63.35 KB, 下载次数: 2)
11:04 上传
from 服务器类型使用这终方式,要提供另外的服务器将产品发送给程序。 服务器交付适用于订阅、内容类商品和服务,因为商品可以作为数据发送,而不需改动程序束。 例如,一个游戏提供的新的内容(关卡等)。 Store Kit不会对服务器端的设计和交互做出定义,这方面工作需要你来完成。 而且,Store Kit不提供验证用户身份的机制,你需要来设计。 如果你的程序需要以上功能,例如,纪录特定用户的订阅计划, 你需要自己来设计和实现。图1-3 展示了服务器类型的购买过程。
2.png (111.35 KB, 下载次数: 2)
11:04 上传
11:04 上传
如果程序在请求期间退出,则需要重新发送请求。下面讲解请求过程中用到的类:SKRequestSKRequest为request的抽象根类。SKRequestDelegateSKRequestDelegate是一个protocol, 实现用以处理请求结果的方法,比如请求成功,或请求失败。发送获得产品信息的请求程序使用products request来获得产品的信息。 要完成这一过程,程序需创建一个request对象,其中会包含一个产品标识的列表。之前提到过,你的程序既可以内置产品列表,又可以通过外部服务器来获得。当发送请求时,产品标识会传送到App Store,App Store将会返回本地化信息(这些信息事先已经在iTunes Connect中设置好了),你将使用这些信息来购建内置商店的界面(显示商品名,描述,等等)。 图2-2显示了请求的过程。
4.png (49.76 KB, 下载次数: 2)
11:04 上传
SKProductsRequest用来请求商品的信息。 创建时,我们将需要显示的商品列表加入该对象。SKProductsRequestDelegate该protocol定义了处理App Store响应的方法。SKProductsResponseSKProductsResponse对象为App Store返回的响应信息。里面包含两个列表(当然是NSArray了):一是经过验证有效的商品,@property(nonatomic, readonly) NSArray *products另外一个是无法被识别的商品信息:@property(nonatomic, readonly) NSArray * invalidProductIdentifiers有几种原因将造成商品标识无法被识别,如拼写错误(当然),被标记为不可出售(unavailable for sale),或是对商品信息的改变没有传送到所有App Store的服务器。(这个原因不是很清楚,再议)。SKProductSKProduct对象包含了在App Store上注册的商品的本地化信息。购买商品当用户准备购买商品时,程序向App Store请求支付信息,然后App Store将会创建持久化的交易信息,并继续处理支付流程,即使用户重启程序,这个过程亦是如此。App Store同步待定交易的列表到程序中,并在交易状态发生改变时向程序发送更新的数据。收集支付信息要收集支付信息, 你的程序可以创建一个payment的对象,将它放到支付队列中,如图3-1所示。
5.png (120.93 KB, 下载次数: 2)
11:04 上传
1. 一个SKPayment的对象,包含了&Sword&的商品标识,并且制定购买数量为1。2. 使用addPayment:方法将SKPayment的对象添加到SKPaymentQueue里。3. SKPaymentmentQueue包含的所有请求商品,4. 使用SKPaymentTransactionObserver的paymentQueue: updatedTransactions: 方法来检测所有完成的购买,并发送购买的商品。5. 最后,使用finishTransaction:方法完成交易。当payment的对象被添加到支付队列中的时候, 会创建一个持久保存的transaction对象来存放它。 当支付被处理后,transaction被更新。 程序中将实现一个观察者(observer)对象来获取transaction更新的消息。 观察者应该为用户提供购买的商品,然后将transaction从队列中移除。下面介绍在购买过程中用到的几个类:SKPayment要收集支付信息,先要了解一下支付对象。 支付对象包含了商品的标识(identifier)和要购买商品的数量(quantity)(数量可选)。你可以把同一个支付对象重复放入支付队列,,每一次这样的动作都相当于一次独立的支付请求。用户可以在Settings程序中禁用购买的功能。 因此在请求支付之前,程序应该首先检查支付是否可以被处理。 调用SKPaymentQueue的canMakePayments方法来检查。SKPaymentQueue支付队列用以和App Store之间进行通信。 当新的支付对象被添加到队列中的时候, Store Kit向App Store发送请求。 Store Kit将会弹出对话框询问用户是否确定购买。 完成的交易将会返回给程序的observer对象。SKPaymentTransactiontransaction对象在每次添加新的payment到队列中的时候被创建。 transaction对象包含了一些属性,可以让程序确定当前的交易状态。程序可以从支付队列那里得到一份审核中的交易列表,但更常用的做法还是等待支付队列告知交易状态的更新。SKPaymentTransactionObserver在程序中实现SKPaymentTransactionObserver的协议,然后把它作为SKPaymentQueue对象的观察者。该观察者的主要职责是:检查完成的交易,交付购买的内容,和把完成后的交易对象从队列中移除。在程序一启动,就应该为支付队列指定对应的观察者对象,而不是等到用户想要购买商品的时候。 Transaction对象在程序退出时不会丢失。程序重启时, Store Kit继续执行未完成的交易。 在程序初始化的时候添加观察者对象,可以保证所有的交易都被程序接收(也就时说,如果有未完成的transaction,如果程序重启,就重新开始了,如 果稍候再添加观察者,就可能会漏掉部分交易的信息)。恢复交易信息(Transactions)当transaction被处理并从队列移除之后,正常情况下,程序就再也看不到它们了。 如果你的程序提供的是非消耗性的或是订阅类的商品,就必须提供restore的功能,使用户可以在其他设备上重新存储购买信息。Store Kit提供内建的功能来重新存储非消耗商品的交易信息。 调用SKPaymentQueue的restoreCompletedTransactions的方法来重新存储。对于那些之前已经完成交易的非消耗性商 品,Apple Store生成新的,用于恢复的交易信息。 它包含了原始的交易信息。你的程序可以拿到这个信息,然后继续为购买的功能解锁。 当之前所有的交易都被恢复时, 就会调用观察者对象的paymentQueueRestoreCompletedTransactionsFinished方法。如果用户试图购买已经买过的非消耗性商品,程序会收到一个常规的交易信息,而不是恢复的交易信息。但是用户不会被再次收费。程序 应把这类交易和原始的交易同等对待。订阅类服务和消耗类商品不会被Store Kit自动恢复。 要恢复这些商品,你必须在用户购买这些商品时,在你自己的服务器上记录这些交易信息, 并且为用户的设备提供恢复交易信息的机制。在程序中添加Store功能本章为添加购买功能的指导详细流程:准备工作当然是添加StoreKit.framework了。然后是具体的步骤:1. 决定在程序内出售的商品的类型。之前提到过,程序内可以出售的新feature类型是有限制的。 Store Kit不允许我们下载新的代码。 你的商品要么可以通过当前的代码工作(bundle类型),要么可以通过服务器下载(当然,这里下载的为数据文件,代码是不可以的)。 如果要修改源代码,就只能老实的升级了。2. 通过iTunes Connect注册商品每次添加新商品的时候都需要执行这一步骤。 每个商品都需要一个唯一的商品标识。 App Store通过这个标识来查找商品信息并处理支付流程。 注册商品标识的方法和注册程序的方法类似。要了解如何创建和注册商品信息,请参考“iTunes Connect Developer Guide”文档。3. 检测是否可以进行支付用户可以禁用在程序内部支付的功能。在发送支付请求之前,程序应该检查该功能是否被开启。程序可在显示商店界面之前就检查该设置(没启用就不显示商店界面了),也可以在用户发送支付请求前再检查,这样用户就可以看到可购买的商品列表了。例子:if([SKPaymentQueue canMakePayments])& &{& && & ...//Display a store to the user& &}& &else&&{& && & ...//Warn the user that purchases are disabled.& &}&&
4. 获得商品的信息程序创建SKProductsRequest对象,用想要出售的商品的标识来初始化, 然后附加上对应的委托对象。 该请求的响应包含了可用商品的本地化信息。//这里发送请求& &- (void)requestProductData& &{& && & SKProductsRequest *request = [[SKProductsRequest alloc]initWithProductIdentifiers:& && & [NSSet setWithObject: kMyFeatureIdentifier]];& && && & & & request.delegate =& && & [request start];& &}& &&&//这个是响应的delegate方法& &- (void)productsRequest: (SKProductsRequest *)request& &didReceiveResponse: (SKProductsResponse *)response& &{& && & NSArray *myProduct = response.& &&&& & //生成商店的UI& && & [request autorelease];& &}&&
5. 添加一个展示商品的界面Store Kit不提供界面的类。 这个界面需要我们自己来设计并实现。6. 为支付队列(payment queue)注册一个观察者对象你的程序需要初始化一个transaction observer对象并把它指定为payment queue的观察者。上代码:MyStoreObserver *observer = [[MyStoreObserver alloc]init];& &[[SKPaymentQueue defaultQueue]addTransactionObserver: observer];&&
应该在程序启动的时候就添加好观察者,原因前面说过,重启后程序会继续上次未完的交易,这时就添加观察者对象就不会漏掉之前的交易信息。7. 在MyStoreObserver类中执行paymentQueue: updatedTransactions: 方法。这个方法会在有新的交易被创建,或者交易被更新的时候被调用。- (void)paymentQueue: (SKPaymentQueue *)queue updatedTransactions: (NSArray *)transactions& &{& && & for(SKPaymentTransaction * transaction in transactions)& && & {& && && &&&switch(transaction.transactionState)& && && &&&{& && && && && &case SKPaymentTransactionStatePurchased:& && && && && && & [self completeTransaction: transaction];& && && && && && && && && && && &case SKPaymentTransactionStateFailed:& && && && && && & [self failedTransaction: transaction];& && && && && && && && && && && &case SKPaymentTransactionStateRestored:& && && && && && & [self restoreTransaction: transaction];& && && && && &default:& && && && && && && && && &&&}& && & }& &}&&
上面的函数针对不同的交易返回状态,调用对应的处理函数。8. 观察者对象在用户成功购买一件商品时,提供相应的内容,以下是在交易成功后调用的方法- (void) completeTransaction: (SKPaymentTransaction *)transaction& &{& && & //你的程序需要实现这两个方法& && & [self recordTransaction: transaction];& && & [self provideContent: transaction.payment.productIdentifier];& && && & & & //将完成后的交易信息移出队列& && & [[SKPaymentQueue defaultQueue]finishTransaction: transaction];& &}&&
交易成功的信息包含transactionIdentifier和transactionReceipt的属性。其中,transactionReceipt记录了支付的详细信息,这个信息可以帮助你跟踪、审(我们的)查交易,如果你的程序是用服务器来交付内 容,transactionReceipt可以被传送到服务器,然后通过App Store验证交易。(之前提到的server模式,可以参考以前的图)9. 如果交易是恢复过来的(restore),我们用这个方法来处理:- (void) restoreTransaction: (SKPaymentTransaction *)transaction& &{& && & [self recordTransaction: transaction];& && & [self provideContent: transaction.payment.productIdentifier];& &&&& & [[SKPaymentQueue defaultQueue] finishTransaction: transaction];& &}&&
这个过程完成购买的过程类似。 恢复的购买内容提供一个新的交易信息,这个信息包含了新的transaction的标识和receipt数据。 如果需要的话,你可以把这些信息单独保存下来,供追溯审(我们的)查之用。但更多的情况下,在交易完成时,你可能需要覆盖原始的transaction数 据,并使用其中的商品标识。10. 交易过程失败的话,我们调用如下的方法:- (void)failedTransaction: (SKPaymentTransaction *)transaction& &{& && & if(transaction.error.code != SKErrorPaymentCancelled)& && & {& && && &&&//在这类显示除用户取消之外的错误信息& && & }& &&&& & [[SKPaymentQueue defaultQueue] finishTransaction: transaction];& &}&&
通常情况下,交易失败的原因是取消购买商品的流程。 程序可以从error中读出交易失败的详细信息。显示错误信息不是必须的,但在上面的处理方法中,需要将失败的交易从支付队列中移除。 一般来说,我们用一个对话框来显示错误信息,这时就应避免将用户取消购买这个error显示出来。11. 组织好程序内“商店”的UI。当用户选择一件商品时, 创建一个支付对象,并放到队列中。SKPayment *payment = [SKPayment paymentWithProductIdentifier: kMyFeatureIdentifier];& &[[SKPaymentQueue defaultQueue] addPayment: payment];&&
如果你的商店支持选择同一件商品的数量,你可以设置支付对象的quantity属性SKMutablePayment *payment = [SKMutablePayment paymentWithProductIdentifier: kMyFeatureIdentifier];& &payment.quantity = 3;& &[[SKPaymentQueue defaultQueue] addPayment: payment];&&
下一步:本章中所示代码可用于内置型商品模式(Built-in)。 如果你的程序要使用服务器来发布商品,你需要负责设计和执行iPhone程序和你的服务器之间的通信。服务器应该验证数据并为程序提供内容。验证store的收据使用服务器来交付内容,我们还需要做些额外的工作来验证从Store Kit发送的收据信息。重要信息:来自Store的收据信息的格式是专用的。 你的程序不应直接解析这类数据。可使用如下的机制来取出其中的信息。验证App Store返回的收据信息当交易完成时,Store Kit告知payment observer这个消息,并返回完成的transaction。 SKPaymentTransaction的transactionReceipt属性就包含了一个经过签名的收据信息,其中记录了交易的关键信息。你的 服务器要负责提交收据信息来确定其有效性,并保证它未经过篡改。 这个过程中,信息被以JSON数据格式发送给App Store,App Store也以JSON的格式返回数据。(大家可以先了解一下JSON的格式)验证收据的过程:1. 从transaction的transactionReceipt属性中得到收据的数据,并以base64方式编码。2. 创建JSON对象,字典格式,单键值对,键名为&receipt-data&, 值为上一步编码后的数据。效果为:{& && & &receipt-data&& & : &(编码后的数据)&&&}&&
3. 发送HTTP POST的请求,将数据发送到App Store,其地址为:
[url=https://buy./verfyReceipt]https://buy./verfyReceipt4. App Store的返回值也是一个JSON格式的对象,包含两个键值对, status和receipt:{& && & &status&& & : 0,& && & &receipt&& & : { … }& &}&&
如果status的值为0, 就说明该receipt为有效的。 否则就是无效的。App Store的数据发送给App Store的收据数据是通过对transaction中对应的信息编码而创建的。 当App Store验证收据时, 将从其中解码出数据,并以&receipt&的键返回。 返回的响应信息是JSON格式,被包含在SKPaymentTransaction的对象中(transactionReceipt属性)。Server 可通过这些值来了解交易的详细信息。 Apple建议只发送receipt数据到服务器并使用receipt数据验证和获得交易详情。 因为App Store可验证收据信息,返回信息,保证信息不被篡改,这种方式比同时提交receipt和transaction的数据要安全。(这段得再看看)表5-1为交易信息的所有键,很多的键都对应SKPaymentTransaction的属性。备注:一些键取决于你的程序是链接到App Store还是测试用的Sandbox环境。更多关于sandbox的信息,请查看&Testing a Store&一章。Table 5-1 购买信息的键:
11:04 上传
测试Store功能开发过程中,我们需要测试支付功能以保证其工作正常。然而,我们不希望在测试时对用户收费。 Apple提供了sandbox的环境供我们测试。备注:Store Kit在模拟器上无法运行。 当在模拟器上运行Store Kit的时候,访问payment queue的动作会打出一条警告的log。测试store功能必须在真机上进行。Sandbox环境使用Sandbox环境的话,Store Kit并没有链接到真实的App Store,而是链接到专门的Sandbox环境。 SandBox的内容和App Store一致,只是它不执行真实的支付动作。 它会返回交易成功的信息。 Sandbox使用专门的iTunes Connect测试 账户。不能使用正式的iTunes Connect账户来测试。要测试程序,需要创建一个专门的测试账户。你至少需要为程序的每个区域创建至少一个测试账户。详细信息,请查看iTunes Connect Developer Guide文档。在Sandbox环境中测试步骤:1. 在测试的iPhone上退出iTunes账户Settings中可能会记录之前登录的账户,进入并退出。重要信息:不能在Settings 程序中通过测试账户登录。2. 运行程序当你在程序的store中购买商品后,Store kit提示你去验证交易。用测试账户登录,并批准支付。 这样虚拟的交易就完成了。在Sandbox中验证收据验证的URL不同了:NSURL *sandboxStoreURL = [[NSURL alloc]initWithString:& & @&https://sandbox./verifyReceipt&];
Powered by

我要回帖

更多关于 android 对话框 的文章

 

随机推荐