Ios 将应用内购买链接到用户apple帐户

Ios 将应用内购买链接到用户apple帐户,ios,iphone,in-app-purchase,Ios,Iphone,In App Purchase,我正在寻找一种将应用内购买(不可续费订阅)链接到用户apple帐户的方法,因为我的应用没有帐户系统,显然我希望用户保留其订阅 我读到我们无法获取Apple ID,但我认为有一种方法可以做到,因为大多数iOS应用程序都可以使用您的Apple帐户保存数据 谢谢你的回答 如果您没有自己的帐户系统(用户可以在其中登录等),您可以从购买收据中查看用户购买的应用程序: 无法从SDK获取AppleID等个人信息。您应该自己跟踪应用程序中已购买的产品。我通常使用[[NSUserDefaults standar

我正在寻找一种将应用内购买(不可续费订阅)链接到用户apple帐户的方法,因为我的应用没有帐户系统,显然我希望用户保留其订阅

我读到我们无法获取Apple ID,但我认为有一种方法可以做到,因为大多数iOS应用程序都可以使用您的Apple帐户保存数据


谢谢你的回答

如果您没有自己的帐户系统(用户可以在其中登录等),您可以从购买收据中查看用户购买的应用程序:


无法从SDK获取AppleID等个人信息。

您应该自己跟踪应用程序中已购买的产品。我通常使用
[[NSUserDefaults standardUserDefaults]setBool:YES-forKey:productIdentifier]
来实现这一点

当用户重新安装应用程序或购买新设备时,问题就会出现。在这种情况下,您必须实现一种方法来恢复购买的产品

声明实现这一点的一种方法是调用
[[SKPaymentQueue defaultQueue]restoreCompletedTransactions]
。这会向应用商店发送一个请求,以恢复应用程序的所有已完成事务

然后,将调用事务观察者的
paymentQueue:(SKPaymentQueue*)队列更新事务:(NSArray*)事务
,并且
事务
保存还原的产品。我的函数通常如下所示:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
    for (SKPaymentTransaction * transaction in transactions) {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased:
                [self completeTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:
                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                [self restoreTransaction:transaction];
            default:
                break;
        }
    };
}`

restoreTransaction

中完成恢复过程(提供内容、更新
NSUserDefaults
等)。对于非续费订阅,您必须手动将到期日期存储在某个位置,因为苹果没有对其进行非续费管理

我在我的一个应用程序中实现了这一功能,订阅后,我用来在服务器上存储过期日期,应用程序将在访问付费功能时检查过期日期

如果发现已过期,应用程序将要求再次购买订阅

参考链接:


希望这有帮助

应用程序中的链接是什么意思?你刚刚用当前的应用程序标识符链接了你的apple iTunes connect帐户。我已经在iTunes connect中创建了应用程序内购买,我的意思是当用户购买对象时保存购买。你想恢复购买吗?加密似乎很难,谢谢你的回答谢谢你的帮助,但问题是,我想知道用户是否已经购买了产品,而没有进入应用程序内视图控制器。检查产品是否已经购买的代码不应该与视图控制器有任何关系。它可能位于视图控制器中,但大多数开发人员都同意,将表示视图的代码与业务逻辑分离是一种良好的做法。也就是说,答案中的代码可以/应该在它自己的类中(与其他应用内购买逻辑一起),并且您应该能够在代码中的任何地方使用它的功能。甚至在进入视图控制器之前。