Como fazer o iPhone vibrar usando o Swift?

116

Preciso fazer o iPhone vibrar, mas não sei como fazer isso no Swift. Eu sei que em Objective-C, você apenas escreve:

import AudioToolbox
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

Mas isso não está funcionando para mim.

Nico Gutraich
fonte
Swift tem a mesma função disponível para você: developer.apple.com/library/ios/documentation/AudioToolbox/…
Martijn Courteaux
Aqui você encontrará todos os códigos para cada .caf e categoria associada: github.com/TUNER88/iOSSystemSoundsLibrary Por exemplo, se você quiser uma vibração mais leve, pode usar o código 1003.
O. Boujaouane

Respostas:

225

Pequeno exemplo:

import UIKit
import AudioToolbox

class ViewController: UIViewController {

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

carregue em seu telefone e ele vibrará. Você pode colocá-lo em uma função ou IBAction como desejar.

Atualização de código:

 AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) { }

Como os documentos de código da Apple foram escritos:

Esta função será descontinuada em uma versão futura. Use AudioServicesPlaySystemSoundWithCompletion em vez disso.

NOTA: Se vibrar não funcionar. verificar se a vibração está habilitada nas configurações de sons e tatos

Steve Rosenberg
fonte
1
existe uma maneira de deixar o telefone vibrar continuamente até que um botão seja pressionado?
Nicholas
3
O que Nicholas perguntou, também eu queria saber se há uma maneira de fazer vibrar em algum padrão especial.
Nathan McKaskle
1
Eu sei que há um github que mostra os IDs do sistema para todos os arquivos de áudio do iPhone e 3 dos arquivos de vibração, mas alguém sabe como posso acessar os OUTROS arquivos de vibração? Quero usar a vibração Staccato por exemplo, mas não consigo descobrir o ID, ou mesmo se houver um.
jammyman34
1
@Nicholas se eu encontrar um aplicativo que me pede para pressionar um botão, caso contrário, ele vibrará para sempre, vou excluí-lo do meu dispositivo imediatamente.
user3441734
2
Lembre-se de que o dispositivo não vibra se a sessão de áudio do seu aplicativo estiver configurada com a categoria de sessão de áudio AVAudioSessionCategoryPlayAndRecord ou AVAudioSessionCategoryRecord. Isso garante que a vibração não interfira na gravação de áudio.
Fede Henze
70

No iOS 10 no iPhone 7 ou 7 Plus, tente:

let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.impactOccurred()
Adam Smaka
fonte
1
todos nós usamos iOS 10, não é? é a versão mais recente, melhor e gratuita do sistema. todos devem atualizar, não há compromisso de tê-lo.
Adam Smaka
13
Além do iOS 10, este é apenas um recurso que funcionará com o iPhone 7 ou posterior. Ele será ignorado em dispositivos anteriores ao iPhone 7.
C6Silver
@ C6Silver Você é verdadeiro. Não está funcionando no iPhone 4s, 5,5s, 5c e 6. Esses dispositivos eu testei.
Rocky Balboa,
45

Swift 4.2 Atualizado

Basta inserir o código abaixo em seu projeto.

Uso

Vibration.success.vibrate()

Código fonte

  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
fonte
4
Não se esqueça de adicionar 'import AVFoundation' para usar .oldSchool vibration :)
atereshkov
Exceto os casos restantes .oldSchool não funcionam, eu testei no dispositivo físico do iPhone 6, alguma ajuda?
Sai kumar Reddy
Você deve explicar que o FeedbackGenerator é háptico e veio com o iPhone 7. Você também pode ter apenas uma linha em cada caso: UIImpactFeedbackGenerator (estilo: .heavy) .impactOccurred ()
Medhi
22

Para iOS 10.0+ Você pode experimentar UIFeedbackGenerator

ViewController simples acima, basta substituir seu controlador de visualização em seu "aplicativo de visualização única" de teste

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
fonte
18

Podemos fazer isso no Xcode7.1

import UIKit
import AudioToolbox


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
    }
}
Ken0nek
fonte
12

Swift 4.2, 5.0

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

Você também pode escolher outros estilos, como

    style: .heavy
    style: .medium

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

Você pode vibrar o telefone usando AudioServicesou Haptic Feedback.

// AudioServices
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

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

Verifique minha estrutura de código aberto Confira Haptica , ele suporta ambos Haptic Feedback, AudioServicese padrões de vibração únicos. Funciona em Swift 4.2, Xcode 10

efremidze
fonte
3
import AudioToolbox

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

Agora você pode ligar UIDevice.vibrate()conforme necessário.

Mohammad Razipour
fonte
2

UINotificationFeedbackGenerator disponível no iOS 10 e funciona com Haptic v2, podemos verificar isso:

  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
fonte