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.


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


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

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

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

18

Wir können dies in Xcode7.1 tun

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

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

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


3
import AudioToolbox

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

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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.