Мне удалось решить проблему, фактически она не имела ничего общего с моим кодом, что затрудняло его отладку. Я объясню свою методологию и решение на случай, если кто-нибудь еще столкнется с этой проблемой.
Поскольку я добавлял все больше и больше кода отладки, чтобы попытаться выяснить, что происходит не так, я начал подозревать, что браузер не запускает мой Javascript (который находится в отдельном файле .js
на сервере). В конце концов я вытащил необработанные журналы доступа для сервера и обнаружил, что, хотя для главной страницы была запись журнала 200 OK
, для файла Javascript не было записи.
Такое поведение было немного неожиданным, поскольку стандартным поведением будет запрос HTTP GET
с заголовком If-Modified-Since
, который позволит браузеру пропускать загрузку содержимого, если сервер обнаружит, что страница не была изменена. Затем это будет записано как результат 304 NOT MODIFIED
в журнале доступа сервера.
Сравнение журнала доступа для сеанса iPhone с журналом обычного сеанса Firefox на рабочем столе показало, что Firefox браузер запрашивал все ресурсы страницы и получал 304
результаты и 200
соответственно, которые были записаны в журнале доступа, в то время как сеанс iPhone имел только запрос к главной странице.
На данный момент казалось, что у Safari был какой-то странный механизм кеширования, который даже не удосужился запросить ресурсы. Однако это не казалось правдоподобным, поэтому я продолжал исследовать, пока не заметил, что iPhone запрашивает главную страницу по HTTP, а не по HTTPS (как версия для настольного компьютера). Я просто не набрал https://
в Safari.
Переключение Safari на HTTPS привело к тому, что Javascript корректно потянуло и запустилось. Возможно, это является следствием некоторой политики безопасности в Safari.