Як змусити iPhone вібрувати за допомогою Swift?


116

Мені потрібно змусити iPhone вібрувати, але я не знаю, як це зробити у Swift. Я знаю, що в Objective-C ви просто пишете:

import AudioToolbox
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

Але це для мене не працює.


Swift має таку ж функцію, яка доступна для вас: developer.apple.com/library/ios/documentation/AudioToolbox/…
Martijn Courteaux,

Тут ви знайдете всі коди для кожного .caf та пов’язаної категорії: github.com/TUNER88/iOSSystemSoundsLibrary Наприклад, якщо вам потрібна легша вібрація, ви можете використовувати код 1003.
О. Boujaouane

Відповіді:


225

Короткий приклад:

import UIKit
import AudioToolbox

class ViewController: UIViewController {

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

завантажте на ваш телефон, і він буде вібрувати. Ви можете розмістити його у функції або IBAction за вашим бажанням.

Оновлення коду:

 AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) { }

Як написано в документах яблучного коду:

Ця функція буде застарілою у майбутньому випуску. Використовуйте замість AudioServicesPlaySystemSoundWithCompletion.

ПРИМІТКА. Якщо вібрація не працює. функція check vibrate включена в налаштуваннях звуку та хаптика


1
чи є спосіб дозволити телефону постійно вібрувати, поки не натиснеться кнопка?
Микола

3
Що Микола запитав, і мені було цікаво, чи є спосіб зробити так, щоб це вібрувало за якимсь особливим малюнком.
Натан Маккаскле

1
Я знаю, що існує github, який показує ідентифікатори системи для всіх аудіофайлів iPhone та 3 файлів вібрації, але хтось знає, як я можу отримати доступ до ІНШИХ файлів вібрації? Наприклад, я хочу використовувати вібрацію Staccato, але я не можу з'ясувати ідентифікатор, або навіть якщо він є.
jammyman34

1
@Nicholas, якщо я знайшов програму, яка просить мене натиснути кнопку, інакше вона вібруватиме назавжди, я збираюся негайно її видалити зі свого пристрою.
користувач3441734

2
Майте на увазі, що пристрій не вібрує, якщо аудіо-сеанс вашого додатка налаштовано з категорією аудіо сеансу AVAudioSessionCategoryPlayAndRecord або AVAudioSessionCategoryRecord. Це гарантує, що вібрація не заважає запису аудіо.
Феде Хенце

70

У iOS 10 на iPhone 7 або 7 Plus спробуйте:

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. Ці пристрої я протестував.
Rocky Balboa


45

Швидкий 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
Не забудьте додати "імпортувати AVFoundation", щоб використовувати .oldSchool вібрацію :)
atereshkov

Окрім .oldSchool, що залишилися випадками, які не працюють, я перевірив на фізичному пристрої iPhone 6 будь-яку допомогу?
Сай кумар Редді,

Ви повинні пояснити, що FeedbackGenerator є хаотичним, і він поставляється з iPhone 7. Ви також можете мати лише один рядок у кожному випадку: UIImpactFeedbackGenerator (стиль: .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 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))
        }

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.