Apple サーバーでホストされているコンテンツをダウンロードして動作させましたが、IAP UI をさらに開発しているときに、コンテンツを再ダウンロードする必要がある状況に遭遇しました。
この場合のコンテンツは、Xcode でイメージのバンドルとして作成された zip ファイルと、関連データを含む plist ファイルです。
元のダウンロードは正常に機能し、zip ファイルをディレクトリのように処理できました。
アプリの開発を続けるにあたり、テスト デバイスからアプリを削除しました。つまり、コンテンツはデバイス上にありませんでした。アプリ内トランザクションが完了しなかったため、ダウンロードが再度処理されることを期待していました。
元々、zip ファイルがダウンロードされて caches ディレクトリに保存され、そこから処理することができました。ただし、IAP フレームワークは zip ファイルが存在すると認識しているように見えますが、実際には存在しません。このメソッドは、ダウンロード アクティビティが発生していない場合paymentQueue:updatedDownloads:
と等しいダウンロード状態でトリガーされます。SKDownloadStateFinished
わかった。それは私の管理下にありません。与えられたダウンロードの URL を確認するだけで済みますよね? そのため、参照されたダウンロードを処理するcase SKDownloadStateFinished:
への呼び出しがあります。[self processURL:download.contentURL fromProduct:download.contentIdentifier];
その方法の始まりは次のとおりです。
-(void)processURL:(NSURL *)directoryURL fromProduct:(NSString *)productIdentifier
{
int itemsAdded = 0;
NSFileManager *filemanager = [NSFileManager defaultManager];
NSMutableSet *masterIndex = [NSMutableSet new];
BOOL isDir;
if ([filemanager fileExistsAtPath:[directoryURL path] isDirectory:&isDir]) {
NSLog(@"URL %@ exists. Is it a directory? %@",directoryURL,isDir?@"YES":@"NO");
} else {
NSLog(@"URL %@ does not exist.",directoryURL);
}
出力として得られるものは次のとおりです。
URL file://localhost/private/var/mobile/Applications/40733984-E18D-4450-A98E-D8CCC56D2600/Library/Caches/8E29E63C-9C32-4D92-AC84-23BDA946DE5F.zip/ does not exist.
への呼び出し[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
は役に立たないようです。zipファイルを再ダウンロードせずに終了したと考えているだけです。
何をすべきかについて何か提案はありますか?
編集:これは本当にイライラしています。最初の投稿以来、私は次のことを試しました: * iPad を再起動しました * Xcode を再起動しました * iPad でクリーンアップを実行しました (息を止めていませんでした。クリーニング ユーティリティ) * plist ファイル内の更新された情報でアプリ内購入パッケージを更新しました。* アプリ内購入パッケージのバージョンを更新しました。
ダウンロードしようとすると、同じ zip ファイル名をダウンロードしようとしますが、まだ存在しません。パッケージを変更すると、同じパッケージ名であっても、ダウンロードによって別の zip 名がプルされると考えました。しかし、おそらくそれは単なるハッシュまたはパッケージ名です。
キャッシュ ディレクトリが何らかの理由で破損している可能性があります。次のステップは、別のパッケージ名で別のパッケージを作成することです。これでうまくいくと思いますが、問題は解決しません。
また、問題を引き起こした可能性のある状況についても考えています。ビルドと実行ボタンを押したときの Xcode 5 の応答が遅いようです。その結果、2回クリックしました。もちろん、それは問題を引き起こします。この場合、ある種の致命的な抱擁を受けて、iPad がロックされたと思います。手動で電源を切って再起動する必要がありましたが、正常に戻るまでに 2 回かかりました。
編集:新しいアイテムはダウンロードされていません。私がチェックした項目のチェックリストです。これを編集して、さらに多くのアイテムを含めるかどうかを確認してください。
- テスト ユーザーが本番環境で使用されていないことを確認してください。その場合、新しいテスト ユーザーを作成する必要があります。
- オブジェクトが SKPaymentTransactionObserver として登録されていることを確認します。これには、インターフェイスの設定と
[[SKPaymentQueue defaultQueue] addTransactionObserver:self]
、起動時の呼び出しも含まれます。 - ユーザーが支払いを行えることを確認します。
- 確認してください
transaction.transactionState == SKPaymentTransactionStatePurchased
(またはSKPaymentTransactionStateRestored
トランザクションを復元する場合) - トランザクションが終了していないことを確認してください (
[[SKPaymentQueue defaultQueue] finishTransaction:transaction]
)。 - 製品 ID が iTunes Connect で設定された製品 ID と一致していることを確認してください (そうでなければ、購入できなかったでしょう)。
- 物理デバイスでテストします。これらのダウンロードは、シミュレーターでテストできません。
- (推測) App Store の通知をオフにして、テスト ユーザーが無効にならないようにします。