如何使用Swift使iPhone振动?


116

我需要使iPhone震动,但是我不知道如何在Swift中做到这一点。我知道在Objective-C中,您只需编写:

import AudioToolbox
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

但这对我不起作用。



在这里,你会发现每一个和的.caf相关类别中的所有代码:github.com/TUNER88/iOSSystemSoundsLibrary例如,如果你想有一个更轻的振动,你可以使用代码1003
O. Boujaouane

Answers:


225

简短示例:

import UIKit
import AudioToolbox

class ViewController: UIViewController {

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

加载到手机上,它将振动。您可以根据需要将其放在函数或IBAction中。

代码更新:

 AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) { }

正如苹果代码文档所写:

在将来的版本中将不推荐使用此功能。请改用AudioServicesPlaySystemSoundWithCompletion。

注意:如果振动不起作用。在声音和触觉设置中检查振动是否启用


1
有没有办法让手机连续振动直到按下按钮?
尼古拉斯

3
尼古拉斯问,我也想知道是否有办法使它以某种特殊的模式振动。
弥敦道(Nathan McKaskle),2015年

1
我知道有一个github显示所有iPhone音频文件和3个振动文件的系统ID,但是有人知道我如何访问其他振动文件吗?例如,我想使用Staccato振动,但是我无法弄清ID,即使有ID也无法。
jammyman34 '16

1
@Nicholas,如果我发现一个要求我按下按钮的应用程序,否则它将永远振动,我将立即从设备中将其删除。
user3441734

2
请记住,如果您的应用的音频会话配置了AVAudioSessionCategoryPlayAndRecord或AVAudioSessionCategoryRecord音频会话类别,则设备不会振动。这样可以确保振动不会干扰音频录制。
Fede Henze '18 -10-30

70

在iPhone 7或7 Plus的iOS 10中,尝试:

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

1
我们都使用iOS 10,不是吗?它是系统的最新,最佳和免费版本。每个人都应该更新,拥有它不会妥协。
亚当·斯马卡

13
在iOS 10以外的版本中,此功能仅适用于iPhone 7或更高版本。在iPhone 7之前的设备上它将被忽略
。– C6Silver

@ C6Silver你是对的。它不适用于iPhone 4s,5、5s,5c和6。这些设备我已经测试过。
洛基·巴尔波亚


45

Swift 4.2更新

只需将下面的代码插入您的项目即可。

用法

Vibration.success.vibrate()

源代码

  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
不要忘记添加'import AVFoundation'以便使用.oldSchool振动:)
atereshkov 18-10-2

除了.oldSchool其余情况无法正常工作之外,我在iPhone 6物理设备上测试过任何帮助吗?
西库玛·雷迪

您应该解释说FeedbackGenerator是触觉的,它是iPhone 7附带的。每种情况下您也只能使用一行:UIImpactFeedbackGenerator(style:.heavy).impactOccurred()
Medhi

22

对于iOS 10.0+,您可以尝试UIFeedbackGenerator

上面的简单viewController,只需在测试“单视图应用”中替换您的视图控制器

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

我们可以在Xcode7.1中做到这一点

import UIKit
import AudioToolbox


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
    }
}

12

斯威夫特4.2,5.0

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

您还可以选择其他样式,例如

    style: .heavy
    style: .medium

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

4

您可以使用AudioServices或振动手机Haptic Feedback

// AudioServices
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

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

结帐我的开源框架Haptica,它同时支持Haptic FeedbackAudioServices以及独特的振动模式。适用于Swift 4.2,Xcode 10



2

可从iOS 10获得并与Haptic v2一起使用的UINotificationFeedbackGenerator,我们可以检查一下:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.