Sejak peningkatan ke iOS 6, kami melihat tampilan web Safari mengambil kebebasan dari $.ajax
panggilan caching . Ini dalam konteks aplikasi PhoneGap sehingga menggunakan Safari WebView. $.ajax
Panggilan kami adalahPOST
metode dan cache disetel ke false {cache:false}
, tetapi ini masih terjadi. Kami mencoba menambahkan secara manual TimeStamp
ke header tetapi tidak membantu.
Kami melakukan lebih banyak riset dan menemukan bahwa Safari hanya mengembalikan hasil cache untuk layanan web yang memiliki fungsi tanda tangan yang statis dan tidak berubah dari panggilan ke panggilan. Misalnya, bayangkan fungsi yang disebut sesuatu seperti:
getNewRecordID(intRecordType)
Fungsi ini menerima parameter input yang sama berulang-ulang, tetapi data yang dikembalikan harus berbeda setiap waktu.
Harus terburu-buru Apple untuk membuat iOS 6 zip bersama mengesankan mereka terlalu senang dengan pengaturan cache. Adakah orang lain yang melihat perilaku ini di iOS 6? Jika demikian, apa sebenarnya penyebabnya?
Solusi yang kami temukan adalah mengubah tanda tangan fungsi menjadi sesuatu seperti ini:
getNewRecordID(intRecordType, strTimestamp)
dan kemudian selalu mengirimkan TimeStamp
parameter juga, dan hanya membuang nilai itu di sisi server. Ini mengatasi masalah ini. Saya harap ini membantu beberapa jiwa miskin lainnya yang menghabiskan 15 jam pada masalah ini seperti yang saya lakukan!
sumber
Jawaban:
Setelah sedikit penyelidikan, ternyata Safari di iOS6 akan men-cache POST yang tidak memiliki header Kontrol-Cache atau bahkan "Kontrol-cache: max-age = 0".
Satu-satunya cara yang saya temukan untuk mencegah caching ini terjadi di tingkat global daripada harus meretas querystrings acak ke akhir panggilan layanan adalah dengan mengatur "Kontrol Cache: no-cache".
Begitu:
Saya menduga bahwa Apple mengambil keuntungan dari ini dari spec HTTP di bagian 9.5 tentang POST:
Jadi secara teori Anda bisa menyimpan respons POST ... yang tahu. Tetapi tidak ada pembuat browser lain yang pernah berpikir itu akan menjadi ide yang bagus sampai sekarang. Tapi itu TIDAK menjelaskan caching ketika tidak ada header Kontrol-Cache atau Kedaluwarsa yang ditetapkan, hanya ketika ada beberapa set. Jadi itu pasti bug.
Di bawah ini adalah apa yang saya gunakan di bagian kanan konfigurasi Apache saya untuk menargetkan seluruh API saya karena ketika itu terjadi saya tidak benar-benar ingin melakukan cache apa pun, bahkan dapat. Apa yang saya tidak tahu adalah bagaimana mengatur ini hanya untuk POST.
Pembaruan: Hanya perhatikan bahwa saya tidak menunjukkan bahwa itu hanya ketika POST sama, jadi ubah data atau URL POST mana saja dan Anda baik-baik saja. Jadi Anda bisa seperti yang disebutkan di tempat lain hanya menambahkan beberapa data acak ke URL atau sedikit data POST.
Pembaruan: Anda dapat membatasi "tanpa cache" hanya untuk POST jika Anda ingin seperti ini di Apache:
sumber
Saya harap ini bisa berguna untuk pengembang lain membenturkan kepala mereka ke dinding yang satu ini. Saya menemukan bahwa salah satu dari berikut ini mencegah Safari di iOS 6 dari caching respons POST:
Solusi saya adalah sebagai berikut dalam Javascript saya (semua permintaan AJAX saya adalah POST).
Saya juga menambahkan header [pragma: no-cache] ke banyak respons server saya.
Jika Anda menggunakan solusi di atas, ketahuilah bahwa setiap panggilan $ .ajax () yang Anda buat diatur ke global: false TIDAK akan menggunakan pengaturan yang ditentukan dalam $ .ajaxSetup (), jadi Anda perlu menambahkan header lagi.
sumber
Solusi sederhana untuk semua permintaan layanan web Anda, dengan asumsi Anda menggunakan jQuery:
Baca lebih lanjut tentang panggilan prefilter jQuery di sini .
Jika Anda tidak menggunakan jQuery, periksa dokumen untuk perpustakaan pilihan Anda. Mereka mungkin memiliki fungsi serupa.
sumber
Saya baru saja mengalami masalah ini juga dalam aplikasi PhoneGap . Saya menyelesaikannya dengan menggunakan fungsi JavaScript
getTime()
dengan cara berikut:Saya menghabiskan beberapa jam untuk mencari tahu ini. Akan menyenangkan jika Apple memberi tahu pengembang tentang masalah caching ini.
sumber
{cache:false}
sebagai opsi untuk salah satu$.post()
atau$.ajaxSetup()
, tetapi menurut dokumen , argumen ini diabaikan; jQuery akan 'tidak pernah cache' permintaan posting, tetapi tidak mempertimbangkan browser. Mungkin opsi yang lebih rapi adalah menambahkan timestamp ke permintaan yang menggunakan$.ajaxPrefilter()
.function send_ajax(my_data,refresh)
.. lihat di sini stackoverflow.com/questions/14733772/…Saya memiliki masalah yang sama dengan aplikasi webapp mendapatkan data dari layanan web ASP.NET
Ini bekerja untuk saya:
sumber
Akhirnya, saya punya solusi untuk masalah unggahan saya.
Dalam JavaScript:
Dalam PHP :
sumber
Dari posting blog saya sendiri, iOS 6.0 caching permintaan Ajax POST :
Cara memperbaikinya: Ada berbagai metode untuk mencegah caching permintaan. Metode yang disarankan adalah menambahkan header no-cache. Ini adalah bagaimana hal itu dilakukan.
jQuery:
Periksa iOS 6.0 dan tetapkan tajuk Ajax seperti ini:
ZeptoJS:
Periksa iOS 6.0 dan atur tajuk Ajax seperti ini:
Sisi server
Jawa:
Pastikan untuk menambahkan ini di bagian atas halaman sebelum data dikirim ke klien.
.BERSIH
Atau
PHP
sumber
Cuplikan JavaScript ini bekerja sangat baik dengan jQuery dan jQuery Mobile:
Cukup letakkan di suatu tempat dalam kode JavaScript Anda (setelah jQuery dimuat, dan terbaik sebelum Anda melakukan permintaan AJAX) dan itu akan membantu.
sumber
Anda juga dapat memperbaiki masalah ini dengan memodifikasi fungsi jQuery Ajax dengan melakukan hal berikut (pada 1.7.1) ke bagian atas fungsi Ajax (fungsi dimulai pada baris 7212). Perubahan ini akan mengaktifkan fitur anti-cache bawaan dari jQuery untuk semua permintaan POST.
(Script lengkap tersedia di
http://dl.dropbox.com/u/58016866/jquery-1.7.1.js
.)Masukkan di bawah garis 7221:
Kemudian modifikasi berikut ini (mulai dari baris ~ 7497).
Untuk:
sumber
jQuery.ajaxPrefiler
memungkinkan Anda memodifikasi permintaan ajax Anda tepat sebelum membuatnya. Anda dapat mengarsipkan hal yang sama dengan yang lebih dioptimalkan dan memperbarui kode aman.Solusi cepat untuk layanan GWT-RPC adalah menambahkan ini ke semua metode jarak jauh:
sumber
Ini adalah pembaruan dari jawaban Baz1nga. Karena
options.data
bukan objek tetapi string saya hanya terpaksa menyatukan cap waktu:sumber
Untuk mengatasi masalah ini untuk WebApps ditambahkan ke layar beranda, kedua solusi terpilih harus diikuti. Caching perlu dimatikan pada server web untuk mencegah permintaan baru agar tidak di-cache maju dan beberapa input acak perlu ditambahkan ke setiap permintaan posting agar permintaan yang telah di-cache untuk melewati. Silakan merujuk ke posting saya:
iOS6 - Apakah ada cara untuk menghapus permintaan ajax POST cache untuk webapp yang ditambahkan ke layar beranda?
PERINGATAN: untuk siapa saja yang menerapkan solusi dengan menambahkan stempel waktu untuk permintaan mereka tanpa mematikan caching di server. Jika aplikasi Anda ditambahkan ke layar beranda, SETIAP respons pos sekarang akan di-cache, membersihkan cache safari tidak menghapusnya dan sepertinya tidak kedaluwarsa. Kecuali jika seseorang memiliki cara untuk membersihkannya, ini terlihat seperti potensi kebocoran memori!
sumber
Hal-hal yang TIDAK BEKERJA bagi saya dengan iPad 4 / iOS 6:
Permintaan saya mengandung: Cache-Control: no-cache
Menambahkan cache: false ke panggilan ajax jQuery saya
Hanya ini yang berhasil:
sumber
$.ajax
cache: false
tambahkan url dengan parameter kueri_=Date.prototype.getTime()
, jadi menambahkan cap waktu secara manual tidak lagi diperlukan.Itulah yang harus dilakukan untuk GWT-RPC
sumber
Solusi saya di ASP.NET (pagemethods, layanan web, dll.)
sumber
Sementara menambahkan parameter cache-buster untuk membuat permintaan tampak berbeda tampaknya seperti solusi yang solid, saya akan menyarankan untuk tidak melakukannya, karena itu akan merusak aplikasi yang bergantung pada caching aktual yang terjadi. Membuat API menghasilkan header yang benar adalah solusi terbaik, bahkan jika itu sedikit lebih sulit daripada menambahkan penghilang cache ke pemanggil.
sumber
Bagi mereka yang menggunakan
Struts 1
, berikut adalah cara saya memperbaiki masalah ini.web.xml
com.example.struts.filters.CacheControlFilter.js
sumber
Saya dapat memperbaiki masalah saya dengan menggunakan kombinasi $ .ajaxSetup dan menambahkan stempel waktu ke url posting saya (bukan ke parameter post / body). Ini berdasarkan rekomendasi dari jawaban sebelumnya
sumber
Saya pikir Anda sudah menyelesaikan masalah Anda, tetapi izinkan saya berbagi ide tentang caching web.
Memang benar Anda dapat menambahkan banyak header di setiap bahasa yang Anda gunakan, sisi server, sisi klien, dan Anda dapat menggunakan banyak trik lain untuk menghindari caching web, tetapi selalu berpikir bahwa Anda tidak pernah tahu dari mana klien terhubung ke server Anda, Anda tidak pernah tahu apakah dia menggunakan koneksi Hotel "Hot-Spot" yang menggunakan Squid atau produk caching lainnya.
Jika pengguna menggunakan proxy untuk menyembunyikan posisi aslinya, dll ... satu - satunya cara nyata untuk menghindari caching adalah cap waktu dalam permintaan juga jika tidak digunakan.
Sebagai contoh:
Kemudian setiap cache manager yang Anda lewati tidak menemukan URL yang sama di repositori cache dan kembali mengunduh konten halaman.
sumber
$.ajax
dan telah menetapkan opsi untuk memilikinya{cache:false}
maka jQuery sendiri secara otomatis akan menambahkan penghilang cache di belakang layar tanpa Anda perlu melakukan hal lain.Tergantung pada aplikasinya, Anda dapat memecahkan masalah sekarang di iOS 6 menggunakan Safari> Advanced> Web Inspector sehingga membantu dengan situasi ini.
Hubungkan ponsel ke Safari di Mac dan kemudian gunakan menu pengembang untuk memecahkan masalah aplikasi web.
Bersihkan data situs web pada iPhone setelah pembaruan ke iOS6, termasuk khusus untuk aplikasi menggunakan Tampilan Web. Hanya satu aplikasi memiliki masalah dan ini diselesaikan selama pengujian IOS6 Beta jalan kembali, sejak saat itu tidak ada masalah nyata.
Anda mungkin perlu melihat aplikasi Anda juga, periksa NSURLCache jika di WebView di aplikasi khusus.
https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSURLCache_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40003754
Saya kira tergantung pada sifat sebenarnya dari masalah Anda, implementasi, dll.
Ref: $ .ajax calls
sumber
Saya menemukan satu solusi yang membuat saya penasaran mengapa itu berhasil. Sebelum membaca jawaban Tadej mengenai layanan web ASP.NET, saya mencoba untuk membuat sesuatu yang bisa digunakan.
Dan saya tidak mengatakan itu solusi yang baik, tetapi saya hanya ingin mendokumentasikannya di sini.
halaman utama: termasuk fungsi JavaScript, checkStatus (). Metode ini memanggil metode lain yang menggunakan panggilan jQuery AJAX untuk memperbarui konten html. Saya menggunakan setInterval untuk memanggil checkStatus (). Tentu saja, saya mengalami masalah caching.
Solusi: gunakan halaman lain untuk memanggil pembaruan.
Di halaman utama, saya menetapkan variabel boolean, runUpdate, dan menambahkan yang berikut ini ke tag body:
Di helper.html:
Jadi, jika checkStatus () dipanggil dari halaman utama, saya mendapatkan konten yang di-cache. Jika saya memanggil checkStatus dari halaman anak, saya mendapatkan konten yang diperbarui.
sumber
Sementara halaman masuk dan pendaftaran saya berfungsi seperti pesona di Firefox, IE dan Chrome ... Saya telah berjuang dengan masalah ini di Safari untuk iOS dan OSX, beberapa bulan yang lalu saya menemukan solusi di SO.
ATAU via javascript
Ini adalah hal yang jelek tapi berhasil untuk sementara waktu.
Saya tidak tahu mengapa, tetapi mengembalikan nol ke
onunload
acara halaman tidak di-cache di Safari.sumber
Kami menemukan bahwa iPhone dan iPad yang lebih lama, yang menjalankan versi iOS 9 & 10, kadang-kadang mengembalikan hasil AJAX yang kosong, mungkin karena Apple menurunkan kecepatan CPU. Saat mengembalikan hasil kosong, iOS tidak memanggil server, seolah-olah mengembalikan hasil dari cache. Frekuensi sangat bervariasi, dari sekitar 10% hingga 30% dari panggilan AJAX kembali kosong.
Solusinya sulit dipercaya. Tunggu saja 1 dan panggil lagi. Dalam pengujian kami, hanya satu pengulangan yang diperlukan, tetapi kami menulis kode untuk menelepon hingga 4 kali. Kami tidak yakin apakah menunggu 1s diperlukan, tetapi kami tidak ingin mengambil risiko membebani server kami dengan semburan panggilan berulang.
Kami menemukan masalah terjadi dengan dua panggilan AJAX yang berbeda, memanggil file API yang berbeda dengan data yang berbeda. Tapi saya khawatir itu bisa terjadi pada panggilan AJAX apa pun. Kami hanya tidak tahu karena kami tidak memeriksa setiap hasil AJAX dan kami tidak menguji setiap panggilan beberapa kali pada perangkat lama.
Kedua masalah panggilan AJAX menggunakan: POST, Asynchronous = true, setRequestHeader = ('Content-Type', 'application / x-www-form-urlencoded')
Ketika masalah terjadi, biasanya hanya ada satu panggilan AJAX yang terjadi. Jadi itu bukan karena tumpang tindih panggilan AJAX. Kadang-kadang masalah terjadi ketika perangkat sibuk, tetapi kadang-kadang tidak, dan tanpa DevTools kita tidak benar-benar tahu apa yang terjadi pada saat itu.
iOS 13 tidak melakukan ini, juga Chrome atau Firefox. Kami tidak memiliki perangkat uji yang menjalankan iOS 11 atau 12. Mungkin orang lain dapat mengujinya?
Saya mencatat ini di sini karena pertanyaan ini adalah hasil teratas Google ketika mencari masalah ini.
sumber
Ini bekerja dengan ASP.NET hanya setelah menambahkan
pragma:no-cache
header di IIS .Cache-Control: no-cache
tidak cukup.sumber
Saya menyarankan solusi untuk mengubah tanda tangan fungsi menjadi sesuatu seperti ini:
getNewRecordID (intRecordType, strTimestamp) dan kemudian selalu meneruskan parameter TimeStamp juga, dan buang saja nilai itu di sisi server. Ini mengatasi masalah ini.
sumber