Як змусити 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.