¿Cómo hacer que el iPhone vibre con Swift?

116

Necesito hacer vibrar el iPhone, pero no sé cómo hacerlo en Swift. Sé que en Objective-C, solo escribe:

import AudioToolbox
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

Pero eso no me funciona.

Nico Gutraich
fuente
Swift tiene la misma función disponible para usted: developer.apple.com/library/ios/documentation/AudioToolbox/…
Martijn Courteaux
Aquí encontrará todos los códigos para cada .caf y categoría asociada: github.com/TUNER88/iOSSystemSoundsLibrary Por ejemplo, si desea una vibración más ligera, puede usar el código 1003.
O. Boujaouane

Respuestas:

225

Ejemplo corto:

import UIKit
import AudioToolbox

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))            
    }
}

cárguelo en su teléfono y vibrará. Puedes ponerlo en una función o IBAction como desees.

Actualización de código:

 AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) { }

Como están escritos los documentos de código de Apple:

Esta función quedará obsoleta en una versión futura. En su lugar, utilice AudioServicesPlaySystemSoundWithCompletion.

NOTA: Si vibrar no funciona. comprobar que la vibración esté habilitada en la configuración de sonidos y hápticos

Steve Rosenberg
fuente
1
¿Hay alguna manera de permitir que el teléfono vibre continuamente hasta que se presione un botón?
Nicholas
3
Lo que Nicholas preguntó, también me preguntaba si hay alguna manera de hacerlo vibrar en algún patrón especial.
Nathan McKaskle
1
Sé que hay un github que muestra las ID del sistema para todos los archivos de audio del iPhone y 3 de los archivos de vibración, pero ¿alguien sabe cómo puedo acceder a los OTROS archivos de vibración? Quiero usar la vibración Staccato, por ejemplo, pero no puedo averiguar la identificación, o incluso si hay una.
jammyman34
1
@Nicholas si encontré una aplicación que me pide que presione un botón, de lo contrario vibrará para siempre, la eliminaré de mi dispositivo de inmediato.
user3441734
2
Tenga en cuenta que el dispositivo no vibra si la sesión de audio de su aplicación está configurada con la categoría de sesión de audio AVAudioSessionCategoryPlayAndRecord o AVAudioSessionCategoryRecord. Esto asegura que la vibración no interfiera con la grabación de audio.
Fede Henze
70

En iOS 10 en iPhone 7 o 7 Plus, intente:

let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.impactOccurred()
Adam Smaka
fuente
1
todos usamos iOS 10, ¿no? es la versión más nueva, mejor y gratuita del sistema. todos deberían actualizar, no hay compromisos de tenerlo.
Adam Smaka
13
Más allá de iOS 10, esta es solo una característica que funcionará con iPhone 7 o posterior. Se ignorará en dispositivos más antiguos que el iPhone 7.
C6Silver
@ C6Silver Es verdad. No funciona en iPhone 4s, 5,5s, 5c y 6. Estos dispositivos los he probado.
Rocky Balboa
45

Swift 4.2 actualizado

Simplemente inserte el código a continuación en su proyecto.

Uso

Vibration.success.vibrate()

Código fuente

  enum Vibration {
        case error
        case success
        case warning
        case light
        case medium
        case heavy
        @available(iOS 13.0, *)
        case soft
        @available(iOS 13.0, *)
        case rigid
        case selection
        case oldSchool

        public func vibrate() {
            switch self {
            case .error:
                UINotificationFeedbackGenerator().notificationOccurred(.error)
            case .success:
                UINotificationFeedbackGenerator().notificationOccurred(.success)
            case .warning:
                UINotificationFeedbackGenerator().notificationOccurred(.warning)
            case .light:
                UIImpactFeedbackGenerator(style: .light).impactOccurred()
            case .medium:
                UIImpactFeedbackGenerator(style: .medium).impactOccurred()
            case .heavy:
                UIImpactFeedbackGenerator(style: .heavy).impactOccurred()
            case .soft:
                if #available(iOS 13.0, *) {
                    UIImpactFeedbackGenerator(style: .soft).impactOccurred()
                }
            case .rigid:
                if #available(iOS 13.0, *) {
                    UIImpactFeedbackGenerator(style: .rigid).impactOccurred()
                }
            case .selection:
                UISelectionFeedbackGenerator().selectionChanged()
            case .oldSchool:
                AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
            }
        }
    }
