Как заставить iPhone завибрировать с помощью Swift?

117

Мне нужно заставить iPhone завибрировать, но я не знаю, как это сделать в Swift. Я знаю, что в Objective-C вы просто пишете:

import AudioToolbox
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

Но это не работает для меня.

Нико Гутрайх
источник
В Swift доступна та же функция: developer.apple.com/library/ios/documentation/AudioToolbox/…
Мартин Курто
Здесь вы найдете все коды для каждого .caf и связанной категории: github.com/TUNER88/iOSSystemSoundsLibrary. Например, если вам нужна более легкая вибрация, вы можете использовать код 1003.
О. Бужауан

Ответы:

225

Краткий пример:

import UIKit
import AudioToolbox

class ViewController: UIViewController {

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

загрузите на свой телефон, и он завибрирует. Вы можете поместить его в функцию или IBAction, как хотите.

Обновление кода:

 AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) { }

Как написано в документации Apple Code:

Эта функция будет объявлена ​​устаревшей в будущих версиях. Вместо этого используйте AudioServicesPlaySystemSoundWithCompletion.

ПРИМЕЧАНИЕ: Если вибрация не работает. проверьте, включена ли вибрация в настройках звуков и тактильных ощущений

Стив Розенберг
источник
1
есть ли способ позволить телефону постоянно вибрировать, пока не будет нажата кнопка?
Николас
3
Что спросил Николас, мне также было интересно, есть ли способ заставить его вибрировать по особому шаблону.
Натан МакКаскл
1
Я знаю, что есть github, который показывает идентификаторы системы для всех аудиофайлов iPhone и 3 файлов вибрации, но кто-нибудь знает, как я могу получить доступ к ДРУГИМ файлам вибрации? Я хочу, например, использовать вибросигнал Staccato, но не могу определить идентификатор или даже его наличие.
jammyman34
1
@Nicholas, если я нашел приложение, которое просит меня нажать кнопку, иначе оно будет постоянно вибрировать, я немедленно удалю его со своего устройства.
user3441734 07
2
Имейте в виду, что устройство не вибрирует, если аудиосеанс вашего приложения настроен с категорией аудиосеанса AVAudioSessionCategoryPlayAndRecord или AVAudioSessionCategoryRecord. Это гарантирует, что вибрация не мешает записи звука.
Fede Henze
70

В iOS 10 на iPhone 7 или 7 Plus попробуйте:

let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.impactOccurred()
Адам Смака
источник
1
мы все используем iOS 10, не так ли? это новейшая, лучшая и бесплатная версия системы. каждый должен обновляться, нет никаких компромиссов в его наличии.
Адам Смака 03
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))
            }
        }
    }
muhasturk
источник
4
Не забудьте добавить import AVFoundation, чтобы использовать вибрацию .oldSchool :)
атерешков 02
Не работают оставшиеся чехлы .oldSchool. Я тестировал физическое устройство iPhone 6. Есть помощь?
Сай Кумар Редди,
1
Вы должны объяснить, что 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
        }
    }
}
Malder
источник
18

Мы можем сделать это в Xcode7.1

import UIKit
import AudioToolbox


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
    }
}
ken0nek
источник
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
Рашид Латиф
источник
5

Вы можете завибрировать телефон с помощью AudioServicesили Haptic Feedback.

// AudioServices
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

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

Оформить заказ моих рамок с открытой исходным кодом Haptica , он поддерживает Haptic Feedback, AudioServicesи модели уникальных вибраций. Работает на Swift 4.2, Xcode 10

efremidze
источник
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))
        }
Сергей Лысюк
источник