Comment faire vibrer l'iPhone avec Swift?

116

J'ai besoin de faire vibrer l'iPhone, mais je ne sais pas comment faire cela dans Swift. Je sais qu'en Objective-C, vous écrivez simplement:

import AudioToolbox
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

Mais cela ne fonctionne pas pour moi.

Nico Gutraich
la source
Swift a la même fonction disponible pour vous: developer.apple.com/library/ios/documentation/AudioToolbox/...
Martijn Courteaux
Vous trouverez ici tous les codes pour chaque .caf et la catégorie associée: github.com/TUNER88/iOSSystemSoundsLibrary Par exemple si vous voulez une vibration plus légère vous pouvez utiliser le code 1003.
O. Boujaouane

Réponses:

225

Exemple court:

import UIKit
import AudioToolbox

class ViewController: UIViewController {

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

charger sur votre téléphone et il vibrera. Vous pouvez le mettre dans une fonction ou IBAction comme vous le souhaitez.

Mise à jour du code:

 AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) { }

Comme l'écrit le code Apple:

Cette fonction sera obsolète dans une prochaine version. Utilisez plutôt AudioServicesPlaySystemSoundWithCompletion.

REMARQUE: si le vibreur ne fonctionne pas. vérifier que le vibreur est activé dans les paramètres sonores et haptiques

Steve Rosenberg
la source
1
existe-t-il un moyen de laisser le téléphone vibrer en continu jusqu'à ce qu'un bouton soit enfoncé?
Nicholas
3
Ce que Nicholas a demandé, je me demandais aussi s'il y avait un moyen de le faire vibrer selon un modèle spécial.
Nathan McKaskle
1
Je sais qu'il existe un github qui montre l'ID système de tous les fichiers audio de l'iPhone et 3 des fichiers de vibration, mais est-ce que quelqu'un sait comment je peux accéder aux AUTRES fichiers de vibration? Je veux utiliser le vibreur Staccato par exemple, mais je ne peux pas comprendre l'ID, ou même s'il y en a un.
jammyman34
1
@Nicholas si j'ai trouvé une application qui me demande d'appuyer sur un bouton, sinon elle vibrera pour toujours, je vais la supprimer immédiatement de mon appareil.
user3441734
2
Gardez à l'esprit que l'appareil ne vibre pas si la session audio de votre application est configurée avec la catégorie de session audio AVAudioSessionCategoryPlayAndRecord ou AVAudioSessionCategoryRecord. Cela garantit que les vibrations n'interfèrent pas avec l'enregistrement audio.
Fede Henze
70

Sous iOS 10 sur iPhone 7 ou 7 Plus, essayez:

let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.impactOccurred()
Adam Smaka
la source
1
nous utilisons tous iOS 10, n'est-ce pas? c'est la version la plus récente, la meilleure et la plus gratuite du système. tout le monde devrait mettre à jour, il n'y a aucun compromis à l'avoir.
Adam Smaka
13
Au-delà d'iOS 10, ce n'est qu'une fonctionnalité qui fonctionnera avec l'iPhone 7 ou une version ultérieure. Il sera ignoré sur les appareils plus anciens que l'iPhone 7.
C6Silver
@ C6Silver Vous êtes vrai. Cela ne fonctionne pas sur les iPhone 4s, 5,5s, 5c et 6. Ces appareils que j'ai testés.
Rocky Balboa
45

Swift 4.2 mis à jour

Insérez simplement le code ci-dessous dans votre projet.

Usage

Vibration.success.vibrate()

Code source

  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
la source
4
N'oubliez pas d'ajouter 'import AVFoundation' afin d'utiliser .oldSchool vibration :)
atereshkov
Sauf les cas restants .oldSchool ne fonctionnent pas J'ai testé dans l'appareil physique iPhone 6 une aide
Sai kumar Reddy le
Vous devriez expliquer que FeedbackGenerator est haptique et qu'il est venu avec l'iPhone 7. Vous pouvez également avoir une seule ligne dans chaque cas: UIImpactFeedbackGenerator (style: .heavy) .impactOccurred ()
Medhi
22

Pour iOS 10.0+, vous pouvez essayer UIFeedbackGenerator

ViewController simple ci-dessus, remplacez simplement votre contrôleur de vue dans votre test "application à vue unique"

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
la source
18

Nous pouvons le faire dans Xcode7.1

import UIKit
import AudioToolbox


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
    }
}
ken0nek
la source
12

Swift 4.2 et 5.0

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

Vous pouvez également choisir d'autres styles comme

    style: .heavy
    style: .medium

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

Vous pouvez faire vibrer le téléphone à l'aide de AudioServicesou Haptic Feedback.

// AudioServices
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

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

Commander mon framework open source Haptica , il prend en charge Haptic Feedback, AudioServiceset les modèles de vibrations uniques. Fonctionne sur Swift 4.2, Xcode 10

efremidze
la source
3
import AudioToolbox

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

Maintenant, vous pouvez simplement appeler UIDevice.vibrate()au besoin.

Mohammad Razipour
la source
2

UINotificationFeedbackGenerator disponible à partir d'iOS 10 et fonctionne avec Haptic v2, nous pouvons vérifier ceci:

  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
la source