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.framework
Derleme 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_Vibrate
bir SystemSoundID
tü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, SystemSoundID
temelde bir typealias
(fantezi hızlı typedef
) bir UInt32
ve kSystemSoundID_Vibrate
düzenli bir olmasıdır Int
. Derleyici gelen döküm çalıştıkları için size bir hata veriyor Int
iç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
, .success
ve .warning
. Her birinin kendine özgü bir hissi vardır.
Gönderen docs :
UIFeedbackGenerator
Baş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
, .medium
ve .light
. Bunlar değişen derecelerde "sertlik" ile basit titreşimlerdir.
Gönderen docs :
UIFeedbackGenerator
Fiziksel 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 :
UIFeedbackGenerator
Seç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
- case
ifadelerindeki 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
!
haptic
Bu yöntemin içinde yeni bir örnek oluşturmak istemezsiniz . Aradığınız impactOccured
aynı ö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.