iPhone 应用内购买 Store Kit 错误 -1003 "无法连接到 iTunes Store"

46

我一直在努力添加应用内购买功能,使用Store Kit创建和测试应用内购买成功了(耶!)。但是,在测试过程中,我以某种方式运行应用程序导致应用程序在购买过程中崩溃(所以我猜正常的“paymentQueue:updatedTransactions”流程被中断了)。

现在我无法成功完成任何交易,每当调用“paymentQueue:updatedTransactions”时,都只会得到交易状态为SKPaymentTransactionStateFailed的交易。

事务错误代码为-1003,事务错误说明为“无法连接到iTunes Store”!

我已尝试从iTunesConnect中删除所有产品,并使用不同的标识符重新构建它们,但没能解决问题。我还尝试使用App Store应用程序真正连接到真正的App Store并下载一些应用程序,因此我确实具有网络连接。最后,我访问了设置:商店应用程序,以确保我已注销我的正常应用商店账户。


你找到解决问题的方法了吗?我最近遇到了同样的问题,在沙盒服务器崩溃之前,商店在我的iPad上可以使用。在它再次上线后,它就不能用了。然后我将iPad项目中使用的相同代码复制到iPhone项目中,并使用两个不同的iPhone进行测试,结果它可以工作。但是似乎在iPad应用程序上不起作用了。出了什么问题? - NicTesla
1
“无法连接到iTunes Store”错误信息似乎是一个通用的错误信息,当使用StoreKit时出现各种不同的网络相关错误代码时会使用该信息。具体的代码-1003是在“CFNetworkErrors.h”中定义的“kCFURLErrorCannotFindHost”。 - markshep
1
我遇到了同样的问题,但不幸的是在第二次尝试时它确认了购买。有什么想法吗? - Gopal Rathod
20个回答

40

我曾经遇到过类似的情况,为了看清楚是怎么回事,我捕获了iPhone的网络流量。结果发现它连接的是正式商店而不是沙盒环境。删除设备上的应用程序、重新构建和安装它有所帮助。显然是开发配置文件出了问题。

更新: 要捕获非越狱iPhone的网络流量,只需使用Mac上的Internet Sharing并将您的iPhone配置为使用Mac的WiFi即可。然后在Mac上运行tcpdump -n -i en1即可解决问题。


3
很好,我必须删除应用程序并清理项目才能使其正常工作。 - aryaxt
我刚刚不得不使用网络共享和tcpdump,因为出现了-1003错误。看起来StoreKit正在查询p40-sandbox.itunes.apple.com.的DNS,但是它得到了NXDOMAIN(即该名称没有DNS条目)。所以在我的特定情况下,这似乎是苹果的问题..... - markshep
我按照苹果的指南实现应用内购买,但当我尝试购买时,出现错误代码3和描述无法连接到iTunes商店。我尝试从手机中转储网络数据,结果显示手机正确地连接到沙盒。我还尝试添加新用户并退出商店登录。我甚至没有看到输入测试用户的屏幕...只有上述错误。 - refaelos
我的IAP实现是完美的,但在一些我已经很久没有使用的旧设备上测试时,我却没有收到任何产品。除了上述问题之外,我还不得不删除所有的配置文件(设置->通用->配置文件)。在此之后进行一次干净的构建,一切都恢复正常了。 - Tafkadasoh

26
如果你遇到错误码为0的问题,即"无法连接到iTunes Store"(我知道这不是OP所问的-1003错误,但是搜索错误码0也会带到这里),那么可能有两个可能的问题:
  1. 你传递了错误的产品标识符。如果是这样,那么在调用-[SKPaymentQueue addPayment:]后不久,也就是在你弹出确认支付窗口之前,你会收到错误码0。
  2. 你的测试用户已失效。如果你不小心用测试用户登录App Store,就会发生这种情况。当出现这种情况时,在输入密码确认付款后,你会收到错误码0。

要解决问题1,请传递正确的产品ID。要解决问题2,请在iTunes Connect上创建一个新的测试用户,并可选择删除旧的测试用户。


问题和解决方案的清晰简明描述。在花费了不知道多长时间尝试修复这个问题后,真的帮了很大忙。谢谢! - CCSab
创建一个新的测试用户,已经修复了。谢谢! - Hlung
非常感谢@Adam!我也遇到了同样的错误。你提到的第二点解决了我的问题! - Mohit Nigam
我有同样的问题,但是建议的两个原因都不存在。我确实收到了确认对话框,但失败发生在响应该对话框时... - jheriko

15

我曾经遇到了类似的问题,错误提示"无法连接到iTunes Store",并且Code=0。在尝试了互联网上所有常规建议(从重新下载证书到重置所有设备设置再到祭奉一只处女黑山羊)后,我终于解决了这个问题:

