Jawaban:
Dari " Tutorial iPhone: Cara yang lebih baik untuk memeriksa kemampuan perangkat iOS ":
Ada dua fungsi yang tampaknya serupa yang mengambil parameter kSystemSoundID_Vibrate
:
1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
Kedua fungsi tersebut menggetarkan iPhone. Tetapi, ketika Anda menggunakan fungsi pertama pada perangkat yang tidak mendukung getaran, ia memainkan suara bip. Fungsi kedua, di sisi lain, tidak melakukan apa pun pada perangkat yang tidak didukung. Jadi jika Anda akan menggetarkan perangkat secara terus menerus, sebagai peringatan, kata akal sehat, gunakan fungsi 2.
Pertama, tambahkan kerangka AudioToolbox AudioToolbox.framework
ke target Anda di Build Phases.
Kemudian, impor file header ini:
#import <AudioToolbox/AudioServices.h>
AudioServicesPlayAlertSound(UInt32(kSystemSoundID_Vibrate))
(setidaknya pada beta 2)
AudioToolbox sekarang menyajikan kSystemSoundID_Vibrate
sebagai SystemSoundID
tipe, jadi kodenya adalah:
import AudioToolbox.AudioServices
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
Daripada harus melalui langkah pemeran tambahan
(Alat Peraga ke @Dov)
Dan, inilah cara Anda melakukannya di Swift (jika Anda mengalami masalah yang sama dengan saya)
Tautan melawan AudioToolbox.framework
(Buka proyek Anda, pilih target Anda, bangun fase, Tautan Biner dengan Perpustakaan, tambahkan perpustakaan di sana)
Setelah selesai:
import AudioToolbox.AudioServices
// Use either of these
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
Yang murahan adalah bahwa SystemSoundID
pada dasarnya adalah typealias
(suka cepat typedef
) untuk UInt32
, dan itu kSystemSoundID_Vibrate
adalah biasa Int
. Compiler memberikan Anda sebuah kesalahan untuk mencoba pemain dari Int
ke UInt32
, tapi kesalahan berbunyi sebagai "Tidak bisa dikonversi ke SystemSoundID", yang membingungkan. Mengapa apel tidak membuatnya menjadi Swift enum ada di luar jangkauan saya.
@ aponomarenko masuk ke rincian, jawaban saya hanya untuk Swifters di luar sana.
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
dan dikompilasi dengan baik
Cara mudah untuk melakukannya adalah dengan Layanan Audio:
#import <AudioToolbox/AudioToolbox.h>
...
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
Saya mempunyai masalah besar dengan ini untuk perangkat yang getarannya dimatikan dalam beberapa cara, tetapi kami membutuhkannya untuk bekerja terlepas, karena sangat penting untuk fungsi aplikasi kami, dan karena itu hanya bilangan bulat untuk pemanggilan metode yang didokumentasikan, itu akan lulus validasi. Jadi saya telah mencoba beberapa suara di luar yang terdokumentasi dengan baik di sini: TUNER88 / iOSSystemSoundsLibrary
Saya kemudian menemukan 1352, yang berfungsi terlepas dari saklar diam atau pengaturan pada perangkat (Settings->vibrate on ring, vibrate on silent)
.
- (void)vibratePhone;
{
if([[UIDevice currentDevice].model isEqualToString:@"iPhone"])
{
AudioServicesPlaySystemSound (1352); //works ALWAYS as of this post
}
else
{
// Not an iPhone, so doesn't have vibrate
// play the less annoying tick noise or one of your own
AudioServicesPlayAlertSound (1105);
}
}
Catatan Penting: Peringatan Penghentian Masa Depan.
Pada iOS 9.0 , deskripsi fungsi API untuk:
AudioServicesPlaySystemSound(inSystemSoundID: SystemSoundID)
AudioServicesPlayAlertSound(inSystemSoundID: SystemSoundID)
termasuk catatan berikut:
This function will be deprecated in a future release.
Use AudioServicesPlayAlertSoundWithCompletion or
AudioServicesPlaySystemSoundWithCompletion instead.
Cara yang tepat untuk menggunakan salah satu dari dua ini:
AudioServicesPlayAlertSoundWithCompletion(kSystemSoundID_Vibrate, nil)
atau
AudioServicesPlayAlertSoundWithCompletion(kSystemSoundID_Vibrate) {
//your callback code when the vibration is done (it may not vibrate in iPod, but this callback will be always called)
}
ingat untuk
import AVFoundation
Untuk iPhone 7/7 Plus atau lebih baru, gunakan tiga API umpan balik Haptic ini.
let generator = UINotificationFeedbackGenerator()
generator.notificationOccured(style: .error)
Gaya yang tersedia adalah .error
, .success
, dan .warning
. Masing-masing memiliki nuansa tersendiri.
Dari dokumen :
UIFeedbackGenerator
Subkelas konkret yang menciptakan haptics untuk mengomunikasikan keberhasilan, kegagalan, dan peringatan.
let generator = UIImpactFeedbackGenerator(style: .medium)
generator.impactOccured()
Gaya yang tersedia adalah .heavy
, .medium
, dan .light
. Ini adalah getaran sederhana dengan berbagai tingkat "kekerasan".
Dari dokumen :
UIFeedbackGenerator
Subkelas konkret yang menciptakan haptics untuk mensimulasikan dampak fisik
let generator = UISelectionFeedbackGenerator()
generator.selectionChanged()
Ini adalah yang paling tidak terlihat dari semua haptics, dan juga yang paling cocok untuk saat haptics tidak boleh mengambil alih pengalaman aplikasi.
Dari dokumen :
UIFeedbackGenerator
Subkelas konkret yang membuat haptics untuk mengindikasikan perubahan dalam pemilihan.
Ada beberapa hal yang perlu diingat ketika menggunakan API ini.
Anda sebenarnya tidak membuat haptic. Anda meminta sistem menghasilkan haptic. Sistem akan memutuskan berdasarkan hal-hal berikut:
Karena itu, sistem akan secara diam-diam mengabaikan permintaan Anda akan haptic jika itu tidak mungkin. Jika ini disebabkan oleh perangkat yang tidak didukung, Anda dapat mencoba ini:
func haptic() {
// Get whether the device can generate haptics or not
// If feedbackSupportLevel is nil, will assign 0
let feedbackSupportLevel = UIDevice.current.value(forKey: "_feedbackSupportLevel") as? Int ?? 0
switch feedbackSupportLevel {
case 2:
// 2 means the device has a Taptic Engine
// Put Taptic Engine code here, using the APIs explained above
case 1:
// 1 means no Taptic Engine, but will support AudioToolbox
// AudioToolbox code from the myriad of other answers!
default: // 0
// No haptic support
// Do something else, like a beeping noise or LED flash instead of haptics
}
Ganti komentar dalam switch
- case
pernyataan, dan kode generasi haptic ini akan portabel untuk perangkat iOS lainnya. Ini akan menghasilkan tingkat haptic tertinggi.
prepare()
metode, untuk membuatnya siap. Menggunakan Game Anda Sebagai contoh: Anda mungkin tahu bahwa game ini akan berakhir, oleh pengguna yang memiliki HP sangat rendah, atau monster berbahaya berada di dekat mereka.
Dalam hal ini, mempersiapkan Mesin Taptic akan menciptakan pengalaman yang lebih berkualitas dan lebih responsif.
Sebagai contoh, katakanlah aplikasi Anda menggunakan recogniser gerakan panci untuk mengubah bagian dunia yang terlihat. Anda ingin haptic dihasilkan ketika pengguna 'terlihat' bulat 360 derajat. Inilah cara Anda dapat menggunakan prepare()
:
@IBAction func userChangedViewablePortionOfWorld(_ gesture: UIPanGestureRecogniser!) {
haptic = UIImpactFeedbackGenerator(style: .heavy)
switch gesture.state {
case .began:
// The user started dragging the screen.
haptic.prepare()
case .changed:
// The user trying to 'look' in another direction
// Code to change viewable portion of the virtual world
if virtualWorldViewpointDegreeMiddle = 360.0 {
haptic.impactOccured()
}
default:
break
}
import UIKit
!
haptic
di dalam metode ini. Anda tidak memanggil impactOccured
pada contoh yang sama yang Anda panggil prepare
.
Dalam perjalanan saya, saya telah menemukan bahwa jika Anda mencoba salah satu dari yang berikut saat Anda merekam audio, perangkat tidak akan bergetar meskipun diaktifkan.
1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
Metode saya dipanggil pada waktu tertentu dalam pengukuran gerakan perangkat. Saya harus menghentikan rekaman dan kemudian memulai kembali setelah getaran terjadi.
Terlihat seperti ini.
-(void)vibrate {
[recorder stop];
AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
[recorder start];
}
recorder
adalah instance AVRecorder.
Semoga ini bisa membantu orang lain yang memiliki masalah yang sama sebelumnya.
Di iOS 10, dan pada iPhone yang lebih baru, Anda juga dapat menggunakan API haptic. Umpan balik haptic ini lebih lunak daripada AudioToolbox API.
Untuk skenario GAME OVER Anda, umpan balik dampak UI yang berat harus cocok.
UIImpactFeedbackGenerator(style: .heavy).impactOccurred()
Anda dapat menggunakan gaya umpan balik haptic lainnya .
Dalam kasus saya, saya menggunakan AVCaptureSession. AudioToolbox sedang dalam fase pembangunan proyek dan itu diimpor tetapi masih tidak berfungsi. Untuk membuatnya berfungsi, saya menghentikan sesi sebelum getaran dan melanjutkan setelah itu.
#import <AudioToolbox/AudioToolbox.h>
...
@property (nonatomic) AVCaptureSession *session;
...
- (void)vibratePhone;
{
[self.session stopRunning];
NSLog(@"vibratePhone %@",@"here");
if([[UIDevice currentDevice].model isEqualToString:@"iPhone"])
{
AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
}
else
{
AudioServicesPlayAlertSound (kSystemSoundID_Vibrate);
}
[self.session startRunning];
}
Kamu bisa memakai
1) AudioServicesPlayAlertSound (kSystemSoundID_Vibrate);
untuk iPhone dan beberapa iPod yang lebih baru.
2) AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
untuk iPad.