Das iPhone zum Vibrieren bringen

228

Wie kann das iPhone so eingestellt werden, dass es einmal vibriert?

Wenn ein Spieler beispielsweise ein Leben verliert oder das Spiel beendet ist, sollte das iPhone vibrieren.

System
quelle
9
Die Schüttelgeste ist völlig anders als die Vibration. Einer ist vom Menschen initiiert, einer vom Gerät initiiert.
Eiko

Antworten:

404

Aus " iPhone Tutorial: Besserer Weg, um die Funktionen von iOS-Geräten zu überprüfen ":

Es gibt zwei scheinbar ähnliche Funktionen, die einen Parameter annehmen kSystemSoundID_Vibrate:

1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

Beide Funktionen vibrieren das iPhone. Wenn Sie jedoch die erste Funktion auf Geräten verwenden, die keine Vibrationen unterstützen, ertönt ein Piepton. Die zweite Funktion hingegen führt auf nicht unterstützten Geräten nichts aus. Wenn Sie das Gerät also kontinuierlich vibrieren möchten, verwenden Sie laut gesundem Menschenverstand die Funktion 2.

Fügen Sie zunächst das AudioToolbox-Framework AudioToolbox.frameworkin Build-Phasen zu Ihrem Ziel hinzu.

Importieren Sie dann diese Header-Datei:

#import <AudioToolbox/AudioServices.h>
Linuxbuild
quelle
3
#import <Cocoa / Cocoa.h> ist nicht erforderlich.
Raptor
10
Gibt es eine Möglichkeit, die Vibrationszeit auf weniger als 1 Sekunde zu reduzieren?
George Asda
11
Ich möchte hinzufügen, dass Benutzer, wenn die Vibration in den Einstellungen von iOS deaktiviert ist, keine Vibration erhalten, selbst wenn Sie diese Befehle verwenden.
Denis Kutlubaev
7
In Swift: AudioServicesPlayAlertSound(UInt32(kSystemSoundID_Vibrate))(mindestens ab Beta 2)
Sam Soffes
1
AudioServicesPlayAlertSound (kSystemSoundID_Vibrate); Vibarate auf dem iPhone proerly, aber es gibt keinen Piepton auf dem iPad.
Mangesh
45

Swift 2.0+

AudioToolbox präsentiert das jetzt kSystemSoundID_Vibrateals SystemSoundIDTyp, daher lautet der Code:

import AudioToolbox.AudioServices

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)

Anstatt den zusätzlichen Besetzungsschritt durchlaufen zu müssen

(Requisiten an @Dov)

Ursprüngliche Antwort (Swift 1.x)

Und so machen Sie es auf Swift (falls Sie auf die gleichen Probleme stoßen wie ich)

Verknüpfen gegen AudioToolbox.framework(Gehen Sie zu Ihrem Projekt, wählen Sie Ihr Ziel aus, erstellen Sie Phasen, verknüpfen Sie Binärdateien mit Bibliotheken und fügen Sie dort die Bibliothek hinzu.)

Sobald dies abgeschlossen ist:

import AudioToolbox.AudioServices

// Use either of these
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

Das kitschige Ding ist, dass SystemSoundIDim Grunde ein typealias(schickes schnelles typedef) für einUInt32 , und das kSystemSoundID_Vibrateist ein reguläres Int. Der Compiler gibt Ihnen einen Fehler beim Versuch, von Intzu UInt32konvertieren, aber der Fehler lautet "Kann nicht in SystemSoundID konvertiert werden", was verwirrend ist. Warum hat Apple es nicht einfach zu einer schnellen Aufzählung gemacht?

@ aponomarenko geht auf die Details ein, meine Antwort ist nur für die Swifters da draußen.

Können
quelle
Dies scheint in Swift 2 / iOS 9 / Xcode 7 behoben zu sein. Ich habe es verwendet AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)und es wurde gut kompiliert
Dov
35

Ein einfacher Weg, dies zu tun, ist mit Audio Services:

