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.


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


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

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

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

18

Możemy to zrobić w 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()
   } 

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

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


3
import AudioToolbox

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

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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.