Jak sprawić, by iPhone wibrował za pomocą Swift?

116

Muszę wprawić iPhone'a w wibracje, ale nie wiem, jak to zrobić w Swift. Wiem, że w Objective-C po prostu piszesz:

import AudioToolbox
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

Ale to nie działa dla mnie.

Nico Gutraich
źródło
Swift ma tę samą funkcję dostępną dla Ciebie: developer.apple.com/library/ios/documentation/AudioToolbox/ ...
Martijn Courteaux
Tutaj znajdziesz wszystkie kody dla każdego pliku .caf i powiązanej kategorii: github.com/TUNER88/iOSSystemSoundsLibrary Na przykład, jeśli chcesz lżejszych wibracji, możesz użyć kodu 1003.
O. Boujaouane

Odpowiedzi:

225

Krótki przykład:

import UIKit
import AudioToolbox

class ViewController: UIViewController {

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

załaduj telefon i zacznie wibrować. Możesz umieścić go w funkcji lub IBAction, jak chcesz.

Aktualizacja kodu:

 AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) { }

Jak napisano w dokumencie Apple Code:

Ta funkcja zostanie wycofana w przyszłej wersji. Zamiast tego użyj AudioServicesPlaySystemSoundWithCompletion.

UWAGA: Jeśli wibracje nie działają. sprawdź wibracje jest włączone w ustawieniach dźwięków i haptyki

Steve Rosenberg
źródło
1
czy istnieje sposób, aby telefon wibrował w sposób ciągły do ​​momentu naciśnięcia przycisku?
Nicholas
3
To, o co zapytał Nicholas, również zastanawiałem się, czy jest sposób, aby wibrować w jakimś specjalnym wzorze.
Nathan McKaskle
1
Wiem, że istnieje github, który pokazuje ID systemu dla wszystkich plików audio iPhone'a i 3 plików wibracyjnych, ale czy ktoś wie, jak mogę uzyskać dostęp do INNYCH plików wibrujących? Chcę na przykład użyć wibracji Staccato, ale nie mogę znaleźć identyfikatora, ani nawet jeśli taki istnieje.
jammyman 34
1
@Nicholas jeśli znalazłem aplikację, która prosi mnie o naciśnięcie przycisku, w przeciwnym razie będzie wibrować w nieskończoność, zamierzam ją natychmiast usunąć z urządzenia.
user3441734
2
Należy pamiętać, że urządzenie nie wibruje, jeśli sesja dźwiękowa aplikacji jest skonfigurowana z kategorią sesji dźwiękowej AVAudioSessionCategoryPlayAndRecord lub AVAudioSessionCategoryRecord. Gwarantuje to, że wibracje nie będą zakłócać nagrywania dźwięku.
Fede Henze
70

W iOS 10 na iPhonie 7 lub 7 Plus spróbuj:

let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.impactOccurred()
Adam Smaka
źródło
1
wszyscy używamy iOS 10, prawda? to najnowsza, najlepsza i darmowa wersja systemu. każdy powinien zaktualizować, nie ma kompromisów z jego posiadaniem.
Adam Smaka
13
Poza iOS 10 jest to tylko funkcja, która będzie działać z iPhone'em 7 lub nowszym. Będzie ignorowany na urządzeniach starszych niż iPhone 7.
C6Silver
@ C6Silver Jesteś prawdziwy. Nie działa na iPhone 4s, 5,5s, 5c i 6. Te urządzenia, które testowałem.
Rocky Balboa,
45

Swift 4.2 Zaktualizowano

Po prostu wstaw poniższy kod do swojego projektu.

Stosowanie

Vibration.success.vibrate()

Kod źródłowy

  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
źródło
4
Nie zapomnij dodać „import AVFoundation”, aby korzystać z wibracji .oldSchool :)
atereshkov
Z wyjątkiem pozostałych przypadków .oldSchool, które nie działają. Testowałem na fizycznym urządzeniu iPhone 6, jakaś pomoc?
Sai kumar Reddy
Powinieneś wyjaśnić, że FeedbackGenerator jest haptyczny i pochodzi z iPhone'a 7. Możesz również mieć tylko jedną linię w każdym przypadku: UIImpactFeedbackGenerator (style: .heavy) .impactOccured ()
Medhi
22

W przypadku iOS 10.0+ Możesz wypróbować UIFeedbackGenerator

Prosty kontroler widoku powyżej, po prostu zamień kontroler widoku w testowej „aplikacji pojedynczego widoku”

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
źródło
18

Możemy to zrobić w Xcode7.1

import UIKit
import AudioToolbox


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
    }
}
ken0nek
źródło
12

Swift 4,2, 5,0

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

Możesz także wybrać inne style, takie jak

    style: .heavy
    style: .medium

    //Note: soft and rigid available in only iOS 13.0
    style: .soft
    style: .rigid
Rashid Latif
źródło
4

Możesz wibrować telefon za pomocą AudioServiceslub Haptic Feedback.

// AudioServices
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

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

Zamówienie moim otwartym ramach źródłowego Haptica , obsługuje zarówno Haptic Feedback, AudioServicesi niepowtarzalne wzory wibracje. Działa na Swift 4.2, Xcode 10

efremidze
źródło
3
import AudioToolbox

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

Teraz możesz po prostu dzwonić UIDevice.vibrate()w razie potrzeby.

Mohammad Razipour
źródło
2

UINotificationFeedbackGenerator dostępny od iOS 10 i współpracujący z Haptic v2, możemy to sprawdzić:

  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))
        }
Siergiej Łysiuk
źródło