Заставляя iPhone вибрировать
Как можно настроить iPhone на вибрацию один раз?
например, когда игрок теряет жизнь или игра закончена, iPhone должен вибрировать.
12 ответов:
от "учебник для iPhone: Лучший способ проверить возможности устройств iOS":
есть две, казалось бы, похожие функции, которые принимают параметр
kSystemSoundID_Vibrate
:1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate); 2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
обе функции вибрируют iPhone. Но, когда вы используете первый функция на устройствах, которые не поддерживают вибрацию, он играет звуковой сигнал звук. Вторая функция, с другой стороны, ничего не делает неподдерживаемое устройство. Так что если вы собираетесь вибрировать устройство постоянно, как предупреждает здравый смысл, используйте функцию 2.
во-первых, добавьте audiotoolbox framework
AudioToolbox.framework
к вашей цели в фазах сборки.затем импортируйте этот файл заголовка:
#import <AudioToolbox/AudioServices.h>
Swift 3.0
то же, что и 2.0, без изменений.
Swift 2.0
AudioToolbox теперь представляет
kSystemSoundID_Vibrate
какSystemSoundID
типа, вот код:import AudioToolbox.AudioServices AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
вместо того, чтобы идти через дополнительный шаг броска
(реквизит для @Dov)
Оригинальный Ответ (Swift 1.x)
и вот как вы делаете это Свифт (в случае, если вы столкнулись с той же проблемой, что и я)
ссылка в отношении
AudioToolbox.framework
(перейдите в свой проект, выберите свою цель, создайте фазы, свяжите двоичный файл с библиотеками, добавьте туда библиотеку)как только это будет завершена:
import AudioToolbox.AudioServices // Use either of these AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate)) AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
дрянная штука в том, что
SystemSoundID
в основномtypealias
(fancy swifttypedef
) дляUInt32
иkSystemSoundID_Vibrate
обычныйInt
. Компилятор выдает ошибку при попытке приведения изInt
доUInt32
, но ошибка читается как "не удается преобразовать в SystemSoundID", что сбивает с толку. Почему разве apple просто не сделала это быстрым перечислением вне меня.@aponomarenko идет в детали, мой ответ только для Свифтеров там.
простой способ сделать это с аудио услуги:
#import <AudioToolbox/AudioToolbox.h> ... AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
у меня были большие проблемы с этим для устройств, которые каким-то образом отключили вибрацию, но нам нужно было работать независимо, потому что это критически важно для функционирования нашего приложения, и поскольку это просто целое число для документированного вызова метода, он пройдет проверку. Поэтому я попробовал некоторые звуки, которые были за пределами хорошо документированных здесь:TUNER88 / iOSSystemSoundsLibrary
затем я наткнулся на 1352, который работает независимо от молчания переключатель или настройки на устройстве
(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); } }
важное примечание: предупреждение о будущем исключении.
по состоянию на iOS 9.0 на API функции описание:
AudioServicesPlaySystemSound(inSystemSoundID: SystemSoundID) AudioServicesPlayAlertSound(inSystemSoundID: SystemSoundID)
включает в себя следующее примечание:
This function will be deprecated in a future release. Use AudioServicesPlayAlertSoundWithCompletion or AudioServicesPlaySystemSoundWithCompletion instead.
правильно будет использовать любой из этих двух:
AudioServicesPlayAlertSoundWithCompletion(kSystemSoundID_Vibrate, nil)
или
AudioServicesPlayAlertSoundWithCompletion(kSystemSoundID_Vibrate) { //your callback code when the vibration is done (it may not vibrate in iPod, but this callback will be always called) }
не забудьте
import AVFoundation
и если вы используете Xamarin (monotouch) framework, просто позвоните
SystemSound.Vibrate.PlayAlertSound()
в моих путешествиях я обнаружил, что если вы попробуйте один из следующих во время записи звука, устройство не будет вибрировать даже если он включен.
1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate); 2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
мой метод был вызван в определенное время при измерении перемещений устройств. Мне пришлось остановить запись, а затем перезапустить ее после того, как произошла вибрация.
Это выглядело так.
-(void)vibrate { [recorder stop]; AudioServicesPlaySystemSound (kSystemSoundID_Vibrate); [recorder start]; }
recorder
является экземпляром AVRecorder.надеюсь, это поможет другим, что была такая же проблема раньше.
В Swift:
import AVFoundation ... AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
в iOS 10 и на новых iPhone вы также можете использовать haptic API. Эта тактильная обратная связь мягче, чем API AudioToolbox.
для вашей игры над сценарием, тяжелая обратная связь UI impact должна быть подходящей.
UIImpactFeedbackGenerator(style: .heavy).impactOccurred()
вы могли бы использовать другие тактильные стили обратной связи.
все устройства имеют встроенный двигатель для создания вибрационных эффектов, и если вы просто хотите быстрой вибрации.
extension UIDevice { static func vibrate() { AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) } }
теперь вы можете просто позвонить по мере необходимости.
UIDevice.vibrate()
в моем случае я использовал AVCaptureSession. AudioToolbox был на этапах сборки проекта, и он был импортирован, но все еще не работал. Чтобы заставить его работать, я остановил сеанс до вибрации и продолжил после этого.
#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]; }