我正在尝试使用此代码进行交易:
SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"com.this.is.where.the.identifier.is"];
[[SKPaymentQueue defaultQueue] addPayment:payment];
Run Code Online (Sandbox Code Playgroud)
事务处理很好,但-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions没有调用,因此无法更新我的应用程序以启用专业功能.我已将委托协议包含SKPaymentTransactionObserver在头文件中.
代码如下 - 这个代码昨天工作提供无效ID现在更长的工作,我已经代码大约10次
.M
#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>
@interface InAppViewController : UIViewController <SKProductsRequestDelegate, SKPaymentTransactionObserver> {
SKProduct *proUpgradeProduct;
SKProductsRequest *productsRequest;
}
Run Code Online (Sandbox Code Playgroud)
.H
#import "InAppViewController.h"
@implementation InAppViewController
- (void)viewDidLoad{
[self requestProUpgradeProductData];
}
- (void)dealloc {
[super dealloc];
}
- (void)requestProUpgradeProductData
{
NSLog(@"called productsRequest");
NSSet *productIdentifiers = [NSSet setWithObject:@"com.okz8.investor.gem15" ];
productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
productsRequest.delegate = self;
[productsRequest start];
// we will release the request object in the delegate callback
}
#pragma mark -
#pragma mark SKProductsRequestDelegate methods
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse …Run Code Online (Sandbox Code Playgroud) 我的应用程序最近被itunes商店拒绝,原因如下.
11.6使用IAP的内容订阅必须至少持续7天,并且可供用户从其所有iOS设备使用
我通过以下链接 如何恢复不续订的Apple订阅
但没有得到如何在多个ios设备之间分享在app项目中购买的内容.我在应用商品中使用不续订.
任何好友都有这个想法.帮助将不胜感激.提前致谢.
我试图在发送产品ID列表后对从Apple Server收到的SKProduct数组进行排序.
我想通过使用以下内容进行排序:
NSSortDescriptor *lowestPriceToHighest = [NSSortDescriptor sortDescriptorWithKey:@"self.price" ascending:YES];
NSArray *sortedProducts = [products sortedArrayUsingDescriptors:[NSArray arrayWithObject:lowestPriceToHighest]];
Run Code Online (Sandbox Code Playgroud)
但我收到错误消息:Unable to access variable "lowestPriceToHighest"
我的排序描述符是否被错误地定义了?
我正在构建我的第一个Store Kit应用程序并遇到崩溃问题:
该应用程序是一个精灵套件游戏
在MainMenuScene.swift我分配RemoveAdButton
时,我调用该initPurchaseRemoveAds()函数
MainMenuScene.swift e = SKPaymentQueue.defaultQueue()
func initPurchaseRemoveAds() {
let actionRotate = SKAction.rotateByAngle(CGFloat(M_2_PI), duration: 0.1)
let spin = SKAction.repeatActionForever(actionRotate)
self.loadingwheel.runAction(spin)
self.loadingwheel.hidden = false
NSNotificationCenter.defaultCenter().postNotificationName(KeyValueKeyClassification.NotificationBuyRemoveAd.rawValue, object: nil, userInfo: nil)
}
Run Code Online (Sandbox Code Playgroud)
GameViewController.swift
var request : SKProductsRequest?
var queue : SKPaymentQueue. = SKPaymentQueue.defaultQueue()
// called through the notification (works!)
func initPurchase(notification: NSNotification) {
println("user clicked remove ads")
if SKPaymentQueue.canMakePayments() {
println("user can make payments")
self.request = SKProductsRequest(productIdentifiers: NSSet(object: PurchaseClassification.RemoveAdID.rawValue as String))
self.request?.delegate = self
self.request?.start() …Run Code Online (Sandbox Code Playgroud) 使用 Swift 3
当我调用此代码时,它显示为我的时区
let date = Date()
let todayDate = formatter.string(from: date)
print(todayDate)
Run Code Online (Sandbox Code Playgroud)
我从 StoreKit 收据调用 JSON 响应来检查original_purchase_date并expires_date比较它todayDate以验证收据。
我想做的事,例如
if (todayDate > expires_date ) {
cancel subscription
}
Run Code Online (Sandbox Code Playgroud)
如果Apple的purchase_date和expires_date位于GMT时区,而todayDate位于用户所在的任何时区,则我无法匹配日期。
因此,我只需要在调用 Date() 时转换用户所在的时区,并将其转换为 GMT(就像 Apple 的服务器一样),这样我就可以检查 TodayDate 是否已通过自动更新订阅上的过期数据。
另外,这是防止应用程序黑客攻击的好方法吗?我使用 php 从我的服务器获取了收据,该收据从 Apple 进行了验证。
if parseJSON["status"] as? Int == 0 {
print("Status Code for Receipt = 0!")
// Checking "latest_receipt_info"
if let receiptInfo: NSArray = parseJSON["latest_receipt_info"] as? NSArray {
let lastReceipt = receiptInfo.lastObject as! NSDictionary …Run Code Online (Sandbox Code Playgroud) 我几乎已经在我的应用程序中管理了自动续订订阅,但发生了一件奇怪的事情 - 它不会自动续订。
我有一个按钮,它在我的产品中添加了 SKPayment,并为我提供了带有 SKPaymentTransaction 的收据,这非常活跃。
然后我保存该收据并尝试再次将其发送给Apple以检查过期日期。它会返回我第一次购买的日期,而不是最后一次购买的日期expiredate。当订阅期结束时(在沙盒中的五分钟内) ),它只返回我 21002
但是,如果我再次手动续订,新收据会为我提供更新的到期日期,我再次保存它,一切都会顺利进行。
是的,original_purchase_date这两个接待都是一样的。
也许我只是不明白,检查过期日期是如何工作的?
上下文
SKProductRequest问题
SKErrorPaymentCancelled没有来自用户的任何操作当用户调用restorePurchases()时,即使他们不拥有它,也会恢复非耗材com.premium.以下是负责恢复购买和购买IAP的功能.这只是非耗材IAP的问题.购买没有问题.如果用户尝试购买他们已经拥有的IAP,则只需恢复.感谢您关注此事.
func restorePurchases() {
SKPaymentQueue.default().add(self)
SKPaymentQueue.default().restoreCompletedTransactions()
}
func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
print("transactions restored")
for transaction in queue.transactions {
let t: SKPaymentTransaction = transaction
let prodID = t.payment.productIdentifier as String
print("starting restoring")
switch prodID {
case "com.premium":
print("restoring ads")
removeAds()
case "com.cash":
print("we dont restore coins")
case "com.level":
print("we dont restore levels")
default:
print("can't restore")
}
}
Run Code Online (Sandbox Code Playgroud)
这也是我的支付队列.
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
print("add paymnet")
for transaction:AnyObject in transactions {
let trans = transaction as! SKPaymentTransaction
print(trans.error) …Run Code Online (Sandbox Code Playgroud) SKPaymentTransactionObserver购买完成后我有支票
extension IAPService: SKPaymentTransactionObserver {
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
print(transaction.transactionState.status(), transaction.payment.productIdentifier)
if transaction.transactionState.status() == "purchased" {
// Pro Purchased
}
switch transaction.transactionState {
case .purchasing: break
default: queue.finishTransaction(transaction)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
ViewController购买完成后,如何隐藏购买的对象
正如我在标题中所说,
[SKStoreReviewController requestReview];
Run Code Online (Sandbox Code Playgroud)
在 iOS 14 中不再工作了。有谁知道替代方案?