Jewelry AI · ストア画面
価格があるはずの場所に、プレースホルダーが立っています
アプリは自前の価格を持っていません。ストア画面に出る数字はすべて、その端末とアカウントに対してストアが返した文字列です。ですから何も返ってこなければ、画面はプレースホルダーを表示し、購入の操作は閉じたままになります。
この画面の数字がどこから来るのか
ストア画面は、別々に届く二つのものを組み合わせています。商品のリストはサーバーのカタログから取得され、その取得がうまくいかないときはアプリが自分で持っている予備のリストに切り替わるため、画面が行のない状態になることはありません。各行の横に並ぶ価格は別の話です。価格はストアの提供元がその端末について返す提示内容(オファー)から取られ、ほかに取得先はありません。
片側にだけ空白が開くのはそのためです。予備のリストが持つのは商品の識別子と表示用の情報で、価格は持たず、ストアの代わりにもなれません。ある商品についてストアがオファーを返さないとき、アプリは渡されていない数字を出す代わりに、価格が入る位置にプレースホルダーを書き、購入の操作を閉じたままにします(apps/jewelry-mobile/src/app/store/index.tsx)。
プレースホルダーの背後にある規則は一方向にしか働きません。間違っているかもしれない価格よりも、価格なしのほうが選ばれます。同じ規則が、より狭い場面も決めています。ストアが返す請求期間が、画面がその横に表示するはずの期間と矛盾するとき、そのオファーはまったく使われません。数字は表示されず、その商品は購入できません。期間を返さないストアは、矛盾としては扱われません(features/purchases/subscription-period.ts:69)。
この画面の一行が何でできているか
三つの事実で、画面が受け取ったデータに対して行うことと、受け取れなかったときに行わないことのすべてが説明できます。
- 商品のリストには予備があります。価格にはありません。
- カタログの取得に失敗しても、アプリ内に持っているリストが受け止めるため、行は表示されます。価格に同じ仕組みはありません。価格はストアのオファーから来るか、まったく来ないかのどちらかです。
- プレースホルダーは値の位置を示すもので、不具合を伝えるものではありません。
- それは、アプリに渡されなかった値の位置に立っています。アプリはその位置を埋めるために、推定も、丸めも、換算も、以前の数字の再利用もしません。
- 閉じた購入の操作も、同じ条件から来ています。
- オファーがなければ購入の対象になるものがないため、操作はプレースホルダーの隣で閉じたままになります。
同じ行を、オファーがある場合とない場合で見る
行のほかの部分は変わりません。違いは価格の位置と、その隣の操作に限られます。
| 行の部分 | ストアがオファーを返した | ストアが使える内容を返さなかった |
|---|---|---|
| 行そのもの | サーバーのカタログ、またはアプリの予備のリストから描かれる | 同じように描かれる。行があること自体は変わらない |
| 価格の位置 | その端末とアカウントに対するストア自身の文字列 | プレースホルダー。アプリ自前の数字は入らない |
| 購入の操作 | 開いている | 閉じている |
| この画面での再確認 | なし | なし |
ここでやり直すためのものがない理由
ストア画面に手動の再確認はありません。この画面のどの操作も、価格をストアに二度目に問い合わせません。そしてその不在は画面の一時的な状態ではなく、この画面の作りそのものです。
読み込みを起こすものは二つあり、これは区別する価値があります。商品カタログは画面に入るたびに一度取得されるので、離れて戻ればリストは更新されます。オファーはセッションまたはアカウントの状態が変わったときに読み込まれますが、画面に入ることはその変化ではありません。プレースホルダーが往復を越えて残るのはそのためです。取得し直された部分は、そもそも欠けていた部分ではありませんでした(apps/jewelry-mobile/src/app/store/index.tsx)。
目の前の画面にどの読み方が合うか
以下の各行は、画面が取り得る形と、アプリ自身の挙動が支持する読み方です。
| 状況 | 選択 | 理由 |
|---|---|---|
| 価格が入るはずの場所に、どの行もプレースホルダーが出ている。 | 商品がなくなったのではなく、この端末とアカウントに対してオファー側が得られていないと読む。 | 行はカタログか、アプリの予備のリストから描かれます。予備は価格をまったく持ちません。 |
| ある行だけプレースホルダーで、ほかの行には数字が出ている。 | 画面の失敗ではなく、そのオファー一件が使えないと読む。 | ストアがオファーと一緒に返した請求期間が、画面に表示するはずの期間と矛盾すると、そのオファーだけが捨てられます。 |
| プレースホルダーの隣で、購入の操作が反応しない。 | この画面で操作が開くのを待たない。 | オファーの文字列が返らなかったため操作は閉じており、この画面にはそれを確認し直すものがありません。 |
| 画面を離れて戻っても、プレースホルダーがまだ残っている。 | 戻ったことで更新されたのは価格ではなくリストだと考える。 | 画面に入ると商品カタログが取得し直されます。オファーはセッションまたはアカウントの状態の変化で読み込まれます。 |
プレースホルダーが取り違えられやすいもの
画面が誘いやすい三つの読み方と、アプリの挙動が実際に支持する内容です。
商品が取り下げられた、という読み。
行があることはリストについての情報であって、オファーについての情報ではありません。リストにはストアにまったく依存しない予備の経路があります。
読み込みが終わるまで、アプリが価格を出し控えている、という読み。
出し控えている数字はありません。アプリは値を渡されていないからプレースホルダーを書くのであり、値を引き出す第二の出どころも持っていません。
画面をもう一度開くことが再試行になる、という読み。
画面に入ると取得されるのは商品カタログです。それはセッションやアカウントの変化ではなく、オファーの読み込みを引き起こすのはその変化のほうです。
このページが未解決のまま残す問い
以下はいずれも、ストア画面自身の挙動では決着がつかない範囲にあります。
- 価格、通貨、クレジットの数量、割引、パック名、プラン名は、例としても、ほかのどんな形でもここには出てきません。
- ストアが使える内容を返さないのがどのくらいの頻度なのか、ストア側のどんな条件でそうなるのかは、アプリからは読み取れません。
- ストアの提供元が内部で何をしているのか、決済シートがどう開くのか、返金や更新がどう進むのかは、このページの主題ではありません。
- 購入が始まったあとに何が起きるのか、つまり購入が取り消される場合、保留になる場合、失敗する場合を含めて、別の場所で扱われ、ここでは説明しません。
- 購入を復元すると何が起きるのか、そしてそれを提供する操作がどんな状態にあるのかは、別のページの範囲です。
- 購入後にサーバー側でクレジットがどう現れるのか、ウォレットや取引履歴の画面に何が表示されるのかは、ここで調べた画面の外側です。
よくある質問
価格が出ないとき、アプリは壊れているのですか。
プレースホルダーは、アプリが作られたとおりに動いている状態です。価格の文字列は常に、その端末とアカウントについてストアが返したオファーです。オファーがないとき、アプリは自前の数字ではなくプレースホルダーを書き、購入の操作を閉じたままにします。
アプリに価格をもう一度確認させる方法はありますか。
この画面にはありません。手動の再確認は用意されていません。商品カタログは画面に入るたびに一度取得され、オファーはセッションまたはアカウントの状態が変わったときに読み込まれます。
一つの商品だけ価格が出ず、ほかの商品には出るのはなぜですか。
ストアが一緒に返した請求期間が、画面に表示するはずの期間と矛盾する場合、そのオファーだけが破棄されます。その場合、その商品には数字が表示されず、購入もできません。
ストアに接続できないとき、商品のリストはどこから来るのですか。
リストはサーバーのカタログから取得され、その取得がうまくいかないときはアプリが自分で持っているリストに切り替わるため、行は表示されます。その予備が持つのは商品の識別子と表示用の情報だけで、価格を供給することはありません。