gpt4 book ai didi

ios - 如何将应用内购买添加到 iOS 应用程序?

转载 作者:行者123 更新时间:2023-12-01 16:15:31 24 4
gpt4 key购买 nike

如何将应用内购买添加到 iOS 应用?所有细节是什么,是否有任何示例代码?

这是关于如何向 iOS 应用程序添加应用程序内购买的各种知识

最佳答案

Swift 用户
Swift 用户可以查看 My Swift Answer for this question .或者,查看 Yedidya Reiss's Answer ,将这段 Objective-C 代码转换为 Swift。
Objective-C 用户
这个答案的其余部分是用 Objective-C 编写的
应用商店连接

  • 转至 appstoreconnect.apple.com并登录
  • 点击My Apps然后单击您想要添加购买的应用程序到
  • 点击 Features标题,然后选择 In-App Purchases左边
  • 点击 +中间的图标
  • 在本教程中,我们将添加一个应用内购买来移除广告,所以选择 non-consumable .如果您要向用户发送实物,或者给他们一些他们可以多次购买的东西,您可以选择 consumable .
  • 对于引用名称,输入您想要的任何内容(但请确保您知道它是什么)
  • 对于产品 ID 放 tld.websitename.appname.referencename这将最有效,例如,您可以使用 com.jojodmo.blix.removeads
  • 选择 cleared for sale然后选择价格等级为 1 (99¢)。第 2 层为 1.99 美元,第 3 层为 2.99 美元。如果您单击 view pricing matrix,可以查看完整列表。我建议您使用第 1 层,因为这通常是任何人为删除广告而支付的最高费用。
  • 点击蓝色add language按钮,然后输入信息。这将全部显示给客户,所以不要放任何你不想让他们看到的东西
  • 对于 hosting content with Apple选择
  • 您可以暂时将评论笔记留空。
  • 跳过 screenshot for review现在,我们跳过的所有内容都会回来。
  • 点击“保存”

  • 您的产品 ID 可能需要几个小时才能在 App Store Connect 中注册,所以要有耐心。
    设置您的项目
    现在你已经在 App Store Connect 上设置了你的应用内购买信息,进入你的 Xcode 项目,然后进入应用程序管理器(方法和头文件所在的顶部的蓝色页面图标)点击您的应用程序在目标下(应该是第一个)然后转到一般。在底部,您应该看到 linked frameworks and libraries单击小加号并添加框架 StoreKit.framework如果您不这样做,应用内购买将不起作用!
    如果您使用 Objective-C 作为应用程序的语言,您 应该跳过这五个步骤 .否则,如果你使用 Swift,你可以关注 My Swift Answer for this question, here ,或者,如果您更喜欢将 Objective-C 用于应用内购买代码,但在您的应用中使用 Swift,您可以执行以下操作:
  • 新建 .h (头)文件通过转到 File > New > File... (命令 ⌘ + N)。在本教程的其余部分,此文件将被称为“您的 .h 文件”
  • 出现提示时,单击 创建桥接头 .这将是我们的桥接头文件。如果您是 不是 出现提示时,转至第 3 步。 如果出现提示,请跳过第 3 步,直接转至第 4 步。
  • 创建另一个 .h文件名为 Bridge.h在主项目文件夹中,然后转到应用程序管理器(蓝色页面状图标),然后在 Targets 中选择您的应用程序部分,然后单击 Build Settings .找到显示 的选项Swift 编译器 - 代码生成 ,然后设置 Objective-C 桥接头 选项 Bridge.h
  • 在您的桥接头文件中,添加行 #import "MyObjectiveCHeaderFile.h" ,其中 MyObjectiveCHeaderFile是您在第一步中创建的头文件的名称。因此,例如,如果您将头文件命名为 InAppPurchase.h ,您将添加行 #import "InAppPurchase.h"到您的网桥头文件。
  • 通过转到 .m 创建一个新的 Objective-C 方法 ( File ) 文件> New > File... (命令 ⌘ + N)。将其命名为您在第 1 步中创建的头文件。例如,如果您在第 1 步中调用该文件 InAppPurchase.h,您将调用此新文件 InAppPurchase.m。在本教程的其余部分,此文件将被称为“您的 .m 文件”。

  • 编码
    现在我们将进入实际的编码。将以下代码添加到您的 .h 中文件:
    BOOL areAdsRemoved;

    - (IBAction)restore;
    - (IBAction)tapsRemoveAds;
    接下来,您需要导入 StoreKit框架加入您的 .m文件,以及添加 SKProductsRequestDelegateSKPaymentTransactionObserver在您的 @interface 之后宣言:
    #import <StoreKit/StoreKit.h>

    //put the name of your view controller in place of MyViewController
    @interface MyViewController() <SKProductsRequestDelegate, SKPaymentTransactionObserver>

    @end

    @implementation MyViewController //the name of your view controller (same as above)
    //the code below will be added here
    @end
    现在将以下内容添加到您的 .m 中文件,这部分比较复杂,建议大家阅读代码中的注释:
    //If you have more than one in-app purchase, you can define both of
    //of them here. So, for example, you could define both kRemoveAdsProductIdentifier
    //and kBuyCurrencyProductIdentifier with their respective product ids
    //
    //for this example, we will only use one product

    #define kRemoveAdsProductIdentifier @"put your product id (the one that we just made in App Store Connect) in here"

    - (IBAction)tapsRemoveAds{
    NSLog(@"User requests to remove ads");

    if([SKPaymentQueue canMakePayments]){
    NSLog(@"User can make payments");

    //If you have more than one in-app purchase, and would like
    //to have the user purchase a different product, simply define
    //another function and replace kRemoveAdsProductIdentifier with
    //the identifier for the other product

    SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:kRemoveAdsProductIdentifier]];
    productsRequest.delegate = self;
    [productsRequest start];

    }
    else{
    NSLog(@"User cannot make payments due to parental controls");
    //this is called the user cannot make payments, most likely due to parental controls
    }
    }

    - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
    SKProduct *validProduct = nil;
    int count = [response.products count];
    if(count > 0){
    validProduct = [response.products objectAtIndex:0];
    NSLog(@"Products Available!");
    [self purchase:validProduct];
    }
    else if(!validProduct){
    NSLog(@"No products available");
    //this is called if your product id is not valid, this shouldn't be called unless that happens.
    }
    }

    - (void)purchase:(SKProduct *)product{
    SKPayment *payment = [SKPayment paymentWithProduct:product];

    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] addPayment:payment];
    }

    - (IBAction) restore{
    //this is called when the user restores purchases, you should hook this up to a button
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
    }

    - (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
    {
    NSLog(@"received restored transactions: %i", queue.transactions.count);
    for(SKPaymentTransaction *transaction in queue.transactions){
    if(transaction.transactionState == SKPaymentTransactionStateRestored){
    //called when the user successfully restores a purchase
    NSLog(@"Transaction state -> Restored");

    //if you have more than one in-app purchase product,
    //you restore the correct product for the identifier.
    //For example, you could use
    //if(productID == kRemoveAdsProductIdentifier)
    //to get the product identifier for the
    //restored purchases, you can use
    //
    //NSString *productID = transaction.payment.productIdentifier;
    [self doRemoveAds];
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    break;
    }
    }
    }

    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
    for(SKPaymentTransaction *transaction in transactions){
    //if you have multiple in app purchases in your app,
    //you can get the product identifier of this transaction
    //by using transaction.payment.productIdentifier
    //
    //then, check the identifier against the product IDs
    //that you have defined to check which product the user
    //just purchased

    switch(transaction.transactionState){
    case SKPaymentTransactionStatePurchasing: NSLog(@"Transaction state -> Purchasing");
    //called when the user is in the process of purchasing, do not add any of your own code here.
    break;
    case SKPaymentTransactionStatePurchased:
    //this is called when the user has successfully purchased the package (Cha-Ching!)
    [self doRemoveAds]; //you can add your code for what you want to happen when the user buys the purchase here, for this tutorial we use removing ads
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    NSLog(@"Transaction state -> Purchased");
    break;
    case SKPaymentTransactionStateRestored:
    NSLog(@"Transaction state -> Restored");
    //add the same code as you did from SKPaymentTransactionStatePurchased here
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    break;
    case SKPaymentTransactionStateFailed:
    //called when the transaction does not finish
    if(transaction.error.code == SKErrorPaymentCancelled){
    NSLog(@"Transaction state -> Cancelled");
    //the user cancelled the payment ;(
    }
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    break;
    }
    }
    }
    现在你想添加你的代码来处理当用户完成交易时会发生什么,在本教程中,我们使用删除添加,你必须为横幅 View 加载时发生的情况添加自己的代码。
    - (void)doRemoveAds{
    ADBannerView *banner;
    [banner setAlpha:0];
    areAdsRemoved = YES;
    removeAdsButton.hidden = YES;
    removeAdsButton.enabled = NO;
    [[NSUserDefaults standardUserDefaults] setBool:areAdsRemoved forKey:@"areAdsRemoved"];
    //use NSUserDefaults so that you can load whether or not they bought it
    //it would be better to use KeyChain access, or something more secure
    //to store the user data, because NSUserDefaults can be changed.
    //You're average downloader won't be able to change it very easily, but
    //it's still best to use something more secure than NSUserDefaults.
    //For the purpose of this tutorial, though, we're going to use NSUserDefaults
    [[NSUserDefaults standardUserDefaults] synchronize];
    }
    如果您的应用程序中没有广告,您可以使用任何其他您想要的东西。例如,我们可以将背景的颜色设为蓝色。为此,我们需要使用:
    - (void)doRemoveAds{
    [self.view setBackgroundColor:[UIColor blueColor]];
    areAdsRemoved = YES
    //set the bool for whether or not they purchased it to YES, you could use your own boolean here, but you would have to declare it in your .h file

    [[NSUserDefaults standardUserDefaults] setBool:areAdsRemoved forKey:@"areAdsRemoved"];
    //use NSUserDefaults so that you can load wether or not they bought it
    [[NSUserDefaults standardUserDefaults] synchronize];
    }
    现在,在您的 viewDidLoad 中的某个地方方法,您将要添加以下代码:
    areAdsRemoved = [[NSUserDefaults standardUserDefaults] boolForKey:@"areAdsRemoved"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    //this will load wether or not they bought the in-app purchase

    if(areAdsRemoved){
    [self.view setBackgroundColor:[UIColor blueColor]];
    //if they did buy it, set the background to blue, if your using the code above to set the background to blue, if your removing ads, your going to have to make your own code here
    }
    现在你已经添加了所有的代码,进入你的 .xibstoryboard文件,并添加两个按钮,一个是购买,另一个是恢复。挂机 tapsRemoveAds IBAction到您刚刚制作的购买按钮,以及 restore IBAction到恢复按钮。 restore action 将检查用户之前是否购买了应用内购买,如果他们还没有购买,则免费为他们提供应用内购买。
    提交审核
    接下来进入 App Store Connect ,然后点击 Users and Access然后点击 Sandbox Testers header ,然后单击 +左边的符号是 Testers .您可以随意输入名字和姓氏的内容,并且电子邮件不必是真实的——您只需要能够记住它。输入密码(您必须记住)并填写其余信息。我建议您制作 Date of Birth使用户年满 18 岁的日期。 App Store Territory 在正确的国家。接下来,注销您现有的 iTunes 帐户(您可以在本教程之后重新登录)。
    现在,在你的 iOS 设备上运行你的应用程序,如果你尝试在模拟器上运行它,购买总是会出错,你 必须在您的 iOS 设备上运行它。应用程序运行后,点击购买按钮。当系统提示您登录 iTunes 帐户时,请以我们刚刚创建的测试用户身份登录。接下来,当它要求您确认购买 99 美分或任何您设置的价格等级时, 截取它的屏幕快照 这就是您要用于您的 screenshot for review在 App Store Connect 上。现在取消付款。
    现在,转到 App Store Connect ,然后转到 My Apps > the app you have the In-app purchase on > In-App Purchases .然后点击您的应用内购买,然后点击应用内购买详情下的编辑。完成后,将您刚在 iPhone 上拍摄的照片导入计算机,并将其作为屏幕截图上传以供审核,然后在审核笔记中输入您的 测试用户 电子邮件和密码。这将有助于苹果在审查过程中。
    完成此操作后,返回 iOS 设备上的应用程序,仍以测试用户帐户登录,然后单击购买按钮。这次确认付款 别担心,这不会向您的帐户收取任何费用,测试用户帐户免费获得所有应用内购买确认付款后,请确保用户购买您的产品时发生的情况确实发生。如果没有,那么您的 doRemoveAds 就会出错。方法。同样,我建议使用将背景更改为蓝色来测试应用内购买,但这不应该是您实际的应用内购买。如果一切正常,你就可以开始了!当您将其上传到 App Store Connect 时,请确保将应用内购买包含在您的新二进制文件中!

    以下是一些常见错误:
    记录: No Products Available这可能意味着四件事:
  • 您没有在代码中输入正确的应用内购买 ID(对于上述代码中的标识符 kRemoveAdsProductIdentifier
  • 您没有清除您在 App Store Connect 上出售的应用内购买项目
  • 还没等内购ID注册到App Store Connect .创建 ID 后等待几个小时,您的问题应该会得到解决。
  • 您没有完成协议(protocol)、税务和银行信息的填写。

  • 如果它第一次不起作用,请不要沮丧!不要放弃!我花了大约 5 个小时才开始工作,大约 10 个小时才能找到正确的代码!如果您完全使用上面的代码,它应该可以正常工作。如果您有任何问题,请随时发表评论。
    我希望这对所有希望在他们的 iOS 应用程序中添加应用程序内购买的人有所帮助。干杯!

    关于ios - 如何将应用内购买添加到 iOS 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19556336/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com