[SWIFT] Développement d'applications iOS: application Timer (5. Implémentation d'alarme et de vibration)

スクリーンショット 2020-10-28 10.49.18.png

Contenu

Les points pour créer une application de minuterie sont publiés dans plusieurs articles. Cet article décrit la mise en œuvre des alarmes et des vibrations qui se déclenchent lorsque le compte à rebours du minuteur atteint zéro.

environnement

Dépôt Git

Vous pouvez voir l'exemple de code à partir de l'URL du référentiel Git suivante. https://github.com/msnsk/Qiita_Timer.git

procédure

  1. Importez la bibliothèque AudioToolbox avec TimeManager
  2. Ajoutez le nom de la tonalité d'alarme par défaut et les propriétés d'ID d'alarme à TimeManager
  3. Importez la bibliothèque AudioToolbox dans MainView
  4. Implémentez le déclenchement d'alarme dans le modificateur .onReceive de ZStack dans MainView
  5. Implémentez le déclenchement par vibration dans le modificateur .onReceive de ZStack dans MainView

1. Importez la bibliothèque Audio Toolbox avec Time Manager

Importez une nouvelle bibliothèque appelée AudioToolbox dans TimeManager. La bibliothèque AudioToolbox contient des classes, des propriétés et des méthodes principalement pour les effets sonores, que vous pouvez utiliser pour interrompre l'alarme lorsque le compte à rebours du minuteur atteint zéro.

TimeManager.swift


import SwiftUI
import AudioToolbox //Importation supplémentaire

class TimeManager: ObservableObject {
    //(Propriétés et méthodes omises)
}

2. Ajoutez le nom de la sonnerie d'alarme par défaut et les propriétés d'ID d'alarme à TimeManager

Pour utiliser une source sonore incluse dans AudioToolbox, vous devez spécifier le SystemSoundID de cette source sonore. SystemSoundID est un type de données, typealias UInt32.

Donc, créez une propriété pour ce type de données dans la classe TimeManager, attachez le wrapper de propriété @Published et attribuez l'ID de la source audio que vous souhaitez spécifier par défaut comme valeur.

Les ressources suivantes vous aideront à découvrir quel ID sonne quoi. https://github.com/TUNER88/iOSSystemSoundsLibrary

