Come far vibrare iPhone usando Swift?


116

Devo far vibrare l'iPhone, ma non so come farlo in Swift. So che in Objective-C scrivi semplicemente:

import AudioToolbox
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

Ma questo non funziona per me.



Qui troverai tutti i codici per ogni .caf e categoria associata: github.com/TUNER88/iOSSystemSoundsLibrary Ad esempio se vuoi una vibrazione più leggera puoi usare il codice 1003.
O. Boujaouane

Risposte:


225

Breve esempio:

import UIKit
import AudioToolbox

class ViewController: UIViewController {

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

caricare sul telefono e vibrerà. Puoi metterlo in una funzione o IBAction come desideri.

Aggiornamento del codice:

 AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) { }

Come scritto nei documenti del codice Apple:

Questa funzione sarà deprecata in una versione futura. Utilizza invece AudioServicesPlaySystemSoundWithCompletion.

NOTA: se la vibrazione non funziona. controllare che la vibrazione sia abilitata nelle impostazioni dei suoni e dei feedback tattili


1
c'è un modo per far vibrare continuamente il telefono finché non viene premuto un pulsante?
Nicholas

3
Ciò che Nicholas ha chiesto, mi chiedevo anche se c'è un modo per farlo vibrare secondo uno schema speciale.
Nathan McKaskle

1
So che c'è un GitHub che mostra gli ID di sistema per tutti i file audio dell'iPhone e 3 dei file con vibrazione, ma qualcuno sa come posso accedere agli ALTRI file con vibrazione? Ad esempio, voglio usare la vibrazione Staccato, ma non riesco a capire l'ID, o anche se ce n'è uno.
jammyman34

1
@Nicholas se trovo un'applicazione che mi chiede di premere un pulsante, altrimenti vibrerà per sempre, la cancellerò immediatamente dal mio dispositivo.
user3441734

2
Tieni presente che il dispositivo non vibra se la sessione audio della tua app è configurata con la categoria della sessione audio AVAudioSessionCategoryPlayAndRecord o AVAudioSessionCategoryRecord. Ciò garantisce che la vibrazione non interferisca con la registrazione audio.
Fede Henze

70

In iOS 10 su iPhone 7 o 7 Plus, prova:

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

1
usiamo tutti iOS 10, no? è la versione più recente, migliore e gratuita del sistema. tutti dovrebbero aggiornare, non ci sono compromessi per averlo.
Adam Smaka

13
Oltre a iOS 10, questa è solo una funzionalità che funzionerà con iPhone 7 o versioni successive. Verrà ignorato sui dispositivi più vecchi di iPhone 7.
C6Silver

@ C6Silver Sei vero. Non funziona su iPhone 4s, 5,5s, 5c e 6. Questi dispositivi che ho testato.
Rocky Balboa


45

Swift 4.2 aggiornato

Basta inserire il codice qui sotto nel tuo progetto.

uso

Vibration.success.vibrate()

Codice sorgente

  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))
            }
        }
    }

4
Non dimenticare di aggiungere "import AVFoundation" per utilizzare la vibrazione .oldSchool :)
atereshkov

Tranne i casi rimanenti .oldSchool che non funzionano Ho testato sul dispositivo fisico iPhone 6 qualche aiuto?
Sai kumar Reddy il

Dovresti spiegare che FeedbackGenerator è tattile e viene fornito con iPhone 7. Puoi anche avere una sola riga per ogni caso: UIImpactFeedbackGenerator (stile: .heavy) .impactOccurred ()
Medhi

22

Per iOS 10.0+ puoi provare UIFeedbackGenerator

ViewController semplice sopra, basta sostituire il controller di visualizzazione nella tua "app a visualizzazione singola" di prova

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
        }
    }
}

18

Possiamo farlo in Xcode7.1

import UIKit
import AudioToolbox


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
    }
}

12

Swift 4.2, 5.0

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

Puoi anche scegliere altri stili come

    style: .heavy
    style: .medium

    //Note: soft and rigid available in only iOS 13.0
    style: .soft
    style: .rigid

4

È possibile vibrare il telefono utilizzando AudioServiceso Haptic Feedback.

// AudioServices
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

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

Acquista il mio framework open source Haptica , supporta entrambi Haptic Feedback, AudioServicesed i modelli vibrazioni uniche. Funziona su Swift 4.2, Xcode 10


3
import AudioToolbox

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

Ora puoi semplicemente chiamare UIDevice.vibrate()se necessario.


2

UINotificationFeedbackGenerator disponibile da iOS 10 e funziona con Haptic v2, possiamo controllare questo:

  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))
        }

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.