İPhone'u titreştirmek


228

İPhone bir kez titreyecek şekilde nasıl ayarlanabilir?

Örneğin, bir oyuncu hayatını kaybettiğinde veya oyun sona erdiğinde, iPhone titreşmelidir.


9
Titreşim hareketi titreşimden tamamen farklıdır. Biri insan tarafından başlatıldı, bir cihaz tarafından başlatıldı.
Eiko

Yanıtlar:


404

" İ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>

3
#import <Kakao / Kakao.h> gerekli değildir.
Raptor

10
Titreşim süresini 1 saniyenin altına düşürmenin bir yolu var mı?
George Asda

11
İOS ayarlarında titreşim kapalıysa, bu komutları kullansanız bile kullanıcının titreşim almayacağını eklemek isterim.
Denis Kutlubaev

7
Swift'te: AudioServicesPlayAlertSound(UInt32(kSystemSoundID_Vibrate))(en azından beta 2'den itibaren)
Sam Soffes

1
AudioServicesPlayAlertSound (kSystemSoundID_Vibrate); İPhone'da titreşir ama iPad'de bip sesi çıkarmaz.
Mangesh

45

Swift 2.0 ve üzeri

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)

Orijinal Yanıt (Swift 1.x)

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.


Bu Swift 2 / iOS 9 / Xcode 7'de düzeltilmiş gibi görünüyor. Kullandım AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)ve iyi derledim
Dov

35

Bunu yapmanın basit bir yolu Ses Servisleri'dir:

#import <AudioToolbox/AudioToolbox.h> 
...    
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

3
#import <AudioToolbox / AudioToolbox.h> ve projenizin Oluşturma Aşamalarına AudioToolbox.framework eklemeniz gerekir.
Michael Mangold

31

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

7
1352 yerine kSystemSoundID_Vibrate gibi sihirli sabitler yerine adlandırılmış takma adlar kullanmak her zaman daha iyidir. Yanıtınızı güncellemenizi öneririm.
nalexn

3
Bu sihri 1352'yi kullanmak ideal değildir, ancak titreşim anahtarı cihazda kapalı olsa bile bir titreşimi zorlamanın başka bir yolunu bulamıyorum. Bu tek yol gibi görünüyor.
marcshilling

4
Yayınlanmış sabitleri geçerek tamsayılarla bir döngü yazdım ve hangisinin titreşime neden olduğunu anladım
Joel Teply

2
İPhone'da sessiz mod etkinleştirilmiş olsa bile iPhone'un titreştiğini doğrulayabilirim. Mükemmel cevap!
vomako

2
AudioServicesPlaySystemSound (1352), Ocak 2016'dan itibaren sessiz anahtar konumundan bağımsız olarak iPhone'lar için hala çalışıyor
JustAnotherCoder

26

Ö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


ithalat beyanını kaçırıyorsunuz
Juan Boero

import AudioToolbox.AudioServices
Hugo Alonso

kendim yaptım, sadece AVFoundation ile.
Juan Boero

Yine de titreşim süresini ayarlamak için?
Micro

Birkaç çağrıyı birleştirmeniz, her yeni çağrı arasında bir zaman aşımı kullanmanız gerekecek
Hugo Alonso

7

İPhone 7/7 Plus veya daha yenisi için bu üç Dokunsal geribildirim API'sını kullanın.

Kullanılabilir API'lar

Bildirimler için:

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.

Basit titreşimler için:

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

Kullanıcı bir öğe seçtiğinde

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.

notlar

Bu API'ları kullanırken hatırlanması gereken birkaç şey var.

Çay yok

Aslında haptik oluşturmazsınız. Sen sistem isteğinde bir dokunsal üretir. Sistem aşağıdakilere göre karar verecektir:

  • Cihazda haptikler mümkünse (bu durumda bir Taptik Motoru olup olmadığı)
  • Uygulamanın ses kaydedip kaydedemeyeceği (istenmeyen parazitleri önlemek için kayıt sırasında haptikler oluşturulmaz)
  • Haptiklerin sistem Ayarlarında etkin olup olmadığı.

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.

Not B

  • Haptik üretmenin donanım düzeyinde bir görev olması nedeniyle , haptik üretme kodunu çağırmakla gerçekte ne zaman gerçekleşeceği arasında gecikme olabilir . Bu nedenle, Taptic Engine API'lerinin hepsinin 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.
  • Birkaç saniye içinde bir haptik üretmezseniz, Taptic Engine tekrar bekleme moduna geçer (pil ömründen tasarruf etmek için)


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

} 

Unutmayın import UIKit!
Benj

hapticBu yöntemin içinde yeni bir örnek oluşturmak istemezsiniz . Aradığınız impactOccuredaynı örneği çağırmıyorsunuz prepare.
rmaddy

5

Ve Xamarin (monotouch) çerçevesini kullanıyorsanız,

SystemSound.Vibrate.PlayAlertSound()

5

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.


4

İ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 .


1

Swift'te:

import AVFoundation
...
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))

0

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

-5

Kullanabilirsiniz

1) AudioServicesPlayAlertSound (kSystemSoundID_Vibrate);

iPhone ve daha yeni iPod'lar için.

2) AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);

iPad'ler için.


3
iPod touch'lar ve iPad'ler titreşemez.
DDPWNAGE

1
Titreşim özelliği olmayan (iPod Touch gibi) bir cihazda bu hiçbir şey yapmaz
Lal Krishna
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.