read

1. AudioToolbox

  1. Target > Linked Frameworks and Libraries > Add AudioToolbox

  2. import AudioToolbox

  3. AudioServicesPlaySystemSoundWithCompletion(kSystemSoundID_Vibrate, nil)

It is that simple using AudioServicesPlaySystemSound API.

2. Haptic API

In iOS 10, there is a new API, making use of the new haptic engine in iPhone.

The API is very simple, with 3 concrete classes to UIFeedbackGenerator. Use accordingly to your scenario.

    // UI "impact"
    UIImpactFeedbackGenerator(style: .light).impactOccurred()
    UIImpactFeedbackGenerator(style: .medium).impactOccurred()
    UIImpactFeedbackGenerator(style: .heavy).impactOccurred()

    // Selection changed
    UISelectionFeedbackGenerator().selectionChanged()

    // Notifications
    UINotificationFeedbackGenerator().notificationOccurred(.success)
    UINotificationFeedbackGenerator().notificationOccurred(.error)
    UINotificationFeedbackGenerator().notificationOccurred(.warning)

    // To be complete, this is the vibration using AudioToolbox
    AudioServicesPlaySystemSoundWithCompletion(kSystemSoundID_Vibrate, nil)

Pitfall: Does not work along with other audio session

There is a note:

However, the device does not vibrate if your app’s audio session is configured with the AVAudioSessionCategoryPlayAndRecord or AVAudioSessionCategoryRecord audio session category.

While the note is for AudioServicesPlayAlertSound, it is applicable to AudioServicesPlaySystemSound too.

As long as you have a audio session (via AVAudioPlayer, AVCaptureMovieFileOutput, etc), then the phone will NOT vibrate.


Image

@samwize

¯\_(ツ)_/¯

Back to Home