iPhone iOS27のPWAでwindow.print()が動かない?Safariと実機で比較検証してみた



当サイト、オリジナルWordPressプラグイン「OJapp PWA Marketing」を使用しています。

各記事は専用アイコンでホーム画面に追加できます。ぜひお試しください。

PWA用のちょっとしたWebツールを作っていて、印刷ボタンを付けようと思いました。

JavaScriptならwindow.print()を呼ぶだけです。

「これは一瞬で終わるやろ。」

……と思ったら、終わりましぇーん

Safariでは普通に印刷画面が開くのに、同じページをiPhoneのホーム画面からPWAとして起動すると、ボタンを押しても何も起きません。

最初は自分のコードを疑いました。ただ、こういうときにSafariだけ、PWAだけ、と順番に切り分けていくと結構おもしろい結果が出ます。今回はiOS 27の実機で、window.print()の前後まで追ってみました。

まずSafariでwindow.print()を試す

今回使ったのは同じHTMLです。Safariで普通に開いた場合と、ホーム画面へ追加してstandaloneで起動した場合だけを変えて比較しました。

まずSafariでwindow.print()を実行すると、予想通り印刷画面が表示されます。

さらに、印刷処理がどこまで進んでいるのかを見るために、次の3つも確認しました。

  • beforeprint
  • matchMedia('print')
  • afterprint

Safariでは、これらも確認できました。

つまり少なくとも今回使ったページでは、印刷ボタンやwindow.print()の書き方そのものが原因ではなさそうです。

同じページをPWAで開くと何も起きない

次に、同じページをホーム画面から起動して試しました。

結果はかなり分かりやすく、ボタンを押しても印刷画面が出ません。

ただし、JavaScriptそのものが止まっているわけではありません。ログを確認するとwindow.print()を呼び出したところまでは通っており、そこで例外が発生して処理が落ちるような動きでもありませんでした。

ところが、その先で期待していた

  • beforeprint
  • matchMedia('print')
  • afterprint

は、今回のPWA環境ではどれも反応しませんでした。

アッピン
print()でエラーが出るというより、その先の印刷処理へ入っていないように見えるのが今回のポイントです。

本当にPWAで起動しているのかも確認した

ここで一応、「そもそも本当にPWAとして起動しているのか?」も確認しました。

display-modeを調べると、Safariでは次のようになります。

browser

ホーム画面から起動した状態では、

standalone

となりました。

ちゃんとホーム画面からPWAとして起動している状態です。display-mode: standaloneの判定方法については、PWAをホーム画面から開いたか判定する方法でも詳しく紹介しています。

つまり今回の比較では、同じページ、同じJavaScriptでも、Safariのブラウザ表示とホーム画面からのstandalone起動でwindow.print()の挙動が変わりました。

Safariでは2回目の印刷で確認画面まで出た

検証中にもう一つ面白かったのが、Safari側の挙動です。

Safariで続けて印刷を実行していると、「このウェブサイトから自動的に印刷することは禁止されています。」という確認が表示されました。

そこで許可すると、そのまま印刷画面へ進めます。

つまりSafariのブラウザ表示では、少なくとも今回の実機では、印刷を実行すると印刷用のUIだけでなく、連続実行に対する確認処理も動いていました。

ところがPWAでは、印刷画面だけでなく、この確認も表示されませんでした。ここを突破できれば印刷まで進めそうな気がするんですが、これは調べようがない部分になってしまいましたね。

ここまで来ると、単純に「印刷ダイアログだけ表示されていない」というより、Safariで動いている印刷フロー自体にstandalone側が入っていないようにも見えます。

これが今回の実機検証から見えた挙動です。なぜそうなるのか、iOS 27側で意図された制限なのか、不具合なのかまでは今回の検証だけでは断定できません。

SafariとPWAの結果を並べるとかなりはっきりする

確認項目SafariPWA(standalone)
window.print()の呼び出し通る通る
beforeprint確認できた反応なし
matchMedia('print')確認できた反応なし
afterprint確認できた反応なし
印刷画面表示表示されない

この結果を見ると、少なくとも今回のiOS 27環境では、window.print()というJavaScriptの呼び出しそのものが失敗しているようには見えません。

呼び出した後に始まるはずの印刷処理が、standaloneでは開始されていないように見えます。

iPhoneのPWAにはほかにもSafariとは挙動が異なる部分があります。現在確認している制限については、SafariのPWA制限とは?できること・できないことまとめにも整理しています。

ではPWAから印刷したいときはどうするか

今回の環境では、PWAの中からwindow.print()をそのまま使って印刷画面を出す方法は確認できませんでした。

そのため実際にツールへ印刷機能を入れるなら、現時点ではSafari側で開いて印刷してもらうか、用途によっては印刷用データをPDFとして生成・表示するような別ルートを用意する方が現実的です。

もちろん、これは「PWAでは印刷できない」とすべてのiOSや将来のバージョンまで断定する話ではありません。今回確認できたのは、iOS 27の実機でSafariでは動作し、ホーム画面からstandaloneで起動した同じページでは動作しなかった、という結果です。

PWAが動かないときは、いきなりコードを全部書き直すより、PWAの状態を確認する方法のように、まずブラウザ表示とstandaloneを分けて確認すると原因をかなり絞れます。

print()くらい一瞬だと思っていた

正直、最初はwindow.print()を1行書いて終わると思っていました。

それが、Safariでは動く。PWAでは動かない。イベントまで見てもPWA側だけ反応しない。さらにSafari側には連続印刷の確認まで出る。

なかなかiPhoneらしいハマり方でした。

ただ、こういう挙動は「PWAでは動かなかった」で終わらせるより、どこまでは動いていて、どこから反応しなくなるのかを残しておく方が後から役に立ちます。

今後iOSやWebKitの更新で挙動が変わった場合は、また同じテストをして追記していこうと思います。

GoogleでOJapp Tipsを優先する情報源に追加

今後、Google検索でOJapp Tipsの記事を見つけやすくできます。


OJapp FREE · 1P1A

Turn Any Web Page into a Home Screen App

Skip complex PWA setup. Add one line of code and turn your
web page into an installable home screen app.


OJapp FREE - One Page. One App.


OJapp FREE · 1P1A

Webページをホーム画面アプリに

複雑なPWA設定やmanifest.jsonの作成は不要。
1行のコードを追加するだけで、Webページをホーム画面へ追加できるアプリに変えられます。


OJapp FREEでWebページをホーム画面アプリに

最新情報をチェックしよう!
    OJapp Tips  -  PWA・ホーム画面追加の実機検証ブログ

    OJapp Tips  -  PWA・ホーム画面追加の実機検証ブログ

    OJapp Tipsは、 公式ドキュメントをなぞるだけでは分かりにくい挙動を、実際にiPhone・Android・PCで検証しながら記録しています。

    特に、manifest.json、Service Worker、Web App Manifest、WebClip、アイコンキャッシュ、ホーム画面追加の挙動など、 Webサイトを「アプリのような入口」として使うためのノウハウを中心に扱っています。

    OJapp Tipsの記事は、PWA LABでの実機検証や、OJapp・Petal・OJ-Passなど自作ツールの開発で詰まったことを元にしています。 きれいな理論だけではなく、「実際にはここでハマる」という現場寄りの知識を残すための場所です。