Bagaimana cara membuat iPhone bergetar menggunakan Swift?

116

Saya perlu membuat iPhone bergetar, tetapi saya tidak tahu cara melakukannya di Swift. Saya tahu bahwa di Objective-C, Anda cukup menulis:

import AudioToolbox
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

Tapi itu tidak berhasil untuk saya.

Nico Gutraich
sumber
Swift memiliki fungsi yang sama untuk Anda: developer.apple.com/library/ios/documentation/AudioToolbox/…
Martijn Courteaux
Di sini Anda akan menemukan semua kode untuk setiap .caf dan kategori terkait: github.com/TUNER88/iOSSystemSoundsLibrary Misalnya jika Anda menginginkan getaran yang lebih ringan, Anda dapat menggunakan kode 1003.
O. Boujaouane

Jawaban:

225

Contoh singkat:

import UIKit
import AudioToolbox

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))            
    }
}

memuat ke ponsel Anda dan itu akan bergetar. Anda dapat memasukkannya ke dalam fungsi atau IBAction sesuai keinginan.

Pembaruan Kode:

 AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) { }

Seperti yang tertulis dalam dokumen kode apel:

Fungsi ini tidak akan digunakan lagi di rilis mendatang. Gunakan AudioServicesPlaySystemSoundWithCompletion sebagai gantinya.

CATATAN: Jika getar tidak berfungsi. periksa getar diaktifkan di pengaturan suara dan haptics

Steve Rosenberg
sumber
1
adakah cara untuk membiarkan ponsel bergetar terus menerus hingga tombol ditekan?
Nicholas
3
Apa yang ditanyakan Nicholas, juga saya bertanya-tanya apakah ada cara untuk membuatnya bergetar dalam beberapa pola khusus.
Nathan McKaskle
1
Saya tahu ada github yang menunjukkan ID Sistem untuk semua file audio iPhone dan 3 file getar, tetapi adakah yang tahu bagaimana saya dapat mengakses file getar LAINNYA? Saya ingin menggunakan getaran Staccato misalnya, tetapi saya tidak tahu ID-nya, atau bahkan jika ada.
jammyman34
1
@Nicholas jika saya menemukan aplikasi yang meminta saya untuk menekan tombol, jika tidak maka akan bergetar selamanya, saya akan segera menghapusnya dari perangkat saya.
pengguna3441734
2
Perlu diingat bahwa perangkat tidak bergetar jika sesi audio aplikasi Anda dikonfigurasi dengan kategori sesi audio AVAudioSessionCategoryPlayAndRecord atau AVAudioSessionCategoryRecord. Ini memastikan bahwa getaran tidak mengganggu perekaman audio.
Fede Henze
70

Di iOS 10 pada iPhone 7 atau 7 Plus, coba:

let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.impactOccurred()
Adam Smaka
sumber
1
kita semua menggunakan iOS 10, bukan? ini adalah versi sistem yang terbaru, terbaik, dan gratis. setiap orang harus memperbarui, tidak ada kompromi untuk memilikinya.
Adam Smaka
13
Di luar iOS 10, ini hanya fitur yang akan berfungsi dengan iPhone 7 atau lebih baru. Ini akan diabaikan pada perangkat yang lebih tua dari iPhone 7.
C6Silver
@ C6 Anda benar. Tidak berfungsi pada iPhone 4s, 5,5s, 5c dan 6. Perangkat ini telah saya uji.
Rocky Balboa
45

Swift 4.2 Diperbarui

Cukup masukkan kode di bawah ini ke dalam proyek Anda.

Pemakaian

Vibration.success.vibrate()

Kode sumber

  enum Vibration {
        case error
        case success
        case warning
        case light
        case medium
        case heavy
        @available(iOS 13.0, *)
        case soft
        @available(iOS 13.0, *)
        case rigid
        case selection
        case oldSchool

        public func vibrate() {
            switch self {
            case .error:
                UINotificationFeedbackGenerator().notificationOccurred(.error)
            case .success:
                UINotificationFeedbackGenerator().notificationOccurred(.success)
            case .warning:
                UINotificationFeedbackGenerator().notificationOccurred(.warning)
            case .light:
                UIImpactFeedbackGenerator(style: .light).impactOccurred()
            case .medium:
                UIImpactFeedbackGenerator(style: .medium).impactOccurred()
            case .heavy:
                UIImpactFeedbackGenerator(style: .heavy).impactOccurred()
            case .soft:
                if #available(iOS 13.0, *) {
                    UIImpactFeedbackGenerator(style: .soft).impactOccurred()
                }
            case .rigid:
                if #available(iOS 13.0, *) {
                    UIImpactFeedbackGenerator(style: .rigid).impactOccurred()
                }
            case .selection:
                UISelectionFeedbackGenerator().selectionChanged()
            case .oldSchool:
                AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
            }
        }
    }
