Adakah yang mengimplementasikan fitur di mana jika pengguna belum menyentuh layar selama periode waktu tertentu, Anda mengambil tindakan tertentu? Saya mencoba mencari cara terbaik untuk melakukan itu.
Ada metode yang agak terkait ini dalam aplikasi UIA:
[UIApplication sharedApplication].idleTimerDisabled;
Alangkah baiknya jika Anda memiliki sesuatu seperti ini:
NSTimeInterval timeElapsed = [UIApplication sharedApplication].idleTimeElapsed;
Lalu saya bisa mengatur timer dan secara berkala memeriksa nilai ini, dan mengambil beberapa tindakan ketika melebihi ambang batas.
Semoga itu menjelaskan apa yang saya cari. Adakah yang sudah mengatasi masalah ini, atau memiliki pemikiran tentang bagaimana Anda akan melakukannya? Terima kasih.
ios
objective-c
iphone
idle-timer
Mike McMaster
sumber
sumber
Jawaban:
Inilah jawaban yang saya cari:
Mintalah aplikasi Anda mendelegasikan subkelas aplikasi UIA. Dalam file implementasi, ganti metode sendEvent: seperti:
di mana maxIdleTime dan idleTimer adalah variabel instan.
Agar ini berfungsi, Anda juga perlu memodifikasi main.m Anda untuk memberi tahu UIApplicationMain untuk menggunakan kelas delegasi Anda (dalam contoh ini, AppDelegate) sebagai kelas utama:
sumber
NSTimer
contoh jika ada banyak sentuhan.Saya memiliki variasi solusi pengatur waktu idle yang tidak memerlukan subkelas aplikasi UIA. Ini bekerja pada subkelas UIViewController tertentu, jadi berguna jika Anda hanya memiliki satu pengontrol tampilan (seperti yang dimiliki aplikasi atau game interaktif) atau hanya ingin menangani waktu tunggu idle dalam pengontrol tampilan tertentu.
Itu juga tidak membuat kembali objek NSTimer setiap kali waktu siaga diatur ulang. Ini hanya membuat yang baru jika timer menyala.
Kode Anda dapat memanggil
resetIdleTimer
untuk acara lain yang mungkin perlu membatalkan timer idle (seperti input accelerometer yang signifikan).(kode pembersihan memori dikecualikan untuk singkatnya.)
sumber
Untuk swift v 3.1
jangan lupa komentar baris ini di AppDelegate // @ UIApplicationMain
Mengamati notifikasi di kelas lain mana pun
sumber
if idleTimer != nil
insendEvent()
?timeoutInSeconds
dari respons layanan web?Utas ini sangat membantu, dan saya membungkusnya menjadi subkelas UIWindow yang mengirimkan pemberitahuan. Saya memilih pemberitahuan untuk menjadikannya kopling longgar yang nyata, tetapi Anda dapat menambahkan delegasi dengan cukup mudah.
Inilah intinya:
http://gist.github.com/365998
Selain itu, alasan untuk masalah subkelas UIApplication adalah bahwa NIB diatur untuk kemudian membuat 2 objek aplikasi UIApplication karena berisi aplikasi dan delegasi. Subkelas UIWindow berfungsi dengan baik.
sumber
Sebenarnya ide subclassing bekerja dengan baik. Hanya saja, jangan membuat Anda mendelegasikan
UIApplication
subclass. Buat file lain yang mewarisi dariUIApplication
(mis. MyApp). Di IB atur kelasfileOwner
objek kemyApp
dan di myApp.m terapkansendEvent
metode seperti di atas. Di main.m lakukan:dan lagi!
sumber
Saya baru saja mengalami masalah ini dengan permainan yang dikendalikan oleh gerakan yaitu kunci layar dinonaktifkan tetapi harus mengaktifkannya lagi ketika dalam mode menu. Alih-alih penghitung waktu saya merangkum semua panggilan ke
setIdleTimerDisabled
dalam kelas kecil menyediakan metode berikut:disableIdleTimer
menonaktifkan timer idle,enableIdleTimerDelayed
ketika memasuki menu atau apa pun yang harus dijalankan dengan timer idle aktif danenableIdleTimer
dipanggil dariapplicationWillResignActive
metode AppDelegate Anda untuk memastikan semua perubahan Anda diatur ulang dengan benar ke perilaku default sistem.Saya menulis sebuah artikel dan memberikan kode untuk Penanganan Timer IdleTimerManager Idle kelas singleton di Game iPhone
sumber
Berikut cara lain untuk mendeteksi aktivitas:
Timer ditambahkan
UITrackingRunLoopMode
, sehingga hanya bisa menyala jika adaUITracking
aktivitas. Ini juga memiliki keuntungan bagus untuk tidak mengirim spam kepada Anda untuk semua acara sentuh, sehingga memberi tahu jika ada aktivitas diACTIVITY_DETECT_TIMER_RESOLUTION
detik-detik terakhir . Saya menamai pemilih tersebutkeepAlive
karena tampaknya merupakan use case yang sesuai untuk ini. Anda tentu saja dapat melakukan apa pun yang Anda inginkan dengan informasi yang ada kegiatan baru-baru ini.sumber
Pada akhirnya Anda perlu mendefinisikan apa yang Anda anggap sebagai idle - apakah ini hasil dari pengguna yang tidak menyentuh layar atau apakah itu keadaan sistem jika tidak ada sumber daya komputasi yang digunakan? Dimungkinkan, dalam banyak aplikasi, bagi pengguna untuk melakukan sesuatu walaupun tidak secara aktif berinteraksi dengan perangkat melalui layar sentuh. Sementara pengguna mungkin akrab dengan konsep perangkat yang akan tidur dan pemberitahuan bahwa itu akan terjadi melalui peredupan layar, belum tentu mereka akan mengharapkan sesuatu terjadi jika mereka menganggur - Anda harus berhati-hati tentang apa yang akan Anda lakukan. Tetapi kembali ke pernyataan asli - jika Anda menganggap kasus ke-1 sebagai definisi Anda, tidak ada cara yang sangat mudah untuk melakukan ini. Anda harus menerima setiap acara sentuhan, meneruskannya pada rantai responden sesuai kebutuhan sambil mencatat waktu itu diterima. Itu akan memberi Anda beberapa dasar untuk membuat perhitungan idle. Jika Anda menganggap kasus kedua sebagai definisi Anda, Anda dapat bermain dengan notifikasi NSPostWhenIdle untuk mencoba dan melakukan logika Anda pada saat itu.
sumber
Ada cara untuk melakukan aplikasi ini secara luas tanpa pengontrol individu harus melakukan apa pun. Cukup tambahkan pengenal isyarat yang tidak membatalkan sentuhan. Dengan cara ini, semua sentuhan akan dilacak untuk timer, dan sentuhan dan gerakan lainnya tidak terpengaruh sama sekali sehingga tidak ada orang lain yang tahu tentang itu.
Di delegasi aplikasi Anda, lakukan metode peluncuran selesai, panggil saja addGesture dan Anda sudah siap. Semua sentuhan akan melalui metode CatchAllGesture tanpa mencegah fungsi orang lain.
sumber
-sendEvent:
banyak, danUITrackingRunLoopMode
tidak menangani banyak kasus.