#import <AudioToolbox/AudioToolbox.h> 
...    
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
fsaint
quelle
3
#import <AudioToolbox / AudioToolbox.h> und Sie müssen das AudioToolbox.framework zu den Build-Phasen Ihres Projekts hinzufügen.
Michael Mangold
31

Ich hatte große Probleme damit bei Geräten, bei denen die Vibration auf irgendeine Weise ausgeschaltet war, aber wir brauchten sie, um unabhängig davon zu funktionieren, da dies für die Funktionsweise unserer Anwendung von entscheidender Bedeutung ist und nur eine Ganzzahl für einen dokumentierten Methodenaufruf ist Validierung. Deshalb habe ich einige Sounds ausprobiert, die außerhalb der gut dokumentierten hier lagen : TUNER88 / iOSSystemSoundsLibrary

Ich bin dann auf 1352 gestoßen, das unabhängig vom lautlosen Schalter oder den Einstellungen am Gerät funktioniert (Settings->vibrate on ring, vibrate on silent).

- (void)vibratePhone;
{
     if([[UIDevice currentDevice].model isEqualToString:@"iPhone"])
     {
         AudioServicesPlaySystemSound (1352); //works ALWAYS as of this post
     }
     else
     {
          // Not an iPhone, so doesn't have vibrate
          // play the less annoying tick noise or one of your own
          AudioServicesPlayAlertSound (1105);
     }
}
Joel Teply
quelle
7
Es ist immer besser, benannte Aliase anstelle von magischen Konstanten wie kSystemSoundID_Vibrate anstelle von 1352 zu verwenden. Ich empfehle Ihnen, Ihre Antwort zu aktualisieren.
Nalexn
3
Ich würde zustimmen, dass die Verwendung dieses magischen 1352 nicht ideal ist, aber ich kann keinen anderen Weg finden, um eine Vibration zu erzwingen, selbst wenn der Vibrationsschalter am Gerät ausgeschaltet ist. Dies scheint der einzige Weg zu sein.
Markshilling
4
Ich schrieb eine for-Schleife mit ganzen Zahlen, die hinter den veröffentlichten Konstanten beginnen, und fand heraus, welche eine Vibration verursachte
Joel Teply
2
Ich kann bestätigen, dass das iPhone vibriert, auch wenn der stille Modus auf dem iPhone aktiviert ist. Gute Antwort!
vomako
2
AudioServicesPlaySystemSound (1352) funktioniert weiterhin für iPhones, unabhängig von der Position des leisen Schalters ab Januar 2016
JustAnotherCoder
26

Wichtiger Hinweis: Warnung vor künftigen Abschreibungen.

Ab iOS 9.0 enthält die API- Funktionsbeschreibung für:

AudioServicesPlaySystemSound(inSystemSoundID: SystemSoundID)
AudioServicesPlayAlertSound(inSystemSoundID: SystemSoundID)

enthält den folgenden Hinweis:

This function will be deprecated in a future release.
Use AudioServicesPlayAlertSoundWithCompletion or  
AudioServicesPlaySystemSoundWithCompletion instead.

Der richtige Weg ist die Verwendung einer der beiden folgenden Methoden:

AudioServicesPlayAlertSoundWithCompletion(kSystemSoundID_Vibrate, nil)

oder

AudioServicesPlayAlertSoundWithCompletion(kSystemSoundID_Vibrate) {
 //your callback code when the vibration is done (it may not vibrate in iPod, but this callback will be always called)
}

erinnere dich an import AVFoundation

Hugo Alonso
quelle
Sie vermissen die Import-Anweisung
Juan Boero
Import AudioToolbox.AudioServices
Hugo Alonso
Ich habe es selbst gemacht, ist nur mit der AVFoundation.
Juan Boero
Wie auch immer, um die Dauer der Vibration einzustellen?
Micro
Sie müssen mehrere Anrufe verketten und zwischen jedem neuen Anruf eine Zeitspanne verwenden
Hugo Alonso,
7

Verwenden Sie für ein iPhone 7/7 Plus oder neuer diese drei haptischen Feedback-APIs.

