Wie kann man das iPhone mit Swift zum Vibrieren bringen?

116

Ich muss das iPhone zum Vibrieren bringen, aber ich weiß nicht, wie ich das in Swift machen soll. Ich weiß, dass Sie in Objective-C einfach schreiben:

import AudioToolbox
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

Aber das funktioniert bei mir nicht.

Nico Gutraich
quelle
Swift hat die gleiche Funktion für Sie zur Verfügung: developer.apple.com/library/ios/documentation/AudioToolbox/…
Martijn Courteaux
Hier finden Sie alle Codes für jede .caf und zugehörige Kategorie: github.com/TUNER88/iOSSystemSoundsLibrary Wenn Sie beispielsweise eine leichtere Vibration wünschen, können Sie den Code 1003 verwenden.
O. Boujaouane

Antworten:

225

Kurzes Beispiel:

import UIKit
import AudioToolbox

class ViewController: UIViewController {

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

Laden Sie es auf Ihr Telefon und es vibriert. Sie können es in eine Funktion oder IBAction einfügen, wie Sie möchten.

Code-Aktualisierung:

 AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) { }

Als Apple-Code-Dokumente geschrieben:

Diese Funktion wird in einer zukünftigen Version nicht mehr unterstützt. Verwenden Sie stattdessen AudioServicesPlaySystemSoundWithCompletion.

HINWEIS: Wenn Vibration nicht funktioniert. Überprüfen Sie, ob Vibration in den Einstellungen für Sounds und Haptik aktiviert ist

Steve Rosenberg
quelle
1
Gibt es eine Möglichkeit, das Telefon kontinuierlich vibrieren zu lassen, bis eine Taste gedrückt wird?
Nicholas
3
Was Nicholas fragte, fragte ich mich auch, ob es eine Möglichkeit gibt, es in einem speziellen Muster zum Vibrieren zu bringen.
Nathan McKaskle
1
Ich weiß, dass es einen Github gibt, der die System-IDs für alle iPhone-Audiodateien und 3 der Vibrationsdateien anzeigt, aber weiß jemand, wie ich auf die ANDEREN Vibrationsdateien zugreifen kann? Ich möchte zum Beispiel die Staccato-Vibration verwenden, kann aber die ID nicht herausfinden, oder auch wenn es eine gibt.
Jammyman34
1
@Nicholas Wenn ich eine Anwendung gefunden habe, die mich auffordert, einen Knopf zu drücken, sonst vibriert sie für immer. Ich werde sie sofort von meinem Gerät löschen.
user3441734
2
Beachten Sie, dass das Gerät nicht vibriert, wenn die Audiositzung Ihrer App mit der Audiositzungskategorie AVAudioSessionCategoryPlayAndRecord oder AVAudioSessionCategoryRecord konfiguriert ist. Dies stellt sicher, dass Vibrationen die Audioaufnahme nicht beeinträchtigen.
Fede Henze
70

Versuchen Sie in iOS 10 auf iPhone 7 oder 7 Plus:

let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.impactOccurred()
Adam Smaka
quelle
1
Wir alle benutzen iOS 10, nicht wahr? Es ist die neueste, beste und kostenlose Version des Systems. Jeder sollte aktualisieren, es gibt keine Kompromisse, es zu haben.
Adam Smaka
13
Über iOS 10 hinaus ist dies nur eine Funktion, die mit iPhone 7 oder höher funktioniert. Es wird auf Geräten ignoriert, die älter als das iPhone 7 sind.
C6Silver
@ C6Silver Du bist wahr. Es funktioniert nicht auf iPhone 4s, 5,5s, 5c und 6. Diese Geräte habe ich getestet.
Rocky Balboa
44

Swift 4.2 aktualisiert

Fügen Sie einfach den folgenden Code in Ihr Projekt ein.

Verwendung

Vibration.success.vibrate()

Quellcode

  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
quelle
4
Vergessen Sie nicht, 'AVFoundation importieren' hinzuzufügen, um .oldSchool vibration zu verwenden :)
atereshkov
Außer .oldSchool verbleibenden Fällen, die nicht funktionieren Ich habe auf dem iPhone 6 physischen Gerät eine Hilfe getestet?
Sai Kumar Reddy
Sie sollten erklären, dass FeedbackGenerator haptisch ist und mit dem iPhone 7 geliefert wurde. Sie können auch jeweils nur eine Zeile verwenden: UIImpactFeedbackGenerator (Stil: .heavy) .impactOccurred ()
Medhi
22

Für iOS 10.0+ können Sie versuchen UIFeedbackGenerator

Einfacher viewController oben, ersetzen Sie einfach Ihren View Controller in Ihrer Test "Single View App".

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

Wir können dies in Xcode7.1 tun

import UIKit
import AudioToolbox


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
    }
}
ken0nek
quelle
12

Swift 4.2, 5.0

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

Sie können auch andere Stile wie wählen

    style: .heavy
    style: .medium

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

Sie können das Telefon entweder mit AudioServicesoder vibrieren lassen Haptic Feedback.

// AudioServices
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

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

Zur Kasse Meine Open Source Framework Haptica unterstützt es sowohl Haptic Feedback, AudioServicesund einzigartige Schwingungen Muster. Funktioniert mit Swift 4.2, Xcode 10

efremidze
quelle
3
import AudioToolbox

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

Jetzt können Sie einfach UIDevice.vibrate()nach Bedarf anrufen .

Mohammad Razipour
quelle
2

UINotificationFeedbackGenerator ist ab iOS 10 verfügbar und funktioniert mit Haptic v2. Wir können dies überprüfen:

  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
quelle