muhasturk
fuente
4
No olvide agregar 'importar AVFoundation' para usar la vibración .oldSchool :)
atereshkov
Excepto que los casos restantes de .oldSchool no funcionan. Probé en el dispositivo físico iPhone 6. ¿Alguna ayuda?
Sai kumar Reddy
Debe explicar que FeedbackGenerator es háptico y viene con el iPhone 7. También puede tener solo una línea en cada caso: UIImpactFeedbackGenerator (estilo: .heavy) .impactOccurred ()
Medhi
22

Para iOS 10.0+ puede probar UIFeedbackGenerator

ViewController simple arriba, simplemente reemplace su controlador de vista en su "aplicación de vista única" de prueba

import UIKit

class ViewController: UIViewController {

    var i = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        let btn = UIButton()
        self.view.addSubview(btn)
        btn.translatesAutoresizingMaskIntoConstraints = false

        btn.widthAnchor.constraint(equalToConstant: 160).isActive = true
        btn.heightAnchor.constraint(equalToConstant: 160).isActive = true
        btn.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        btn.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

        btn.setTitle("Tap me!", for: .normal)
        btn.setTitleColor(UIColor.red, for: .normal)
        btn.addTarget(self, action: #selector(tapped), for: .touchUpInside)
    }

    @objc func tapped() {
        i += 1
        print("Running \(i)")

        switch i {
        case 1:
            let generator = UINotificationFeedbackGenerator()
            generator.notificationOccurred(.error)

        case 2:
            let generator = UINotificationFeedbackGenerator()
            generator.notificationOccurred(.success)

        case 3:
            let generator = UINotificationFeedbackGenerator()
            generator.notificationOccurred(.warning)

        case 4:
            let generator = UIImpactFeedbackGenerator(style: .light)
            generator.impactOccurred()
        case 5:
            let generator = UIImpactFeedbackGenerator(style: .medium)
            generator.impactOccurred()

        case 6:
            let generator = UIImpactFeedbackGenerator(style: .heavy)
            generator.impactOccurred()

        default:
            let generator = UISelectionFeedbackGenerator()
            generator.selectionChanged()
            i = 0
        }
    }
}
Malder
fuente
18

Podemos hacer esto en Xcode7.1

import UIKit
import AudioToolbox


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
    }
}
Ken0nek
fuente
12

Swift 4.2, 5.0

 if #available(iOS 10.0, *) {
      UIImpactFeedbackGenerator(style: .light).impactOccurred()
   } 

También puedes elegir otros estilos como

    style: .heavy
    style: .medium

    //Note: soft and rigid available in only iOS 13.0
    style: .soft
    style: .rigid
Rashid Latif
fuente
4

Puede hacer vibrar el teléfono usando AudioServiceso Haptic Feedback.

// AudioServices
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

// Haptic Feedback
UIImpactFeedbackGenerator(style: .medium).impactOccurred()

Compra final de código abierto Haptica , es compatible tanto Haptic Feedback, AudioServicesy los patrones de vibraciones únicas. Funciona en Swift 4.2, Xcode 10

efremidze
fuente
3
import AudioToolbox

extension UIDevice {
    static func vibrate() {
        AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
    }
}

Ahora puede llamar UIDevice.vibrate()cuando sea necesario.

Mohammad Razipour
fuente
2

UINotificationFeedbackGenerator disponible desde iOS 10 y funciona con Haptic v2, podemos comprobar esto:

  let feedbackSupportLevel = UIDevice.current.value(forKey: "_feedbackSupportLevel") as? Int
        if #available(iOS 10.0, *), let feedbackSupportLevel = feedbackSupportLevel, feedbackSupportLevel > 1 {
            do { // 1
                let generator = UIImpactFeedbackGenerator(style: .medium)
                generator.impactOccurred()
            }

            do { // or 2
                let generator = UINotificationFeedbackGenerator()
                generator.notificationOccurred(.success)
            }
        } else {
            AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
        }
Sergei Lysiuk
fuente