Verfügbare APIs

Für Benachrichtigungen:

let generator = UINotificationFeedbackGenerator()
generator.notificationOccured(style: .error)

Verfügbare Stile sind .error, .successund .warning. Jeder hat sein eigenes unverwechselbares Gefühl.
Aus den Dokumenten :

Eine konkrete UIFeedbackGeneratorUnterklasse, die Haptik erstellt, um Erfolge, Misserfolge und Warnungen zu kommunizieren.

Für einfache Vibrationen:

let generator = UIImpactFeedbackGenerator(style: .medium)
generator.impactOccured()

Verfügbare Stile sind .heavy, .mediumund .light. Dies sind einfache Schwingungen mit unterschiedlichem Grad an "Härte".
Aus den Dokumenten :

Eine konkrete UIFeedbackGeneratorUnterklasse, die Haptik erstellt, um physische Auswirkungen zu simulieren

Für den Fall, dass der Benutzer ein Element ausgewählt hat

let generator = UISelectionFeedbackGenerator()
generator.selectionChanged()

Dies ist die am wenigsten wahrnehmbare Haptik und daher am besten geeignet, wenn die Haptik die App-Erfahrung nicht übernehmen sollte.
Aus den Dokumenten :

Eine konkrete UIFeedbackGeneratorUnterklasse, die Haptik erstellt, um eine Änderung der Auswahl anzuzeigen.

Anmerkungen

Bei der Verwendung dieser APIs sind einige Dinge zu beachten.

Kein Tee

Sie erstellen die Haptik nicht wirklich. Sie fordern das System auf , eine Haptik zu generieren. Das System entscheidet auf der Grundlage der folgenden Punkte:

  • Wenn auf dem Gerät Haptik möglich ist (ob es in diesem Fall eine Taptic Engine hat)
  • Gibt an, ob die App Audio aufnehmen darf (während der Aufnahme wird keine Haptik erzeugt, um unerwünschte Interferenzen zu vermeiden).
  • Ob die Haptik in den Systemeinstellungen aktiviert ist.

Daher ignoriert das System Ihre Anfrage nach einer Haptik stillschweigend, wenn dies nicht möglich ist. Wenn dies auf ein nicht unterstütztes Gerät zurückzuführen ist, können Sie Folgendes versuchen:

