Swiftを使用してiPhoneを振動させる方法は?


116

iPhoneを振動させる必要がありますが、Swiftでそれを行う方法がわかりません。Objective-Cでは、次のように書くだけです。

import AudioToolbox
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

しかし、それは私にはうまくいきません。


:スウィフトはあなたのために利用できる同じ機能を持っていdeveloper.apple.com/library/ios/documentation/AudioToolbox/...
マルタインCourteaux

ここでは、各.cafと関連するカテゴリのすべてのコードを見つけます:github.com/TUNER88/iOSSystemSoundsLibraryをたとえば、あなたが軽い振動は、コード1003を使用することができますしたい場合
O. Boujaouane

回答:


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

1
すべてのiPhoneオーディオファイルと3つのバイブレーションファイルのシステムIDを表示するgithubがあることは知っていますが、他のバイブレーションファイルにアクセスする方法を誰かが知っていますか?たとえば、スタッカートバイブレーションを使用したいのですが、IDがわかりません。
jammyman34

1
@Nicholasボタンを押すように要求するアプリケーションを見つけた場合、それ以外の場合は永久に振動します。デバイスからそれをすぐに削除します。
user3441734

2
アプリのオーディオセッションがAVAudioSessionCategoryPlayAndRecordまたはAVAudioSessionCategoryRecordオーディオセッションカテゴリで構成されている場合、デバイスは振動しないことに注意してください。これにより、振動がオーディオ録音に干渉しないことが保証されます。
Fede Henze 2018年

70

iPhone 7または7 PlusのiOS 10では、次のことを試してください。

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

1
私たちはみんなiOS 10を使っていますね。これは、システムの最新かつ最高の無料バージョンです。誰もが更新する必要があります。更新することで妥協はありません。
Adam Smaka 2016

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
.oldSchoolバイブレーションを使用するために 'import AVFoundation'を追加することを忘れないでください:)
atereshkov

.oldSchoolの残りのケースが機能しないことを除いて、iPhone 6の物理デバイスでテストした場合、何か助けはありますか?
Sai kumar Reddy

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

Swift 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で動作します


3
import AudioToolbox

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

これでUIDevice.vibrate()、必要に応じて呼び出すことができます。


2

iOS 10から利用できるUINotificationFeedbackGeneratorはHaptic v2で動作します。これを確認できます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.