Yanıtlar:
" İPhone Eğitimi: iOS cihazlarının özelliklerini kontrol etmenin daha iyi yolu ":
Bir parametre alan benzer görünen iki işlev vardır kSystemSoundID_Vibrate:
1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
Her iki işlev de iPhone'u titreştirir. Ancak, ilk işlevi titreşimi desteklemeyen cihazlarda kullandığınızda bir bip sesi çıkarır. İkinci işlev ise, desteklenmeyen cihazlarda hiçbir şey yapmaz. Bu nedenle, cihazı sürekli olarak titreştirecekseniz, bir uyarı olarak, sağduyu diyor ki, işlev 2'yi kullanın.
İlk olarak, AudioToolbox.frameworkDerleme Aşamalarındaki AudioToolbox çerçevesini hedefinize ekleyin .
Ardından, bu başlık dosyasını içe aktarın:
#import <AudioToolbox/AudioServices.h>
AudioServicesPlayAlertSound(UInt32(kSystemSoundID_Vibrate))(en azından beta 2'den itibaren)
AudioToolbox şimdi kSystemSoundID_Vibratebir SystemSoundIDtür olarak sunar , bu nedenle kod:
import AudioToolbox.AudioServices
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
Ekstra döküm adımından geçmek zorunda kalmak yerine
(@Dov'da sahne)
Ve Swift'te bunu nasıl yapıyorsun (benim yaptığımla aynı sorunla karşılaşırsan)
Karşı bağlantı AudioToolbox.framework(Projenize gidin, hedefinizi seçin, aşamalar oluşturun, İkili Kütüphanelere Bağlayın, kütüphaneyi oraya ekleyin)
Bu tamamlandığında:
import AudioToolbox.AudioServices
// Use either of these
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
Sevimsiz şey, SystemSoundIDtemelde bir typealias(fantezi hızlı typedef) bir UInt32ve kSystemSoundID_Vibratedüzenli bir olmasıdır Int. Derleyici gelen döküm çalıştıkları için size bir hata veriyor Intiçin UInt32, ama kafa karıştırıcı, "SystemSoundID dönüştüremiyorum" gibi hata okur. Neden elma onu Swift numaralandırması yapmıyordu.
@ aponomarenko detaylara giriyor, cevabım sadece orada Swifters için.
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)ve iyi derledim
Bunu yapmanın basit bir yolu Ses Servisleri'dir:
#import <AudioToolbox/AudioToolbox.h>
...
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
Titreşimi bir şekilde kapatan cihazlar için bu konuda büyük bir sorun yaşadım, ancak uygulamanın çalışması için kritik olduğu için çalışmamız gerekiyordu ve belgelenmiş bir yöntem çağrısı için bir tamsayı olduğu için, geçecek doğrulama. Bu yüzden burada iyi belgelenmiş seslerin dışında kalan bazı sesleri denedim: TUNER88 / iOSSystemSoundsLibrary
Daha sonra sessiz anahtardan veya cihazdaki ayarlardan bağımsız olarak çalışan 1352'yi tökezledim (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);
}
}
Önemli Not: Gelecekte Kullanım Dışı Bırakma Uyarısı.
İtibariyle iOS 9.0 , API fonksiyonları açıklaması için:
AudioServicesPlaySystemSound(inSystemSoundID: SystemSoundID)
AudioServicesPlayAlertSound(inSystemSoundID: SystemSoundID)
aşağıdaki notu içerir:
This function will be deprecated in a future release.
Use AudioServicesPlayAlertSoundWithCompletion or
AudioServicesPlaySystemSoundWithCompletion instead.
Doğru yol şu ikisinden birini kullanmak olacaktır:
AudioServicesPlayAlertSoundWithCompletion(kSystemSoundID_Vibrate, nil)
veya
AudioServicesPlayAlertSoundWithCompletion(kSystemSoundID_Vibrate) {
//your callback code when the vibration is done (it may not vibrate in iPod, but this callback will be always called)
}
Hatırla
import AVFoundation
İPhone 7/7 Plus veya daha yenisi için bu üç Dokunsal geribildirim API'sını kullanın.
let generator = UINotificationFeedbackGenerator()
generator.notificationOccured(style: .error)
Mevcut stilleri .error, .successve .warning. Her birinin kendine özgü bir hissi vardır.
Gönderen docs :
UIFeedbackGeneratorBaşarıları, başarısızlıkları ve uyarıları iletmek için haptikler oluşturan somut bir alt sınıf.
let generator = UIImpactFeedbackGenerator(style: .medium)
generator.impactOccured()
Mevcut stilleri .heavy, .mediumve .light. Bunlar değişen derecelerde "sertlik" ile basit titreşimlerdir.
Gönderen docs :
UIFeedbackGeneratorFiziksel etkileri simüle etmek için haptikler oluşturan somut bir alt sınıf
let generator = UISelectionFeedbackGenerator()
generator.selectionChanged()
Bu, tüm haptiklerin en az fark edilir olanıdır ve bu yüzden haptiklerin uygulama deneyimini devralmaması gerektiğinde en uygun olanıdır.
Gönderen docs :
UIFeedbackGeneratorSeçimdeki değişikliği göstermek için haptikler oluşturan somut bir alt sınıf.
Bu API'ları kullanırken hatırlanması gereken birkaç şey var.
Aslında haptik oluşturmazsınız. Sen sistem isteğinde bir dokunsal üretir. Sistem aşağıdakilere göre karar verecektir:
Bu nedenle, sistem mümkün değilse bir haptik isteğinizi sessizce göz ardı edecektir. Bu desteklenmeyen bir cihazdan kaynaklanıyorsa şunu deneyebilirsiniz:
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
}
switch- caseifadelerindeki yorumları değiştirin, bu dokunsal nesil kodu diğer iOS cihazlarına taşınabilir. Mümkün olan en yüksek seviyede haptik üretecektir.
prepare()hazır olma durumuna getirmek için bir yöntemi vardır. Game Over örneğinizi kullanma: Çok düşük HP'ye sahip kullanıcı veya yanlarında tehlikeli bir canavar tarafından oyunun bitmek üzere olduğunu biliyor olabilirsiniz.
Bu durumda, Taptic Engine'i hazırlamak daha kaliteli, daha duyarlı bir deneyim yaratacaktır.
Örneğin, uygulamanızın dünyanın görünür kısmını değiştirmek için bir kaydırma hareketi tanıyıcı kullandığını varsayalım. Kullanıcı 360 derece 'baktığında' bir haptik oluşturmak istiyorsunuz. Nasıl kullanabileceğiniz aşağıda açıklanmıştır 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!
hapticBu yöntemin içinde yeni bir örnek oluşturmak istemezsiniz . Aradığınız impactOccuredaynı örneği çağırmıyorsunuz prepare.
Seyahatlerimde ses kaydederken aşağıdakilerden birini denerseniz cihazın etkinleştirilmiş olsa bile titreşmeyeceğini gördüm.
1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
Metodum cihaz hareketlerinin ölçümünde belirli bir zamanda çağrıldı. Titreşim gerçekleştikten sonra kaydı durdurmak ve yeniden başlatmak zorunda kaldım.
Öyle görünüyordu.
-(void)vibrate {
[recorder stop];
AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
[recorder start];
}
recorder bir AVRecorder örneğidir.
Umarım bu daha önce aynı problemi yaşayanlara yardımcı olur.
İOS 10'da ve daha yeni iPhone'larda dokunsal API'yı da kullanabilirsiniz. Bu dokunsal geri bildirim AudioToolbox API'sından daha yumuşaktır.
GAME OVER senaryosunuz için ağır bir kullanıcı arayüzü etki geri bildirimi uygun olmalıdır.
UIImpactFeedbackGenerator(style: .heavy).impactOccurred()
Sen kullanabilirsiniz diğer dokunsal geribildirim stilleri .
Benim durumumda AVCaptureSession kullanıyordum. AudioToolbox projenin derleme aşamalarındaydı ve içe aktarıldı ancak hala çalışmadı. Çalışması için titreşimden önce oturumu durdurdum ve bundan sonra da devam ettim.
#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];
}
Kullanabilirsiniz
1) AudioServicesPlayAlertSound (kSystemSoundID_Vibrate);
iPhone ve daha yeni iPod'lar için.
2) AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
iPad'ler için.