func haptic() {
    // Get whether the device can generate haptics or not
    // If feedbackSupportLevel is nil, will assign 0
    let feedbackSupportLevel = UIDevice.current.value(forKey: "_feedbackSupportLevel") as? Int ?? 0

    switch feedbackSupportLevel { 
    case 2:
        // 2 means the device has a Taptic Engine
        // Put Taptic Engine code here, using the APIs explained above

    case 1: 
    // 1 means no Taptic Engine, but will support AudioToolbox
    // AudioToolbox code from the myriad of other answers!

    default: // 0
        // No haptic support
        // Do something else, like a beeping noise or LED flash instead of haptics
    }

Ersetzen Sie die Kommentare in der switch-case -Anweisungen, und dieser haptische Generierungscode kann auf andere iOS-Geräte übertragen werden. Es wird das höchstmögliche Maß an Haptik erzeugt.

Anmerkung B.

  • Aufgrund der Tatsache, dass das Generieren von Haptik eine Aufgabe auf Hardwareebene ist , kann es zu einer Latenz zwischen dem Aufrufen des Codes zur Haptikgenerierung und dem tatsächlichen Auftreten kommen. Aus diesem Grund verfügen alle Taptic Engine-APIs über eine prepare()Methode, um sie in einen Bereitschaftszustand zu versetzen. Verwenden Ihres Game Over-Beispiels: Möglicherweise wissen Sie, dass das Spiel kurz vor dem Ende steht, wenn der Benutzer sehr niedrige HP hat oder ein gefährliches Monster in der Nähe ist.
  • Wenn Sie innerhalb weniger Sekunden keine Haptik erzeugen, kehrt die Taptic Engine in den Ruhezustand zurück (um die Batterielebensdauer zu verlängern).


In diesem Fall würde die Vorbereitung der Taptic Engine zu einer besseren und reaktionsschnelleren Erfahrung führen.

Angenommen, Ihre App verwendet einen Pan-Gesten-Erkenner, um den sichtbaren Teil der Welt zu ändern. Sie möchten, dass eine Haptik generiert wird, wenn der Benutzer sich um 360 Grad "umschaut". Hier ist, wie Sie verwenden könnten prepare():

@IBAction func userChangedViewablePortionOfWorld(_ gesture: UIPanGestureRecogniser!) {

    haptic = UIImpactFeedbackGenerator(style: .heavy)

    switch gesture.state {
        case .began:
            // The user started dragging the screen.
            haptic.prepare()

        case .changed:
            // The user trying to 'look' in another direction
            // Code to change viewable portion of the virtual world

            if virtualWorldViewpointDegreeMiddle = 360.0 { 
                haptic.impactOccured()
            }
        
        default:
            break

} 
Benj
quelle
Denken Sie daran import UIKit!
Benj
Sie möchten hapticinnerhalb dieser Methode keine neue Instanz erstellen . Sie rufen nicht impactOccureddieselbe Instanz auf, die Sie aufrufen prepare.
rmaddy
5

Und wenn Sie das Xamarin (Monotouch) Framework verwenden, rufen Sie einfach an

SystemSound.Vibrate.PlayAlertSound()
Wheelie
quelle
5

Auf meinen Reisen habe ich festgestellt, dass das Gerät nicht vibriert, wenn Sie während der Audioaufnahme eine der folgenden Methoden ausprobieren, selbst wenn es aktiviert ist.

1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

Meine Methode wurde zu einem bestimmten Zeitpunkt bei der Messung der Gerätebewegungen aufgerufen. Ich musste die Aufnahme stoppen und dann neu starten, nachdem die Vibration aufgetreten war.

Es sah so aus.

-(void)vibrate {
    [recorder stop];
    AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
    [recorder start];
}

recorder ist eine AVRecorder-Instanz.

Ich hoffe, dies hilft anderen, die zuvor das gleiche Problem hatten.

Sebastien Peek
quelle
4

In iOS 10 und auf neueren iPhones können Sie auch die haptische API verwenden. Dieses haptische Feedback ist weicher als die AudioToolbox-API.

Für Ihr GAME OVER-Szenario sollte ein starkes Feedback zu den Auswirkungen auf die Benutzeroberfläche geeignet sein.

UIImpactFeedbackGenerator(style: .heavy).impactOccurred()

Sie können auch die anderen haptischen Feedback-Stile verwenden .

Samwize
quelle
1

In Swift:

import AVFoundation
...
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
Eric
quelle
0

In meinem Fall habe ich die AVCaptureSession verwendet. AudioToolbox befand sich in der Erstellungsphase des Projekts und wurde importiert, funktionierte aber immer noch nicht. Damit es funktioniert, habe ich die Sitzung vor der Vibration abgebrochen und danach fortgesetzt.

#import <AudioToolbox/AudioToolbox.h>
...
@property (nonatomic) AVCaptureSession *session;
...
- (void)vibratePhone;
{
  [self.session stopRunning];
     NSLog(@"vibratePhone %@",@"here");
    if([[UIDevice currentDevice].model isEqualToString:@"iPhone"])
    {
        AudioServicesPlaySystemSound (kSystemSoundID_Vibrate); 
    }
    else
    {
        AudioServicesPlayAlertSound (kSystemSoundID_Vibrate);
    }
  [self.session startRunning];
}
Caner Çakmak
quelle
-5

Sie können verwenden

1) AudioServicesPlayAlertSound (kSystemSoundID_Vibrate);

für iPhone und einige neuere iPods.

2) AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);

für iPads.

Swathy Krishna
quelle
3
iPod touch und iPads können nicht vibrieren.
DDPWNAGE
1
Auf einem Gerät ohne Vibrationsfähigkeit (wie dem iPod Touch) wird dies nichts
bewirken