muhasturk.dll
sumber
4
Jangan lupa untuk menambahkan 'impor AVFoundation' untuk menggunakan getaran .oldSchool :)
atereshkov
Kecuali .oldSchool sisa kasus tidak berfungsi Saya menguji di iPhone 6 perangkat fisik ada bantuan?
Sai kumar Reddy
Anda harus menjelaskan bahwa FeedbackGenerator haptic dan disertakan dengan iPhone 7. Anda juga hanya dapat memiliki satu baris untuk setiap kasus: UIImpactFeedbackGenerator (style: .heavy) .impactOccurred ()
Medhi
22

Untuk iOS 10.0+ Anda dapat mencoba UIFeedbackGenerator

ViewController sederhana di atas, cukup ganti pengontrol tampilan Anda dalam pengujian "aplikasi tampilan tunggal"

import UIKit

class ViewController: UIViewController {

    var i = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        let btn = UIButton()
        self.view.addSubview(btn)
        btn.translatesAutoresizingMaskIntoConstraints = false

        btn.widthAnchor.constraint(equalToConstant: 160).isActive = true
        btn.heightAnchor.constraint(equalToConstant: 160).isActive = true
        btn.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        btn.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

        btn.setTitle("Tap me!", for: .normal)
        btn.setTitleColor(UIColor.red, for: .normal)
        btn.addTarget(self, action: #selector(tapped), for: .touchUpInside)
    }

    @objc func tapped() {
        i += 1
        print("Running \(i)")

        switch i {
        case 1:
            let generator = UINotificationFeedbackGenerator()
            generator.notificationOccurred(.error)

        case 2:
            let generator = UINotificationFeedbackGenerator()
            generator.notificationOccurred(.success)

        case 3:
            let generator = UINotificationFeedbackGenerator()
            generator.notificationOccurred(.warning)

        case 4:
            let generator = UIImpactFeedbackGenerator(style: .light)
            generator.impactOccurred()
        case 5:
            let generator = UIImpactFeedbackGenerator(style: .medium)
            generator.impactOccurred()

        case 6:
            let generator = UIImpactFeedbackGenerator(style: .heavy)
            generator.impactOccurred()

        default:
            let generator = UISelectionFeedbackGenerator()
            generator.selectionChanged()
            i = 0
        }
    }
}
Malder
sumber
18

Kami dapat melakukan ini di Xcode7.1

import UIKit
import AudioToolbox


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
    }
}
ken0nek
sumber
12

Swift 4.2, 5.0

 if #available(iOS 10.0, *) {
      UIImpactFeedbackGenerator(style: .light).impactOccurred()
   } 

Anda juga dapat memilih gaya lain seperti

    style: .heavy
    style: .medium

    //Note: soft and rigid available in only iOS 13.0
    style: .soft
    style: .rigid
Rashid Latif
sumber
4

Anda dapat menggetarkan telepon menggunakan AudioServicesatau Haptic Feedback.

// AudioServices
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

// Haptic Feedback
UIImpactFeedbackGenerator(style: .medium).impactOccurred()

Lihat kerangka kerja sumber terbuka saya Haptica , ini mendukung keduanya Haptic Feedback, AudioServicesdan pola getaran unik. Berfungsi pada Swift 4.2, Xcode 10

efremidze
sumber
3
import AudioToolbox

extension UIDevice {
    static func vibrate() {
        AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
    }
}

Sekarang Anda bisa menelepon UIDevice.vibrate()sesuai kebutuhan.

Mohammad Razipour
sumber
2

UINotificationFeedbackGenerator tersedia dari iOS 10 dan berfungsi dengan Haptic v2, kita dapat memeriksanya:

  let feedbackSupportLevel = UIDevice.current.value(forKey: "_feedbackSupportLevel") as? Int
        if #available(iOS 10.0, *), let feedbackSupportLevel = feedbackSupportLevel, feedbackSupportLevel > 1 {
            do { // 1
                let generator = UIImpactFeedbackGenerator(style: .medium)
                generator.impactOccurred()
            }

            do { // or 2
                let generator = UINotificationFeedbackGenerator()
                generator.notificationOccurred(.success)
            }
        } else {
            AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
        }
Sergei Lysiuk
sumber