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.
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.
Antworten:
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.framework
in Build-Phasen zu Ihrem Ziel hinzu.
Importieren Sie dann diese Header-Datei:
#import <AudioToolbox/AudioServices.h>
AudioServicesPlayAlertSound(UInt32(kSystemSoundID_Vibrate))
(mindestens ab Beta 2)
AudioToolbox präsentiert das jetzt kSystemSoundID_Vibrate
als SystemSoundID
Typ, 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)
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 SystemSoundID
im Grunde ein typealias
(schickes schnelles typedef
) für einUInt32
, und das kSystemSoundID_Vibrate
ist ein reguläres Int
. Der Compiler gibt Ihnen einen Fehler beim Versuch, von Int
zu UInt32
konvertieren, 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.
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
und es wurde gut kompiliert
Ein einfacher Weg, dies zu tun, ist mit Audio Services:
#import <AudioToolbox/AudioToolbox.h>
...
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
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);
}
}
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
Verwenden Sie für ein iPhone 7/7 Plus oder neuer diese drei haptischen Feedback-APIs.
let generator = UINotificationFeedbackGenerator()
generator.notificationOccured(style: .error)
Verfügbare Stile sind .error
, .success
und .warning
. Jeder hat sein eigenes unverwechselbares Gefühl.
Aus den Dokumenten :
Eine konkrete
UIFeedbackGenerator
Unterklasse, die Haptik erstellt, um Erfolge, Misserfolge und Warnungen zu kommunizieren.
let generator = UIImpactFeedbackGenerator(style: .medium)
generator.impactOccured()
Verfügbare Stile sind .heavy
, .medium
und .light
. Dies sind einfache Schwingungen mit unterschiedlichem Grad an "Härte".
Aus den Dokumenten :
Eine konkrete
UIFeedbackGenerator
Unterklasse, die Haptik erstellt, um physische Auswirkungen zu simulieren
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
UIFeedbackGenerator
Unterklasse, die Haptik erstellt, um eine Änderung der Auswahl anzuzeigen.
Bei der Verwendung dieser APIs sind einige Dinge zu beachten.
Sie erstellen die Haptik nicht wirklich. Sie fordern das System auf , eine Haptik zu generieren. Das System entscheidet auf der Grundlage der folgenden Punkte:
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.
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.
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
}
import UIKit
!
haptic
innerhalb dieser Methode keine neue Instanz erstellen . Sie rufen nicht impactOccured
dieselbe Instanz auf, die Sie aufrufen prepare
.
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.
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 .
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];
}
Sie können verwenden
1) AudioServicesPlayAlertSound (kSystemSoundID_Vibrate);
für iPhone und einige neuere iPods.
2) AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
für iPads.