Làm thế nào để làm cho iPhone rung bằng Swift?


116

Tôi cần làm cho iPhone rung, nhưng tôi không biết làm thế nào để làm điều đó trong Swift. Tôi biết rằng trong Objective-C, bạn chỉ cần viết:

import AudioToolbox
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

Nhưng điều đó không hiệu quả với tôi.


Swift có chức năng tương tự có sẵn cho bạn: developer.apple.com/library/ios/documentation/AudioToolbox/...
Martijn Courteaux

Ở đây bạn sẽ tìm thấy tất cả các mã cho mỗi .caf và loại liên quan: github.com/TUNER88/iOSSystemSoundsLibrary Ví dụ, nếu bạn muốn có một rung động nhẹ hơn bạn có thể sử dụng mã 1003.
O. Boujaouane

Câu trả lời:


225

Ví dụ ngắn gọn:

import UIKit
import AudioToolbox

class ViewController: UIViewController {

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

tải vào điện thoại của bạn và nó sẽ rung. Bạn có thể đặt nó trong một hàm hoặc IBAction tùy thích.

Cập nhật mã:

 AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) { }

Như tài liệu mã apple đã viết:

Chức năng này sẽ không được dùng nữa trong một bản phát hành trong tương lai. Thay vào đó, hãy sử dụng AudioServicesPlaySystemSoundWithCompletion.

LƯU Ý: Nếu chế độ rung không hoạt động. kiểm tra rung được bật trong cài đặt âm thanh và xúc giác


1
Có cách nào để điện thoại rung liên tục cho đến khi nhấn một nút không?
Nicholas

3
Nicholas hỏi gì, tôi cũng đang tự hỏi liệu có cách nào khiến nó rung lên theo một kiểu đặc biệt nào đó không.
Nathan McKaskle

1
Tôi biết có một github hiển thị ID hệ thống cho tất cả các tệp âm thanh iPhone và 3 tệp rung, nhưng có ai biết cách tôi có thể truy cập các tệp rung KHÁC không? Ví dụ, tôi muốn sử dụng chế độ rung Staccato, nhưng tôi không thể tìm ra ID hoặc thậm chí nếu có.
jammyman34

1
@Nicholas nếu tôi tìm thấy một ứng dụng yêu cầu tôi nhấn một nút, nếu không nó sẽ rung mãi mãi, tôi sẽ xóa nó khỏi thiết bị của mình ngay lập tức.
user3441734

2
Hãy nhớ rằng thiết bị không rung nếu phiên âm thanh của ứng dụng được định cấu hình với danh mục phiên âm thanh AVAudioSessionCategoryPlayAndRecord hoặc AVAudioSessionCategoryRecord. Điều này đảm bảo rằng rung không cản trở việc ghi âm.
Fede Henze,

70

Trong iOS 10 trên iPhone 7 hoặc 7 Plus, hãy thử:

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

1
tất cả chúng ta đều sử dụng iOS 10, phải không? đó là phiên bản mới nhất, tốt nhất và miễn phí của hệ thống. mọi người nên cập nhật, không có thỏa hiệp khi có nó.
Adam Smaka

13
Ngoài iOS 10, đây chỉ là một tính năng sẽ hoạt động với iPhone 7 trở lên. Nó sẽ bị bỏ qua trên các thiết bị cũ hơn iPhone 7.
C6Silver

@ C6Silver Bạn nói đúng. Nó không hoạt động trên iPhone 4s, 5,5s, 5c và 6. Những thiết bị này tôi đã thử nghiệm.
Rocky Balboa


45

Swift 4.2 được cập nhật

Chỉ cần chèn mã bên dưới vào dự án của bạn.

Sử dụng

Vibration.success.vibrate()

Mã nguồn

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

4
Đừng quên thêm 'nhập khẩu AVFoundation' để sử dụng .oldSchool rung :)
atereshkov

Ngoại trừ trường hợp còn lại .oldSchool không hoạt động Tôi đã test trên thiết bị vật lý iPhone 6 có giúp được gì không?
Sai kumar Reddy

Bạn nên giải thích rằng FeedbackGenerator rất khó hiểu và nó đi kèm với iPhone 7. Bạn cũng có thể chỉ có một dòng cho mỗi trường hợp: UIImpactFeedbackGenerator (style: .heavy) .impactOccurred ()
Medhi

22

Đối với iOS 10.0+, bạn có thể dùng thử UIFeedbackGenerator

ViewController đơn giản ở trên, chỉ cần thay thế bộ điều khiển chế độ xem của bạn trong "ứng dụng xem một lần" thử nghiệm của bạn

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

18

Chúng tôi có thể làm điều này trong Xcode7.1

import UIKit
import AudioToolbox


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
    }
}

12

Swift 4.2, 5.0

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

Bạn cũng có thể chọn các kiểu khác như

    style: .heavy
    style: .medium

    //Note: soft and rigid available in only iOS 13.0
    style: .soft
    style: .rigid

4

Bạn có thể rung điện thoại bằng AudioServiceshoặc Haptic Feedback.

// AudioServices
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

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

Thanh toán framework mã nguồn mở của tôi Haptica , nó hỗ trợ cả hai Haptic Feedback, AudioServicesvà rung động độc đáo mẫu. Hoạt động trên Swift 4.2, Xcode 10


3
import AudioToolbox

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

Bây giờ bạn chỉ có thể gọi UIDevice.vibrate()khi cần thiết.


2

UINotificationFeedbackGenerator có sẵn từ iOS 10 và hoạt động với Haptic v2, chúng tôi có thể kiểm tra điều này:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.