【问题标题】:In-app iOS "Confirm your in app purchases" will pop out purchase list view应用内iOS“确认您的应用内购买”将弹出购买列表视图
【发布时间】:2013-10-08 14:36:53
【问题描述】:

我有一个采购清单:

item 1 $0.99 Buy
item 2 $1.99 Buy
item 3 $2.99 Buy

当我点击购买按钮时,会出现“确认您的应用内购买”警告窗口。无论我选择“购买”还是“取消”,这个警告窗口都会消失(这是正确的),但是购买列表视图控制器会弹出到它的父视图控制器。我不知道为什么。

我尝试了很多方法,得到了相同的结果——当我单击“确认您的应用内购买”警告窗口“取消”或“购买”按钮时,列表视图控制器将弹出。只是告诉为什么。

这是列表视图中点击支付按钮的代码:

- (void)buyButtonTapped:(id)sender {

    UIButton *buyButton = (UIButton *)sender;
    NSString *searchString ;
    if (buyButton.tag == 0) {
        searchString = PURCHASES_REMOVE_AD;
    }else if (buyButton.tag == 1){
        searchString = PURCHASES_COFFEE;
    }else if (buyButton.tag == 2){
        searchString = PURCHASES_MONEY;
    }
    for (SKProduct *product in _products) {
        if ([product.productIdentifier isEqualToString:searchString]) {
            [[RageIAPHelper sharedInstance] buyProduct:product];
            break;
        }
    }

}

然后我来到这个页面:

正如你在这张图片中看到的,当我点击“取消”或“购买”按钮时,“购买”视图控制器将消失回父视图控制器,

- (void)failedTransaction:(SKPaymentTransaction *)transaction {

    NSLog(@"failedTransaction...");
    if (transaction.error.code != SKErrorPaymentCancelled)
    {
        NSLog(@"Transaction error: %@", transaction.error.localizedDescription);
    }

    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

这是我点击取消按钮的代码,没有发现任何问题。

更新

我终于明白了。我在 - (void)applicationDidBecomeActive:(UIApplication *)application 中创建列表视图的父视图控制器。现在我将创建移动到 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 问题消失了。谁能告诉我为什么?

【问题讨论】:

  • 为什么要投票给我,至少请给我一个理由!!!
  • 当您的视图将移动到不同的父级时添加一个断点。尝试找出触发视图更改的原因。您是否添加了一些正在执行此操作的代码(我假设答案是肯定的)。
  • 感谢您的回复@Wain 查看我的更新。
  • 好的,将某些东西作为导航控制器的委托或子类,并在弹出视图控制器时添加断点。你需要找到触发器。
  • 我在列表视图设置断点 -(void)viewWillDisappear 在单击取消按钮后发现 - (void)applicationDidBecomeActive:(UIApplication *)AppDelegate.m 中的应用程序被调用...

标签: ios in-app-purchase


【解决方案1】:

当显示来自 StoreKit 的模式时,您的应用程序实际上失去了焦点。结果,当用户点击 SK 对话框中的任一按钮时,your application became active again,并且由于您创建控制器以响应应用程序变为活动状态,它创建了它的一个新实例,有效地隐藏了以前在屏幕上的内容。

【讨论】:

    【解决方案2】:

    我以为你没有设置 SKProductsRequest 的“代表”。

    SKProductsRequest *request;
    request.delegate = self; // self or target. did you?
    

    我附上参考In App Purchases: A Full Walkthrough - troybrant.net

    编辑 -- 2013/10/15

    在调用 - (void)applicationDidBecomeActive: 方法之后,什么时候点击了“Purchase Popup”。所以...购买 ViewController 将被重新生成。所以可能找不到 SKProductsRequest 的委托。

    iOS Application life cycle

    【讨论】:

    • 感谢您的回复,但我确实设置了请求,请参阅我的更新
    【解决方案3】:

    applicationDidBecomeActive 在应用程序启动后被多次调用。例如,当应用启动时出现定位服务弹窗,用户点击“确定”后,再次调用applicationDidBecomeActive方法。

    我的猜测是,当“确认您的应用内购买”对话框弹出时,也会发生同样的行为。由于您在 applicationDidBecomeActive 方法中重新创建父视图控制器,我的猜测是当您按下 OK 或 BUY 按钮时,父视图被完全重新初始化,从而导致了意外行为。

    您可以在 applicationDidBecomeActive 方法中粘贴 NSLog 来确认这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 2012-12-27
      相关资源
      最近更新 更多