Заставляя iPhone вибрировать


Как можно настроить iPhone на вибрацию один раз?

например, когда игрок теряет жизнь или игра закончена, iPhone должен вибрировать.

12 217

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 swift typedef) для 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];
}

можно использовать

1) AudioServicesPlayAlertSound (kSystemSoundID_Vibrate);

для iPhone и нескольких новых плееров.

2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

для iPads.