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

Apple 코드 문서가 다음과 같이 작성했습니다.

이 기능은 향후 릴리스에서 더 이상 사용되지 않습니다. 대신 AudioServicesPlaySystemSoundWithCompletion을 사용하세요.

참고 : 진동이 작동하지 않는 경우. 소리 및 햅틱 설정에서 진동이 활성화되어 있는지 확인


1
버튼을 누를 때까지 휴대폰이 계속 진동하도록하는 방법이 있습니까?
Nicholas

3
Nicholas가 물은 것은 또한 특별한 패턴으로 진동하도록하는 방법이 있는지 궁금합니다.
Nathan McKaskle 2015 년

1
모든 iPhone 오디오 파일과 3 개의 진동 파일에 대한 시스템 ID를 표시하는 github가 있다는 것을 알고 있지만 다른 진동 파일에 액세스 할 수있는 방법을 아는 사람이 있습니까? 예를 들어 Staccato 진동을 사용하고 싶지만 ID를 알아낼 수 없거나 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을 사용하지 않습니까? 시스템의 최신, 최고의 무료 버전입니다. 모든 사람이 업데이트해야합니다.
아담 Smaka

13
iOS 10 이후, 이것은 iPhone 7 이상에서 작동하는 기능 일뿐입니다. 그것은 아이폰 (7)보다 오래된 장치에서 무시됩니다
C6Silver

@ C6Silver 당신은 사실입니다. iPhone 4s, 5,5s, 5c 및 6에서 작동하지 않습니다. 이러한 장치는 테스트했습니다.
Rocky Balboa


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 진동 : 사용하기 위해 '수입 AVFoundation'을 추가하는 것을 잊지 마세요
atereshkov

.oldSchool 나머지 케이스가 작동하지 않는 것을 제외하고 iPhone 6 물리적 장치에서 테스트했습니다.
Sai kumar Reddy

FeedbackGenerator가 햅틱이고 iPhone 7과 함께 제공된다는 점을 설명해야합니다. 각 경우에 한 줄만 사용할 수 있습니다. UIImpactFeedbackGenerator (style : .heavy) .impactOccurred ()
Medhi

22

들어 아이폰 OS 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 Feedback, AudioServices그리고 고유 한 진동 패턴을 모두 지원합니다 . Swift 4.2, Xcode 10에서 작동


3
import AudioToolbox

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

이제 UIDevice.vibrate()필요에 따라 전화 를 걸 수 있습니다 .


2

UINotificationFeedbackGenerator는 iOS 10에서 사용할 수 있으며 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.