Next.js + react-pdfを利用 iPhoneでPDF1ページしか表示されない解決方法
iPhone Safari での PDF 全ページ表示問題を解決するため、<iframe> を使った PDF 表示を廃止し、react-pdf を用いた全ページレンダリングに切り替えた。 iframe では、 iOS Safari において PDF が1ページ目しか表示されなかった。
使用パッケージとバージョン
| パッケージ | バージョン | 備考 |
|---|---|---|
react-pdf | ^10.4.1 | Document / Page コンポーネント提供 |
pdfjs-dist | ^5.4.296 | react-pdf が内部で使うバージョンに合わせる(重要) |
インストール
pnpm install react-pdf pdfjs-dist@5.4.296
pdfjs-dist のバージョンは必ず react-pdf が要求するものに揃えること。 バージョンが異なると後述のバージョン不一致エラーが発生する。
遭遇したエラーと解決
エラー 1: DOMMatrix is not defined(SSRエラー)
const SCALE_MATRIX = new DOMMatrix();digest: ‘534975899’
原因: pdfjs-dist のモジュール初期化時に DOMMatrix(ブラウザ専用API)を使用しているため、 Next.js の SSR フェーズ(Node.js 環境)でクラッシュする。'use client' を付けてもモジュールの初期化はサーバーで走るため回避できない。
解決策: react-pdf を使うコンポーネントを別ファイル(PdfViewer.tsx)に分離し、next/dynamic の ssr: false でクライアントのみ読み込む。
// IntroMediaOverlay.tsx
import dynamic from 'next/dynamic';
const PdfViewer = dynamic(
() => import('@/components/PdfViewer'),
{ ssr: false }
);
エラー 2: API version does not match Worker version
エラー内容:UnknownErrorException: The API version "5.4.296" does not match the Worker version "5.5.207".
原因: package.json に直接インストールされた pdfjs-dist が 5.5.207 だったのに対し、react-pdf 内部が使う pdfjs-dist は 5.4.296 だった。 Worker ファイルの解決に 5.5.207、API には 5.4.296 が使われバージョン不一致になった。
解決策: pdfjs-dist を react-pdf が要求するバージョンに固定する。
pnpm install pdfjs-dist@5.4.296
確認方法:
cat node_modules/react-pdf/package.json | grep pdfjs-dist
# → "pdfjs-dist": "5.4.296"
実装コード
PdfViewer.tsx(react-pdf 本体)
// src/components/PdfViewer.tsx
'use client';
import { useRef, useState, useCallback } from 'react';
import { Document, Page, pdfjs } from 'react-pdf';
import 'react-pdf/dist/Page/AnnotationLayer.css';
import 'react-pdf/dist/Page/TextLayer.css';
pdfjs.GlobalWorkerOptions.workerSrc = new URL(
'pdfjs-dist/build/pdf.worker.min.mjs',
import.meta.url,
).toString();
export default function PdfViewer({ url }: { url: string }) {
const [numPages, setNumPages] = useState<number>(0);
const containerRef = useRef<HTMLDivElement>(null);
const [containerWidth, setContainerWidth] = useState<number>(600);
const onDocumentLoadSuccess = useCallback(
({ numPages }: { numPages: number }) => {
setNumPages(numPages);
if (containerRef.current) {
setContainerWidth(containerRef.current.clientWidth);
}
},
[]
);
return (
<div ref={containerRef} className="overflow-y-auto max-h-[60vh] p-2">
<Document
file={url}
onLoadSuccess={onDocumentLoadSuccess}
loading={<span>PDF読み込み中...</span>}
>
{Array.from({ length: numPages }, (_, i) => (
<Page
key={i}
pageNumber={i + 1}
width={containerWidth - 16}
className="mb-2"
/>
))}
</Document>
</div>
);
}
Jsree
JsRee for Windows | JSONツリービューワー
無音カメラアプリ
無音ガメラ Web版
【digでTXTレコードを確認する方法】DNS設定後に反映確認
DNSにTXTレコード(Google認証やSPFなど)を追加したのに、
「ちゃんと設定できているか分からない…」ということはありませんか?
dig コマンドを使ってTXTレコードを確認する方法まとめ
TXTレコードとは?
TXTレコードは、ドメインに任意のテキスト情報を登録できるDNSレコードです。
主に次の用途で使われます:
- Google Search Console のサイト所有権確認
- SPF(送信ドメイン認証)
- DKIM / DMARC設定
- AWS / HubSpot / 各種サービス認証
digでTXTレコードを確認する方法
基本コマンド
dig example.com TXT
シンプル表示する場合
dig example.com TXT +short
成功すると、以下のように表示されます。
"google-site-verification=xxxxxxxxxxxx"
"v=spf1 include:_spf.google.com include:amazonses.com ~all"
TXTレコードが複数あっても問題ない?
はい、問題ありません。
1つのドメインに複数のTXTレコードを持つのは通常の構成です。
例:
re-tool.co.jp TXT "google-site-verification=..."
re-tool.co.jp TXT "v=spf1 include:_spf.google.com ..."
ただし注意
⚠ SPF(v=spf1)は1つだけにまとめる必要があります。
複数のSPFレコードがあるとメールが正常に送信できなくなる可能性があります。
TXTレコードが表示されないときのチェックポイント
1. ネームサーバーが正しいか確認
dig example.com NS +short
2. DNS反映待ちの可能性
DNSは反映に数分〜最大48時間かかることがあります。
Google DNSで確認:
dig example.com TXT @8.8.8.8 +short
Windowsで確認する方法
PowerShellを使う場合:
Resolve-DnsName example.com -Type TXT
Resolve-DnsName example.com -Type TXT -Server 8.8.8.8
remoted で問題が起きました。 | macOS Tahoe 26.2
MacBook (Intel 版) 起動時、「remoted で問題が起きました。」ダイアログが表示される。
remoted はユーザーが入れたアプリではなく、macOS 標準のシステムデーモンということらしい。
エラーは「Mac起動時に remoted が一時的に応答しなかった」ものでした。
remoted って何?
remoted は Apple純正のバックグラウンド常駐プロセスで、下記の機能を担当しているようです。
- 🎮 Bluetooth / 外部デバイス連携
- 📱 Sidecar(iPadをサブディスプレイにする機能)
- 🖱 Universal Control(MacとiPadを1つのマウス・キーボードで操作)
- 🎧 AirPlay / 外部入力系の仲介
つまり
👉 「周辺機器・リモート系の橋渡し役」という立ち位置のシステムサービスです。
今回のエラー内容を噛み砕くと
WATCHDOG timeoutmonitoring timed out for service: remoteddevice not responsive
- macOS 起動直後
- remoted が 60秒間 応答しなかった
- 監視役(watchdog)が「固まってる」と判断して記録
💡 **クラッシュというより「起動時のもたつき」**に近いです。
特に今回は
- ディスプレイ OFF
- 起動から約80分後にログ採取
- 熱状態も正常
なので、深刻度は低めです 名称未設定
よくある原因
これは珍しくないパターンで、だいたい次のどれかです。
- 🔌 起動時に Bluetooth / USB 機器が大量につながっている
- 🖥 外部ディスプレイ・ドック・ハブ
- 📱 iPad / iPhone が近くにあって Universal Control 初期化
- 💤 スリープ復帰直後のタイミング被り
- 🧪 macOSの軽い不具合(特にメジャーアップデート直後)
アップデート待つしかなさそうかな
