見出し画像

【IT】Webアプリ開発におけるSafari(PC版)対応ポイントまとめ

皆さま
こんにちは

本日は、
SafariでWebアプリを開発・運用する際の注意点を
まとめました。

今回の環境は、
PC:MacBook Air(M1)
フレームワーク:SvelteKit V5


✅ 1. `<input type="time">` が正しく動作しない(PC Safari)

  • 症状:ピッカーUIが表示されず、入力が難しい

  • 対策

    • `type="text"` に変更して手入力対応

    • `pattern="[0-2][0-9]:[0-5][0-9]"` を付けてバリデーション

    • `placeholder="例:14:30"` など入力例を明示

    • SafariのPC版以外と分岐

{#if $isPcSafari}
	<!-- 使用時刻(Safari PC用) -->
	<div class="flex-1 min-w-0 mt-4 md:mt-0">
		<label for="used_time" class="block mb-1 text-base font-bold text-gray-700">使用時刻</label>
		<!-- Safari PC版のみ:手入力+バリデーション -->
		<input
			id="used_time"
			type="text"
			name="used_time"
			bind:value={usedTime}
			pattern="[0-2][0-9]:[0-5][0-9]"
			placeholder="例:14:30"
			required
			class="w-full border rounded px-3 py-2 text-xl"
			inputmode="numeric"
			autocomplete="off"
		/>
	</div>

{:else}
	<!-- 使用時刻(Safari PC以外、Chrome等 -->
	<div class="flex-1 mt-4 md:mt-0">
		<label for="used_time" class="block mb-1 text-base font-bold text-gray-700">使用時刻</label>
		<input
			id="used_time"
			type="time"
			name="used_time"
			required
			class="w-full border rounded px-3 py-2 text-xl"
			max={$todayDate === today ? maxTime : undefined}
		/>
	</div>
{/if}
chromeの場合
Safari PC版の場合

✅ 2. `new Date('YYYY-MM')` が `Invalid Date` になる(PC Safari)

  • 症状:ピッカーUIが表示されず、入力が難しい

  • 対策:SafariのPC版は、手動で入力と注釈が表示されるように表示

{#if $isPcSafari}
	<p class="text-sm text-gray-500 mt-1">
		※ Safariでは使用期日を「YYYY-MM」形式で手入力してください。
	</p>
{/if}
chromeの場合
Safari PC版の場合

✅ 3. `window.open()` がポップアップブロックされやすい

※Safariは特に厳格で、非同期イベント内だと失敗しやすい

  • 対策

    • window.open() をまず即時で実行(ユーザー操作に反応)

    • その後、localStorage にデータを保存し、location.href で遷移

    • 開かなかった場合はアラートを表示

export async function openCsvInNewWindow() {
  // ✅ Safari対応:ユーザー操作直後に空ウィンドウを開いておく
  const newWindow = window.open('', '_blank');
  if (!newWindow) {
    alert('ポップアップがブロックされました。Safariの設定をご確認ください。');
    return;
  }

  // 🔸 データ取得
  const { getAllLogs } = await import('$lib/local-db');
  const logs = await getAllLogs();

  if (!logs || logs.length === 0) {
    newWindow.document.write('<p>CSV表示用のデータが見つかりませんでした。</p>');
    newWindow.document.close();
    return;
  }

  // 🔸 localStorage 経由で渡す
  localStorage.setItem('csvPreviewData', JSON.stringify(logs));

  // ✅ URL遷移(すでに開いているウィンドウで)
  newWindow.location.href = '/csv-preview.html';
}

✅ 4. `IndexedDB` は基本的に動作OK(ただし容量注意)

  • 状況:Safariでも動作は安定(v13以降)だが、他ブラウザより保存容量が少ない

  • 対策

    • 定期的なCSV出力を促すUI設計にする

    • ログは短期保存前提(長期保存を避ける設計)


✅ 5. CSSの :hover は iOS Safariで誤反応の可能性

  • 症状:タップ操作で :hover が発火し、ボタンなどが押されたままの状態になる

  • 対策::hover を使用する場合は、PCなどhover対応デバイスに限定する

css

@media (hover: hover) and (pointer: fine) {
  .btn:hover {
    background-color: #333;
  }
}

✅ 6. SafariでのPWA対応まとめ(2025年7月時点)

🔹 iOS Safari(iPhone / iPad)

  • Safariの「共有」→「ホーム画面に追加」でPWAとして利用可能

  • beforeinstallprompt は使えないため、独自UIで案内が必要

  • Service Worker は動作するが、通知・ストレージ制限あり

  • :hover の誤反応や window.open() の制限もあり

🔹 Mac Safari(PC)

  • manifest.json や Service Worker は認識するが、PWAインストールUIはなし

  • ChromeやEdgeのようにスタンドアロン表示は不可

  • 現時点では「PWA未対応ブラウザ」として扱うべき



では

いいなと思ったら応援しよう!