在应用程序的目标摘要中,我曾将我的版本号放在“构建”字段中,但“版本”字段中什么也没有。这对我来说似乎很奇怪,所以我将版本号从“构建”移到了“版本”。结果就是上述的错误。将版本号移回“构建”字段即可解决错误。


我在构建字段中也有版本,但它没有起到帮助作用。你可能同时做了其他事情。 - Kamchatka
2
我无法感谢你发布这个修复程序。我尝试了所有其他的修复方法,结果发现将“Build”留空导致了问题。谢谢!这实际上是针对错误代码:0的。 - jarrold
1
我曾经被困扰了很久,但解决方案却完全出乎意料。你至少为我节省了24小时的时间!谢谢。 - Fabio
非常感谢您发布这个!我也遇到了错误代码0,其他的建议都没有帮助。 - Michal
2
你在开玩笑吧。这真的起作用了,解决了24小时的挫败感。我离打电话找一只黑山羊和一个像空白构建字段这样愚蠢的问题只有几步之遥!非常感谢thomax x10000! - AlBeebe

13

为您的应用程序添加新的测试用户。


11

请确保您的设置中已经正确设置日期和时间。否则,将无法与商店建立SSL连接!


6

我曾经遇到过同样的错误,在阅读了一些开发者论坛的帖子后,我重置了我的设备设置(设置->通用->重置->重置所有设置),这样问题就解决了。这看起来很严重,但是它确实有效。


1
自从那时以来,我又不得不这样做了几次。我还尝试了“重置网络设置”,我希望它也能解决问题,但不会造成太大破坏,但那也没用。 - Christopher Pickslay
这在iOS5下真的很糟糕,因为它基本上将其设置为新的iPad,并强制你从备份中安装。 - Christopher Pickslay

2

我遇到了同样的错误,似乎突然出现了(一天还好好的,但第二天我每试三次中就有两次会出现这些错误,与我的应用内购买相关)。

后来我在尝试进行另一个真实购买时访问了App Store,并意识到他们有一个新的用户协议需要我验证。之后,当我回到自己的应用程序并再次尝试测试购买时,它正常运行,从那以后就没有出现过错误。所以我怀疑我之所以会出现错误,是因为他们想让我验证新的用户协议。

现在唯一让我感到好奇的是,是否有一种方法可以使我的应用内购买将该提示转发给我的用户,而不是给他们一个神秘的错误?


1

SKPaymentTransactionState 中告诉你,在你的请求被添加到服务器队列之前,SKPaymentTransactionStateFailed

@class SKPayment;

enum {
    SKPaymentTransactionStatePurchasing,    // Transaction is being added to the server queue.
    SKPaymentTransactionStatePurchased,     // Transaction is in queue, user has been charged.  Client should complete the transaction.
    SKPaymentTransactionStateFailed,        // Transaction was cancelled or failed before being added to the server queue.
    SKPaymentTransactionStateRestored       // Transaction was restored from user's purchase history.  Client should complete the transaction.
};
typedef NSInteger SKPaymentTransactionState;

SKPaymentTransaction 类参考错误讨论中提到:

除非 transactionState 被设置为 SKPaymentTransactionStateFailed,否则 error 属性是未定义的。您的应用程序可以读取 error 属性以确定交易失败的原因。

因此,transaction.error.localizedDescription 是“无法连接到 iTunes Store”! 是一条常见的错误消息.. 我在测试我的 InApp Purchases 时也经常遇到这个错误消息。

以下是一些提示:

  1. 使用 SKProductsRequest 检索应用商店中的所有产品,并检查其 response.products 是否包含您请求的 productIdentifier。 为此,请使用以下代码:

    SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:[objProducts allKeys]]];
    //将产品标识符数组作为参数传递
    [request start];  
    

并在以下位置捕获响应:

    - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
        NSArray *myProduct = response.products;
}

这样你就可以决定是否可以与应用商店通信,而且你的产品ID也在其中。

  1. 确保您在测试中使用 In App 测试用户帐户。
  2. 同时使用您为 In App 购买配置的相同 app-id 配置文件。

谢谢。


1
我的解决方法是从测试设备卸载我的应用程序,然后从Xcode安装一个新的副本。

从设备中卸载并重新安装对我也起作用了。 - efeyc

0

我遇到了两个问题导致这个错误:

1)我从另一个(正常运行的)应用程序中复制了IAP代码,但是忘记设置观察者:

observer = [[IAPHelper alloc] init]; [[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

2)我在设备的设置中登录了iTunes。您只能在沙盒中使用测试用户 - 我退出登录后它又可以工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接