@nakamura-123/pages 1.1.10 → 1.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -171,14 +171,26 @@ var handlePurchase = function (productId) { return __awaiter(void 0, void 0, voi
171
171
  exports.handlePurchase = handlePurchase;
172
172
  // 21. 購入復元
173
173
  var restorePurchases = function (dispatch, isAlert) { return __awaiter(void 0, void 0, void 0, function () {
174
- var purchases, receipts, _i, purchases_1, purchase, receipt, finishError_1, itemError_1, storageError_1, hasWaitingPayment, error_1;
174
+ var connectionError_1, purchases, receipts, _i, purchases_1, purchase, receipt, finishError_1, itemError_1, dispatchError_1, storageError_1, hasWaitingPayment, error_1;
175
175
  return __generator(this, function (_a) {
176
176
  switch (_a.label) {
177
177
  case 0:
178
- _a.trys.push([0, 15, , 16]);
178
+ _a.trys.push([0, 23, , 24]);
179
179
  console.log("購入復元開始");
180
- return [4 /*yield*/, (0, expo_iap_1.getAvailablePurchases)()];
180
+ _a.label = 1;
181
181
  case 1:
182
+ _a.trys.push([1, 3, , 4]);
183
+ return [4 /*yield*/, (0, expo_iap_1.initConnection)()];
184
+ case 2:
185
+ _a.sent();
186
+ console.log("IAP接続完了");
187
+ return [3 /*break*/, 4];
188
+ case 3:
189
+ connectionError_1 = _a.sent();
190
+ console.warn("IAP接続は既に確立されています", connectionError_1);
191
+ return [3 /*break*/, 4];
192
+ case 4: return [4 /*yield*/, (0, expo_iap_1.getAvailablePurchases)()];
193
+ case 5:
182
194
  purchases = _a.sent();
183
195
  console.log("取得した購入アイテム: ", purchases);
184
196
  // Androidの場合、購入状態をログ出力
@@ -191,13 +203,13 @@ var restorePurchases = function (dispatch, isAlert) { return __awaiter(void 0, v
191
203
  }
192
204
  receipts = [];
193
205
  _i = 0, purchases_1 = purchases;
194
- _a.label = 2;
195
- case 2:
196
- if (!(_i < purchases_1.length)) return [3 /*break*/, 10];
206
+ _a.label = 6;
207
+ case 6:
208
+ if (!(_i < purchases_1.length)) return [3 /*break*/, 14];
197
209
  purchase = purchases_1[_i];
198
- _a.label = 3;
199
- case 3:
200
- _a.trys.push([3, 8, , 9]);
210
+ _a.label = 7;
211
+ case 7:
212
+ _a.trys.push([7, 12, , 13]);
201
213
  receipt = (0, ReceiptFnc_1.unifyReceipt)(purchase);
202
214
  if (receipt) {
203
215
  console.log("レシート情報: ", {
@@ -217,51 +229,60 @@ var restorePurchases = function (dispatch, isAlert) { return __awaiter(void 0, v
217
229
  else {
218
230
  console.warn("レシートの統一に失敗(スキップします): ", purchase);
219
231
  }
220
- if (!checkIsAcknowledgedAndroid(purchase)) return [3 /*break*/, 7];
221
- _a.label = 4;
222
- case 4:
223
- _a.trys.push([4, 6, , 7]);
232
+ if (!checkIsAcknowledgedAndroid(purchase)) return [3 /*break*/, 11];
233
+ _a.label = 8;
234
+ case 8:
235
+ _a.trys.push([8, 10, , 11]);
224
236
  return [4 /*yield*/, (0, expo_iap_1.finishTransaction)({ purchase: purchase, isConsumable: false })];
225
- case 5:
237
+ case 9:
226
238
  _a.sent();
227
239
  console.log("トランザクション完了: ", purchase.productId);
228
- return [3 /*break*/, 7];
229
- case 6:
240
+ return [3 /*break*/, 11];
241
+ case 10:
230
242
  finishError_1 = _a.sent();
231
243
  console.error("トランザクション完了エラー(継続します): ", finishError_1);
232
- return [3 /*break*/, 7];
233
- case 7: return [3 /*break*/, 9];
234
- case 8:
244
+ return [3 /*break*/, 11];
245
+ case 11: return [3 /*break*/, 13];
246
+ case 12:
235
247
  itemError_1 = _a.sent();
236
248
  console.error("購入アイテムの処理エラー(次のアイテムへ継続): ", itemError_1);
237
249
  console.error("問題のあるアイテム: ", purchase);
238
- return [3 /*break*/, 9];
239
- case 9:
250
+ return [3 /*break*/, 13];
251
+ case 13:
240
252
  _i++;
241
- return [3 /*break*/, 2];
242
- case 10:
243
- // 購入アイテムがない場合はAllFreeの状態を更新
244
- if (receipts.length === 0) {
245
- try {
246
- dispatch((0, exports.updateAllFreeState)(null));
247
- }
248
- catch (dispatchError) {
249
- console.error("状態更新エラー(null時): ", dispatchError);
250
- }
251
- }
252
- if (!(receipts.length > 0)) return [3 /*break*/, 14];
253
- _a.label = 11;
254
- case 11:
255
- _a.trys.push([11, 13, , 14]);
253
+ return [3 /*break*/, 6];
254
+ case 14:
255
+ if (!(receipts.length === 0)) return [3 /*break*/, 18];
256
+ console.warn('購入アイテムが見つかりませんでした。状態を"none"に更新します(返金済み等)');
257
+ _a.label = 15;
258
+ case 15:
259
+ _a.trys.push([15, 17, , 18]);
260
+ dispatch((0, exports.updateAllFreeState)(null));
261
+ // 🔧 重要:Keychainも空にする(返金時に古いデータが残らないように)
262
+ return [4 /*yield*/, stores_1.coinStorage.replacePurchasedItems([])];
263
+ case 16:
264
+ // 🔧 重要:Keychainも空にする(返金時に古いデータが残らないように)
265
+ _a.sent();
266
+ console.log("Keychainの購入データを削除しました");
267
+ return [3 /*break*/, 18];
268
+ case 17:
269
+ dispatchError_1 = _a.sent();
270
+ console.error("状態更新エラー(null時): ", dispatchError_1);
271
+ return [3 /*break*/, 18];
272
+ case 18:
273
+ if (!(receipts.length > 0)) return [3 /*break*/, 22];
274
+ _a.label = 19;
275
+ case 19:
276
+ _a.trys.push([19, 21, , 22]);
256
277
  return [4 /*yield*/, stores_1.coinStorage.replacePurchasedItems(receipts)];
257
- case 12:
278
+ case 20:
258
279
  _a.sent();
259
- return [3 /*break*/, 14];
260
- case 13:
280
+ return [3 /*break*/, 22];
281
+ case 21:
261
282
  storageError_1 = _a.sent();
262
283
  console.error("ストレージ保存エラー: ", storageError_1);
263
- return [3 /*break*/, 14];
264
- case 14:
284
+ return [3 /*break*/, 22];
285
+ case 22:
265
286
  console.log("購入復元完了: ", receipts.length, "件");
266
287
  // アラート表示(支払い待ち状態を考慮)
267
288
  if (isAlert) {
@@ -285,7 +306,7 @@ var restorePurchases = function (dispatch, isAlert) { return __awaiter(void 0, v
285
306
  }
286
307
  }
287
308
  return [2 /*return*/, receipts]; // 復元アイテムがあればpurchasesを返す
288
- case 15:
309
+ case 23:
289
310
  error_1 = _a.sent();
290
311
  console.error("Restore Error: ", error_1);
291
312
  console.error("エラーの詳細: ", error_1 instanceof Error ? error_1.message : String(error_1));
@@ -293,7 +314,7 @@ var restorePurchases = function (dispatch, isAlert) { return __awaiter(void 0, v
293
314
  isAlert &&
294
315
  alert("購入アイテムの復元に失敗しました。しばらく時間を置いた後、もう一度実行してみてください。もしそれでも購入できない場合は「よくある質問」をご確認いただくか、必要に応じて「お問い合わせフォーム」からご連絡ください。");
295
316
  return [2 /*return*/, null]; // エラーが発生した場合もnullを返す
296
- case 16: return [2 /*return*/];
317
+ case 24: return [2 /*return*/];
297
318
  }
298
319
  });
299
320
  }); };
@@ -6,40 +6,40 @@ exports.faqEnDatas = [
6
6
  title: "購入・支払いについて",
7
7
  lists: [
8
8
  {
9
- que: "課金額は毎月発生するのでしょうか ",
10
- ans: "課金は買い切りであり、サブスクリプションのように毎月課金されるわけではありません。一度ご購入いただければ、次年度以降もご利用いただけます。",
9
+ que: "課金額は毎月発生するのでしょうか",
10
+ ans: "当アプリの有料版は「買い切り型」です。サブスクリプション(月額課金)のように毎月料金が発生することはありません。\n一度ご購入いただければ、翌年以降も引き続きご利用いただけます。",
11
11
  },
12
12
  {
13
13
  que: "有料版へアップグレードすれば、解説が表示されますか",
14
- ans: "無料版で解説が表示されていない場合は、有料版でも解説は表示されません(無料版で解説が付いているアプリの場合は、有料版の問題も同程度の解説があります)。無料版で使用感を十分にご確認ください。",
14
+ ans: "無料版で解説がない問題は、有料版でも解説は表示されません。\n無料版で解説がついている問題と同等の解説が有料版にも用意されています。\n\nまずは無料版でアプリの仕様や使用感を十分にお試しください。",
15
15
  },
16
16
  {
17
17
  que: "複数回購入してしまいました",
18
- ans: " 購入手続きについては、各プラットフォーム(AppleもしくはGoogle)の決済システムを利用しております。まずは購入の際に届いているメールや、各プラットフォーム(appleもしくはGoogle)にて購入履歴をご確認ください。確認方法はお手数ですが各公式サイトなどをご参照ください。\n 複数回は購入できぬようにシステムを組んではおりますが、確認の結果、複数回購入していた場合は至急対応いたしますので、「お問い合わせ」からご連絡ください。",
18
+ ans: "当アプリはAppleまたはGoogleの決済システムを利用しております。\nまずは各ストアからの購入完了メールや購入履歴をご確認ください(確認方法は各公式サイトをご参照ください)。\n\nシステム上、重複購入はできない仕組みになっておりますが、万が一複数回の請求が発生している場合は至急対応いたします。\nお手数ですがアプリ内の「お問い合わせ」よりご連絡ください。",
19
19
  },
20
20
  {
21
21
  que: "以前購入したにも関わらず、復元に失敗します",
22
- ans: " 以前ご購入いただいたにもかかわらず復元に失敗する場合、決済システム(AppleまたはGoogle)における不具合が考えられます。 お手数をおかけいたしますが、「報告」ボタンよりメールアドレスをご入力のうえ、ご報告ください。\n\n なお、場合によっては一度返金を行い、再度ご購入いただく可能性がございます。 何卒ご理解のほどよろしくお願い申し上げます。",
22
+ ans: "復元ができない場合、AppleまたはGoogleの決済システムのエラーの可能性がございます。\nまずは各アプリストア(Google Play等)で当アプリを検索し、最新版へアップデートしていただいた上でで、以下の手順で復元をお試しください。\n\n【購入状態の復元手順】\n1. アプリを最新バージョンへアップデート\n2. トップ画面から「アンロック」をタップ\n3. 画面中央の「以前購入した方はこちらから復元」をタップ\n\n上記をお試しいただいても解決しない場合は、お手数ですがアプリ内の「報告」よりメールアドレスを添えて状況をご報告ください。",
23
23
  },
24
24
  {
25
- que: "手続きに時間がかかるのですが。",
26
- ans: "通信環境にもよりますが、課金情報の読み込みには一定の時間がかかります。画面上は特に反応がない場合も、処理を行っております。数十秒程度そのままでお待ち下さい。",
25
+ que: "手続きに時間がかかるのですが",
26
+ ans: "通信環境により、課金情報の読み込みに時間がかかる場合がございます。画面に変化がない場合でも裏側で処理を行っておりますので、数十秒程度そのままの状態で少しお待ちください。",
27
27
  },
28
28
  {
29
29
  que: "購入手続きが失敗する",
30
- ans: " 購入手続きが失敗となる場合は、以下のいずれかの可能性が考えられます。 \n 1.すでに購入が済んでいる場合があります。問題が画面や単元別、試験別画面をご確認ください。 \n2.アプリを削除したり、iPhoneを替えたりした場合は、購入状態をアプリが判別できません。この場合は、アップグレードページの「以前購入した方はこちらから復元」ボタンをタップしてください。 \n3.通信環境やアカウントの状態等により、購入が正しく行えない場合があります。 お手数ですが、画面の表示動作についてご連絡いただけるでしょうか。 連絡の際は、下記のアドレスへメールいただければ幸いです。 \ndk2drill@gmail.com ",
30
+ ans: "購入手続きが失敗する場合、以下の原因が考えられます。\n1. すでに購入が完了している:問題画面等で有料機能が解放されていないかご確認ください。\n2. 通信環境の問題:通信が安定した場所で再度お試しください。\n3. アプリの再インストールや機種変更をした:新規購入ではなく「復元」の手続きが必要です。\n\n購入や復元ができない場合、AppleまたはGoogleの決済システムのエラーの可能性がございます。\nまずは各アプリストア(Google Play等)で当アプリを検索し、最新版へアップデートしていただいた上で、以下の手順で復元をお試しください。\n\n【購入状態の復元手順】\n1. アプリを最新バージョンへアップデート\n2. トップ画面から「アンロック」をタップ\n3. 画面中央の「以前購入した方はこちらから復元」をタップ\n\n上記をお試しいただいても解決しない場合は、詳しい状況(画面の表示内容やエラーメッセージなど)を添えて、お手数ですがアプリ内の「報告」よりメールアドレスをご入力のうえご報告いただくか、下記サポートまでメールにてご連絡ください。\nsupport@drill-notes.com",
31
31
  },
32
32
  {
33
- que: "コンビニ支払いをしたが、有料版を利用できません。",
34
- ans: " Androidでのコンビニ支払いをご利用の場合、決済完了後に「以前購入した方はこちらから復元」をタップする必要があります。\n また、時間が経ってもサービスが利用できない場合には、大変恐れ入りますが、以下のメールアドレスまでご連絡の上、クレジットカード等の他の支払い方法で再度お手続きいただけますようお願いいたします。\ndk2drill@gmail.com ",
33
+ que: "コンビニ支払いをしたが、有料版を利用できません",
34
+ ans: "Android版でコンビニ支払いをご利用の場合、決済完了後にアプリ内の「以前購入した方はこちらから復元」ボタンをタップしていただく必要がございます。\nしばらく待って復元をお試しいただいても有料版が利用できない場合は、恐れ入りますがアプリ内の「報告」より、必ずメールアドレスを添えてご連絡ください。\n\n場合によっては、別のお支払い方法(クレジットカード等)での再手続きをご案内することがございます。",
35
35
  },
36
36
  {
37
37
  que: "領収書を発行することはできますか",
38
- ans: "当アプリは、Google PlayやApp Storeの決済システムを利用しております。領収書につきましては、各プラットフォームの購入履歴等から発行することが可能です。",
38
+ ans: "当アプリの決済にはApple(App Store)およびGoogle(Google Play)のシステムを利用しているため、弊社からの直接的な領収書発行は行っておりません。\n\n領収書につきましては、AppleGoogleの各アカウントの「購入履歴」や「ご請求内容」などから直接ご確認および発行していただくことが可能です。\n詳細な手順につきましては、お手数ですが各プラットフォーム(AppleまたはGoogle)の公式サイトやヘルプページをご参照ください。",
39
39
  },
40
40
  {
41
41
  que: "法人契約や団体契約はできますか",
42
- ans: "法人契約や団体契約については、対応しておりません。現状では個人のユーザー様のみの対応となりますので、あらかじめご了承ください。",
42
+ ans: "申し訳ございませんが、現在、法人契約や団体向けの一括契約には対応しておりません。個人のお客様向けのご提供のみとなっておりますので、何卒ご了承ください。",
43
43
  },
44
44
  ],
45
45
  },
@@ -48,15 +48,19 @@ exports.faqEnDatas = [
48
48
  lists: [
49
49
  {
50
50
  que: "機種変更を行ったら、有料プランが利用できなくなりました",
51
- ans: " 機種変更前と同じアカウントを利用している場合、課金データを引き継ぐことができます。この場合は、アップグレードページの「以前購入した方はこちらから復元」ボタンをタップしてください。\n ただし、iPhoneからAndroidへの乗り換え等の場合は、利用アカウントが異なり同一ユーザーの利用が確認できないため、別途改めてAndroid側で購入いただく必要があります。ご理解ください。",
51
+ ans: "機種変更前と同じストアアカウント(Apple ID または Google アカウント)をご利用の場合は、購入状態を引き継ぐことができます。\nアンロック画面にある「以前購入した方はこちらから復元」をタップしてください。\n\nただし、iPhoneからAndroid(またはその逆)へ機種変更された場合は、異なるアカウント間で購入情報を引き継ぐことができない仕様となっております。\n誠に恐れ入りますが、新しい端末側で再度ご購入いただく必要がございます。何卒ご了承ください。",
52
52
  },
53
53
  {
54
54
  que: "機種間のデータ連携はできるでしょうか",
55
- ans: " データはすべて各機種へ保存しております。現状のシステムでは、iPhoneとiPadに限らず、機種を超えてのデータ連携をすることはできません。",
55
+ ans: "当アプリの学習データ等は、すべてご利用の端末本体に保存される仕組みとなっております。\nそのため大変申し訳ございませんが、現状のシステムではiPhoneとiPad間などを含め、異なる端末間でデータを同期・連携することはできません。",
56
56
  },
57
57
  {
58
58
  que: "効果音が出ません",
59
- ans: "端末がマナーモードの場合は、音が出ません。一度マナーモードを解除してお試しください。",
59
+ ans: "端末がマナーモード(消音モード)に設定されている場合、アプリ内の効果音は鳴らない仕様となっております。お手数ですが、一度端末のマナーモード設定を解除した上でお試しください。",
60
+ },
61
+ {
62
+ que: "効果音が消せません",
63
+ ans: "アプリ内の操作音を消すには、以下の手順にて設定の変更をお願いいたします。\n\n【操作音を消す手順】\n1. アプリ内の「クイズページ(いずれかの問題を開始)」を開いてください。\n2. 画面右上にございます「設定ボタン」をタップしてください。\n3. 設定メニュー内の「音量」を「0」に設定してください。",
60
64
  },
61
65
  ],
62
66
  },
@@ -65,11 +69,11 @@ exports.faqEnDatas = [
65
69
  lists: [
66
70
  {
67
71
  que: "最新の試験はいつ公開されるのでしょうか",
68
- ans: "当アプリでは、前年の試験問題までを掲載しております。試験により多少前後いたしますが、試験日の約1〜2ヶ月前までに公開できるよう準備を進めております。",
72
+ ans: "当アプリでは、原則として前年に実施された試験問題までを掲載しております。試験の種類によって多少前後いたしますが、次回の試験日の約1〜2ヶ月前までには最新の過去問を追加・公開できるよう準備を進めております。",
69
73
  },
70
74
  {
71
75
  que: "以前のシステムで記述データのオンライン保存を行いましたが、どのように読み込めばよいですか",
72
- ans: " 以前のシステムに保存されている記述データにつきましては、一度こちらで手続きを行う必要がございます。 お手数をおかけいたしますが、「報告」ボタンよりメールアドレスをご入力のうえ、ご報告ください。\n\n また、可能であれば、ご設定いただいたIDも併せてお知らせください。 ",
76
+ ans: "以前のシステムで保存された記述データを読み込むには、運営側での移行手続きが必要となります。\nお手数をおかけいたしますが、アプリ内の「報告」よりご連絡可能なメールアドレスをご入力のうえ、データの引き継ぎをご希望の旨をご連絡ください。\n\nなお、ご連絡の際に以前のシステムでご設定いただいた「ID」も併せてお知らせいただけますと、よりスムーズな対応が可能となります。",
73
77
  },
74
78
  ],
75
79
  },
@@ -6,40 +6,40 @@ exports.faqJaDatas = [
6
6
  title: "購入・支払いについて",
7
7
  lists: [
8
8
  {
9
- que: "課金額は毎月発生するのでしょうか ",
10
- ans: "課金は買い切りであり、サブスクリプションのように毎月課金されるわけではありません。一度ご購入いただければ、次年度以降もご利用いただけます。",
9
+ que: "課金額は毎月発生するのでしょうか",
10
+ ans: "当アプリの有料版は「買い切り型」です。サブスクリプション(月額課金)のように毎月料金が発生することはありません。\n一度ご購入いただければ、翌年以降も引き続きご利用いただけます。",
11
11
  },
12
12
  {
13
13
  que: "有料版へアップグレードすれば、解説が表示されますか",
14
- ans: "無料版で解説が表示されていない場合は、有料版でも解説は表示されません(無料版で解説が付いているアプリの場合は、有料版の問題も同程度の解説があります)。無料版で使用感を十分にご確認ください。",
14
+ ans: "無料版で解説がない問題は、有料版でも解説は表示されません。\n無料版で解説がついている問題と同等の解説が有料版にも用意されています。\n\nまずは無料版でアプリの仕様や使用感を十分にお試しください。",
15
15
  },
16
16
  {
17
17
  que: "複数回購入してしまいました",
18
- ans: " 購入手続きについては、各プラットフォーム(AppleもしくはGoogle)の決済システムを利用しております。まずは購入の際に届いているメールや、各プラットフォーム(appleもしくはGoogle)にて購入履歴をご確認ください。確認方法はお手数ですが各公式サイトなどをご参照ください。\n 複数回は購入できぬようにシステムを組んではおりますが、確認の結果、複数回購入していた場合は至急対応いたしますので、「お問い合わせ」からご連絡ください。",
18
+ ans: "当アプリはAppleまたはGoogleの決済システムを利用しております。\nまずは各ストアからの購入完了メールや購入履歴をご確認ください(確認方法は各公式サイトをご参照ください)。\n\nシステム上、重複購入はできない仕組みになっておりますが、万が一複数回の請求が発生している場合は至急対応いたします。\nお手数ですがアプリ内の「お問い合わせ」よりご連絡ください。",
19
19
  },
20
20
  {
21
21
  que: "以前購入したにも関わらず、復元に失敗します",
22
- ans: " 以前ご購入いただいたにもかかわらず復元に失敗する場合、決済システム(AppleまたはGoogle)における不具合が考えられます。 お手数をおかけいたしますが、「報告」ボタンよりメールアドレスをご入力のうえ、ご報告ください。\n\n なお、場合によっては一度返金を行い、再度ご購入いただく可能性がございます。 何卒ご理解のほどよろしくお願い申し上げます。",
22
+ ans: "復元ができない場合、AppleまたはGoogleの決済システムのエラーの可能性がございます。\nまずは各アプリストア(Google Play等)で当アプリを検索し、最新版へアップデートしていただいた上でで、以下の手順で復元をお試しください。\n\n【購入状態の復元手順】\n1. アプリを最新バージョンへアップデート\n2. トップ画面から「アンロック」をタップ\n3. 画面中央の「以前購入した方はこちらから復元」をタップ\n\n上記をお試しいただいても解決しない場合は、お手数ですがアプリ内の「報告」よりメールアドレスを添えて状況をご報告ください。",
23
23
  },
24
24
  {
25
- que: "手続きに時間がかかるのですが。",
26
- ans: "通信環境にもよりますが、課金情報の読み込みには一定の時間がかかります。画面上は特に反応がない場合も、処理を行っております。数十秒程度そのままでお待ち下さい。",
25
+ que: "手続きに時間がかかるのですが",
26
+ ans: "通信環境により、課金情報の読み込みに時間がかかる場合がございます。画面に変化がない場合でも裏側で処理を行っておりますので、数十秒程度そのままの状態で少しお待ちください。",
27
27
  },
28
28
  {
29
29
  que: "購入手続きが失敗する",
30
- ans: " 購入手続きが失敗となる場合は、以下のいずれかの可能性が考えられます。 \n 1.すでに購入が済んでいる場合があります。問題が画面や単元別、試験別画面をご確認ください。 \n2.アプリを削除したり、iPhoneを替えたりした場合は、購入状態をアプリが判別できません。この場合は、アップグレードページの「以前購入した方はこちらから復元」ボタンをタップしてください。 \n3.通信環境やアカウントの状態等により、購入が正しく行えない場合があります。 お手数ですが、画面の表示動作についてご連絡いただけるでしょうか。 連絡の際は、下記のアドレスへメールいただければ幸いです。 \ndk2drill@gmail.com ",
30
+ ans: "購入手続きが失敗する場合、以下の原因が考えられます。\n1. すでに購入が完了している:問題画面等で有料機能が解放されていないかご確認ください。\n2. 通信環境の問題:通信が安定した場所で再度お試しください。\n3. アプリの再インストールや機種変更をした:新規購入ではなく「復元」の手続きが必要です。\n\n購入や復元ができない場合、AppleまたはGoogleの決済システムのエラーの可能性がございます。\nまずは各アプリストア(Google Play等)で当アプリを検索し、最新版へアップデートしていただいた上で、以下の手順で復元をお試しください。\n\n【購入状態の復元手順】\n1. アプリを最新バージョンへアップデート\n2. トップ画面から「アンロック」をタップ\n3. 画面中央の「以前購入した方はこちらから復元」をタップ\n\n上記をお試しいただいても解決しない場合は、詳しい状況(画面の表示内容やエラーメッセージなど)を添えて、お手数ですがアプリ内の「報告」よりメールアドレスをご入力のうえご報告いただくか、下記サポートまでメールにてご連絡ください。\nsupport@drill-notes.com",
31
31
  },
32
32
  {
33
- que: "コンビニ支払いをしたが、有料版を利用できません。",
34
- ans: " Androidでのコンビニ支払いをご利用の場合、決済完了後に「以前購入した方はこちらから復元」をタップする必要があります。\n また、時間が経ってもサービスが利用できない場合には、大変恐れ入りますが、以下のメールアドレスまでご連絡の上、クレジットカード等の他の支払い方法で再度お手続きいただけますようお願いいたします。\ndk2drill@gmail.com ",
33
+ que: "コンビニ支払いをしたが、有料版を利用できません",
34
+ ans: "Android版でコンビニ支払いをご利用の場合、決済完了後にアプリ内の「以前購入した方はこちらから復元」ボタンをタップしていただく必要がございます。\nしばらく待って復元をお試しいただいても有料版が利用できない場合は、恐れ入りますがアプリ内の「報告」より、必ずメールアドレスを添えてご連絡ください。\n\n場合によっては、別のお支払い方法(クレジットカード等)での再手続きをご案内することがございます。",
35
35
  },
36
36
  {
37
37
  que: "領収書を発行することはできますか",
38
- ans: "当アプリは、Google PlayやApp Storeの決済システムを利用しております。領収書につきましては、各プラットフォームの購入履歴等から発行することが可能です。",
38
+ ans: "当アプリの決済にはApple(App Store)およびGoogle(Google Play)のシステムを利用しているため、弊社からの直接的な領収書発行は行っておりません。\n\n領収書につきましては、AppleGoogleの各アカウントの「購入履歴」や「ご請求内容」などから直接ご確認および発行していただくことが可能です。\n詳細な手順につきましては、お手数ですが各プラットフォーム(AppleまたはGoogle)の公式サイトやヘルプページをご参照ください。",
39
39
  },
40
40
  {
41
41
  que: "法人契約や団体契約はできますか",
42
- ans: "法人契約や団体契約については、対応しておりません。現状では個人のユーザー様のみの対応となりますので、あらかじめご了承ください。",
42
+ ans: "申し訳ございませんが、現在、法人契約や団体向けの一括契約には対応しておりません。個人のお客様向けのご提供のみとなっておりますので、何卒ご了承ください。",
43
43
  },
44
44
  ],
45
45
  },
@@ -48,15 +48,19 @@ exports.faqJaDatas = [
48
48
  lists: [
49
49
  {
50
50
  que: "機種変更を行ったら、有料プランが利用できなくなりました",
51
- ans: " 機種変更前と同じアカウントを利用している場合、課金データを引き継ぐことができます。この場合は、アップグレードページの「以前購入した方はこちらから復元」ボタンをタップしてください。\n ただし、iPhoneからAndroidへの乗り換え等の場合は、利用アカウントが異なり同一ユーザーの利用が確認できないため、別途改めてAndroid側で購入いただく必要があります。ご理解ください。",
51
+ ans: "機種変更前と同じストアアカウント(Apple ID または Google アカウント)をご利用の場合は、購入状態を引き継ぐことができます。\nアンロック画面にある「以前購入した方はこちらから復元」をタップしてください。\n\nただし、iPhoneからAndroid(またはその逆)へ機種変更された場合は、異なるアカウント間で購入情報を引き継ぐことができない仕様となっております。\n誠に恐れ入りますが、新しい端末側で再度ご購入いただく必要がございます。何卒ご了承ください。",
52
52
  },
53
53
  {
54
54
  que: "機種間のデータ連携はできるでしょうか",
55
- ans: " データはすべて各機種へ保存しております。現状のシステムでは、iPhoneとiPadに限らず、機種を超えてのデータ連携をすることはできません。",
55
+ ans: "当アプリの学習データ等は、すべてご利用の端末本体に保存される仕組みとなっております。\nそのため大変申し訳ございませんが、現状のシステムではiPhoneとiPad間などを含め、異なる端末間でデータを同期・連携することはできません。",
56
56
  },
57
57
  {
58
58
  que: "効果音が出ません",
59
- ans: "端末がマナーモードの場合は、音が出ません。一度マナーモードを解除してお試しください。",
59
+ ans: "端末がマナーモード(消音モード)に設定されている場合、アプリ内の効果音は鳴らない仕様となっております。お手数ですが、一度端末のマナーモード設定を解除した上でお試しください。",
60
+ },
61
+ {
62
+ que: "効果音が消せません",
63
+ ans: "アプリ内の操作音を消すには、以下の手順にて設定の変更をお願いいたします。\n\n【操作音を消す手順】\n1. アプリ内の「クイズページ(いずれかの問題を開始)」を開いてください。\n2. 画面右上にございます「設定ボタン」をタップしてください。\n3. 設定メニュー内の「音量」を「0」に設定してください。",
60
64
  },
61
65
  ],
62
66
  },
@@ -65,11 +69,11 @@ exports.faqJaDatas = [
65
69
  lists: [
66
70
  {
67
71
  que: "最新の試験はいつ公開されるのでしょうか",
68
- ans: "当アプリでは、前年の試験問題までを掲載しております。試験により多少前後いたしますが、試験日の約1〜2ヶ月前までに公開できるよう準備を進めております。",
72
+ ans: "当アプリでは、原則として前年に実施された試験問題までを掲載しております。試験の種類によって多少前後いたしますが、次回の試験日の約1〜2ヶ月前までには最新の過去問を追加・公開できるよう準備を進めております。",
69
73
  },
70
74
  {
71
75
  que: "以前のシステムで記述データのオンライン保存を行いましたが、どのように読み込めばよいですか",
72
- ans: " 以前のシステムに保存されている記述データにつきましては、一度こちらで手続きを行う必要がございます。 お手数をおかけいたしますが、「報告」ボタンよりメールアドレスをご入力のうえ、ご報告ください。\n\n また、可能であれば、ご設定いただいたIDも併せてお知らせください。 ",
76
+ ans: "以前のシステムで保存された記述データを読み込むには、運営側での移行手続きが必要となります。\nお手数をおかけいたしますが、アプリ内の「報告」よりご連絡可能なメールアドレスをご入力のうえ、データの引き継ぎをご希望の旨をご連絡ください。\n\nなお、ご連絡の際に以前のシステムでご設定いただいた「ID」も併せてお知らせいただけますと、よりスムーズな対応が可能となります。",
73
77
  },
74
78
  ],
75
79
  },
@@ -65,8 +65,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
65
65
  var react_1 = __importStar(require("react"));
66
66
  var react_redux_1 = require("react-redux");
67
67
  var stores_1 = require("@nakamura-123/stores");
68
- // import RNIap, { endConnection } from "react-native-iap";
69
- var expo_iap_1 = require("expo-iap");
70
68
  var CoinPageComponent_1 = __importDefault(require("../component/Coin/CoinPageComponent"));
71
69
  var CoinFnc_1 = require("../component/Coin/CoinFnc");
72
70
  var ReceiptFnc_1 = require("../component/Coin/ReceiptFnc");
@@ -83,10 +81,11 @@ var CoinPage = function (_a) {
83
81
  var items = allFreeId ? [allFreeId] : [];
84
82
  (0, react_1.useEffect)(function () {
85
83
  (0, CoinFnc_1.initializeIAP)(items, setProducts, setLoading);
86
- // アンマウント時に接続を終了
87
- return function () {
88
- (0, expo_iap_1.endConnection)();
89
- };
84
+ // 🔧 修正4: endConnection()を削除(接続を維持)
85
+ // アプリ終了時に自動的に切断されるため、明示的な切断は不要
86
+ // return () => {
87
+ // endConnection();
88
+ // };
90
89
  }, []);
91
90
  // 02.購入時の処理の実行
92
91
  var handlePurchaseItem = function (productId) { return __awaiter(void 0, void 0, void 0, function () {
@@ -144,6 +143,7 @@ var CoinPage = function (_a) {
144
143
  switch (_a.label) {
145
144
  case 0:
146
145
  setLoading(true); // 処理開始
146
+ receipts = null;
147
147
  _a.label = 1;
148
148
  case 1:
149
149
  _a.trys.push([1, 3, 4, 5]);
@@ -167,7 +167,22 @@ var CoinPage = function (_a) {
167
167
  console.error("エラーの詳細: ", error_2 instanceof Error ? error_2.message : String(error_2));
168
168
  return [3 /*break*/, 5];
169
169
  case 4:
170
- dispatch(stores_1.settingStorage.saveSetting());
170
+ // 🔧 修正5(再修正): エラー時のみ保存しない、正常完了時は常に保存
171
+ // receipts === null → 通信エラー等(状態を保持)
172
+ // receipts === [] → 購入なし/返金済み("none"に更新して保存)
173
+ // receipts !== null → 正常に取得完了(常に保存)
174
+ if (receipts !== null) {
175
+ dispatch(stores_1.settingStorage.saveSetting());
176
+ if (receipts.length > 0) {
177
+ console.log("\u5FA9\u5143\u6210\u529F\uFF1A".concat(receipts.length, "\u4EF6\u306E\u8CFC\u5165\u3092\u78BA\u8A8D\u3057\u3001\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F"));
178
+ }
179
+ else {
180
+ console.log('復元完了:購入アイテムなし(返金済み等)。状態を"none"に更新しました');
181
+ }
182
+ }
183
+ else {
184
+ console.log("復元エラー:通信失敗等のため設定を保存しませんでした(既存状態を保持)");
185
+ }
171
186
  setLoading(false); // 処理終了
172
187
  return [7 /*endfinally*/];
173
188
  case 5: return [2 /*return*/];
@@ -76,6 +76,7 @@ var WaitingPayBanner_1 = __importDefault(require("../component/Coin/WaitingPayBa
76
76
  var oldStorageFnc_1 = require("../functions/oldStorageFnc");
77
77
  var OpeningMsg_1 = __importDefault(require("../component/Home/OpeningMsg"));
78
78
  var TransBtn_1 = __importDefault(require("../component/SettingBtns/TransBtn"));
79
+ var CoinFnc_1 = require("../component/Coin/CoinFnc");
79
80
  var MenuRectangle = function (_a) {
80
81
  var menu = _a.menu, navigation = _a.navigation;
81
82
  var title = menu.title, note = menu.note, icon = menu.icon, color = menu.color, link = menu.link;
@@ -123,6 +124,39 @@ var HomePage = function (_a) {
123
124
  }); };
124
125
  fetchOldData();
125
126
  }, [showLoadOldData, settingAsyncLoaded, language]);
127
+ // 🔧 修正6: アプリ起動時にKeychainから購入情報を復元
128
+ (0, react_1.useEffect)(function () {
129
+ if (!settingAsyncLoaded)
130
+ return;
131
+ var restorePurchaseState = function () { return __awaiter(void 0, void 0, void 0, function () {
132
+ var receipts, error_1;
133
+ return __generator(this, function (_a) {
134
+ switch (_a.label) {
135
+ case 0:
136
+ _a.trys.push([0, 2, , 3]);
137
+ return [4 /*yield*/, stores_1.coinStorage.loadPurchasedItems()];
138
+ case 1:
139
+ receipts = _a.sent();
140
+ if (receipts && receipts.length > 0) {
141
+ console.log("HomePage\u8D77\u52D5\u6642: ".concat(receipts.length, "\u4EF6\u306E\u8CFC\u5165\u60C5\u5831\u3092\u5FA9\u5143\u3057\u307E\u3059"));
142
+ receipts.forEach(function (receipt) {
143
+ dispatch((0, CoinFnc_1.updateAllFreeState)(receipt));
144
+ });
145
+ }
146
+ else {
147
+ console.log("HomePage起動時: 購入情報が見つかりませんでした");
148
+ }
149
+ return [3 /*break*/, 3];
150
+ case 2:
151
+ error_1 = _a.sent();
152
+ console.error("購入情報の読み込みに失敗しました:", error_1);
153
+ return [3 /*break*/, 3];
154
+ case 3: return [2 /*return*/];
155
+ }
156
+ });
157
+ }); };
158
+ restorePurchaseState();
159
+ }, [settingAsyncLoaded]);
126
160
  // これはデバッグ用です。
127
161
  (0, react_1.useEffect)(function () {
128
162
  if (__DEV__)