J'ai vérifié les éléments de cette ressource un par un, mais il semble que ce soit le son de notification utilisé dans des modèles assez anciens d'appareils iOS. Nous n'avons trouvé aucune information sur le son de notification utilisé par défaut sur les modèles récents. Notez s'il vous plaît. (Si quelqu'un sait, je vous serais reconnaissant si vous pouviez commenter)

Le nom de la propriété était soundID, et j'ai personnellement estimé que c'était une source sonore confortable, j'ai donc attribué 1151 comme ID.

TimeManager.swift


import SwiftUI
import AudioToolbox //Importation supplémentaire

class TimeManager: ObservableObject {
    //(Autres propriétés omises)

    //Stocke l'ID audio par défaut avec le type de données pour l'utilisation de la source sonore stockée dans Audio Toolbox
    @Published var soundID: SystemSoundID = 1151

    //(Méthode omise)
}

3. Importez la bibliothèque AudioToolbox dans MainView

Importez la bibliothèque AudioToolbox dans MainView ainsi que TimeManager à l'étape 1.

La raison de l'importation d'AudioToolbox ici est que vous devez écrire une méthode dans MainView qui émet une alerte lorsque le compte à rebours atteint réellement 0, et cette méthode est incluse dans AudioToolbox.

MainView.swift


import SwiftUI
import AudioToolbox //Importation supplémentaire

struct MainView: View {
    //(Propriétés et méthodes omises)
}

4. Implémentez le déclenchement d'alarme dans le modificateur MainView ZStack .onReceive

Dans le modificateur .onReceive de ZStack de MainView, si le temps restant est supérieur à 0 ou inférieur à 0, le branchement conditionnel par l'instruction if-else a déjà été effectué. Ajoutez une méthode pour déclencher le son de l'alarme dans l'instruction else (lorsque le temps restant est égal ou inférieur à 0).

La méthode est décrite comme suit. Dans le premier argument, spécifiez la propriété soundID de la classe TimeManager préparée précédemment à l'étape 2. Le deuxième argument peut être nul.

AudioServicesPlayAlertSoundWithCompletion(self.timeManager.soundID, nil)

MainView.swift


struct MainView: View {
    //(Propriété omise)
    
    var body: some View {
        ZStack {
            //(réduction)
        }
        //Exécute le code dans la fermeture déclenchée par une minuterie qui s'active à chaque heure spécifiée (1 seconde)
        .onReceive(timeManager.timer) { _ in
            //L'état de la minuterie est.Ne rien faire sauf courir
            guard self.timeManager.timerStatus == .running else { return }
            //Si le temps restant est supérieur à 0
            if self.timeManager.duration > 0 {
                //Du temps restant-1 faire
                self.timeManager.duration -= 1
            //Lorsque le temps restant est égal ou inférieur à 0
            } else {
                //État de la minuterie.Changer pour arrêté
                self.timeManager.timerStatus = .stopped
                //Sonner une alarme
                AudioServicesPlayAlertSoundWithCompletion(self.timeManager.soundID, nil)
            }
        }
    }
}

5. Implémentez le déclenchement par vibration dans le modificateur ZStack .onReceive de MainView

À côté du son d'alarme se trouve la mise en œuvre de la vibration. Cela utilise également la même méthode que l'activation du son d'alarme. L'argument change.

Dans l'argument, la valeur de soundID pour les vibrations obtenue par la propriété kSystemSoundID_Vibrate est convertie en type de données SystemSoundID et transmise.

AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) {}

MainView.swift


struct MainView: View {
    //(Propriété omise)
    
    var body: some View {
        ZStack {
            //(réduction)
        }
        .onReceive(timeManager.timer) { _ in
            guard self.timeManager.timerStatus == .running else { return }
            if self.timeManager.duration > 0 {
            //(réduction)
            } else {
                //(réduction)
                //Sonner une alarme
                AudioServicesPlayAlertSoundWithCompletion(self.timeManager.soundID, nil)
                //Activer la vibration
                AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate)) {}
            }
        }
    }
}

La prochaine fois, nous créerons un écran de réglage qui comprend l'activation / désactivation de l'alarme et des vibrations.

Recommended Posts

Développement d'applications iOS: application Timer (5. Implémentation d'alarme et de vibration)
Développement d'applications iOS: application Timer (7. Mise en œuvre de la sélection du son d'alarme)
Développement d'applications iOS: application Timer (8. Implémentation de la barre de progression)
Développement d'applications iOS: application Timer (4. Implémentation du compte à rebours)
Développement d'applications iOS: application Timer (6. Création de l'écran de réglage)
Développement d'applications iOS: application Timer (2. affichage de la minuterie)
Développement d'applications iOS: application Timer (résumé)
Développement d'applications iOS: application Timer (1. réglage de l'heure de la minuterie)
Développement d'applications iOS: application Timer (10. Créer une animation)
Développement d'applications iOS: application Timer (9. Personnalisez la couleur de la barre de progression)
Développement d'applications iOS: application Timer (3. bouton Démarrer / Arrêter, bouton Réinitialiser)
Journal complet de développement d'applications IOS pour l'auto-apprentissage
Feuille de route des compétences de développement d'applications iOS (introduction)
Implémentation par défaut de Object.equals () et Object.hashCode ()
Comparaison de l'implémentation de la production qui fait briller les images sur iOS et Android
Localisation de l'implémentation de référence JAXB et de DatatypeConverterImpl
Comparaison approfondie des implémentations Android et iOS
Implémentation des onglets à l'aide de TabLayout et ViewPager
Mémo d'implémentation SKStoreReviewController dans l'interface utilisateur Swift d'iOS14
Ceci et celui de la dérivation conditionnelle du développement des rails