जवाबों:
" IPhone ट्यूटोरियल: iOS उपकरणों की क्षमताओं की जांच करने का बेहतर तरीका ":
दो समान कार्य हैं जो एक पैरामीटर लेते हैं kSystemSoundID_Vibrate
:
1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
दोनों ही फंक्शन iPhone को वाइब्रेट करते हैं। लेकिन, जब आप कंपन का समर्थन करने वाले उपकरणों पर पहले फ़ंक्शन का उपयोग करते हैं, तो यह एक बीप साउंड बजाता है। दूसरी ओर, दूसरा कार्य, असमर्थित उपकरणों पर कुछ भी नहीं करता है। इसलिए यदि आप डिवाइस को लगातार कंपन करने जा रहे हैं, तो एक चेतावनी के रूप में, सामान्य ज्ञान कहता है, फ़ंक्शन 2 का उपयोग करें।
सबसे पहले, AudioToolbox.framework
बिल्ड चरणों में अपने लक्ष्य के लिए ऑडियोटूलबॉक्स फ्रेमवर्क जोड़ें ।
फिर, इस हेडर फ़ाइल को आयात करें:
#import <AudioToolbox/AudioServices.h>
AudioServicesPlayAlertSound(UInt32(kSystemSoundID_Vibrate))
(कम से कम बीटा 2 के रूप में)
AudioToolbox अब kSystemSoundID_Vibrate
एक SystemSoundID
प्रकार के रूप में प्रस्तुत करता है , इसलिए कोड है:
import AudioToolbox.AudioServices
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
इसके बजाय अतिरिक्त डाली कदम के माध्यम से जाने के लिए
(@Dov को सहारा)
और, यहाँ आप इसे स्विफ्ट पर कैसे करते हैं (यदि आप उसी परेशानी में भागे जैसे मैंने किया था)
लिंक के खिलाफ AudioToolbox.framework
(अपनी परियोजना पर जाएं, अपने लक्ष्य का चयन करें, चरणों का निर्माण करें, पुस्तकालयों के साथ लिंक बाइनरी, वहां पुस्तकालय जोड़ें)
एक बार जो पूरा हो गया:
import AudioToolbox.AudioServices
// Use either of these
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
चीज़ की बात यह है कि SystemSoundID
मूल रूप से एक typealias
(फैंसी स्विफ्ट typedef
) है aUInt32
, और kSystemSoundID_Vibrate
यह एक नियमित है Int
। संकलक आपको इसमें से कास्ट करने की कोशिश करने के लिए एक त्रुटि देता Int
है UInt32
, लेकिन त्रुटि "सिस्टमसाउंडआईडी में परिवर्तित नहीं हो सकती" के रूप में पढ़ती है, जो भ्रामक है। सेब क्यों नहीं बना यह सिर्फ एक स्विफ्ट Enum मेरे से परे है।
@ aponomarenko के विवरण में जाता है, मेरा जवाब सिर्फ स्विफ्टर्स के लिए है।
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
और यह ठीक संकलित किया गया
ऐसा करने का एक सरल तरीका ऑडियो सेवाओं के साथ है:
#import <AudioToolbox/AudioToolbox.h>
...
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
मुझे इस बात से बहुत परेशानी हुई कि जिन डिवाइसों में कंपन था, वे किसी तरह से बंद हो गए, लेकिन हमें इसकी परवाह किए बिना काम करने की ज़रूरत थी, क्योंकि यह हमारे एप्लिकेशन के कामकाज के लिए महत्वपूर्ण है, और चूंकि यह एक डॉक्यूमेंटेड मेथड कॉल का पूर्णांक है, इसलिए यह पास हो जाएगा मान्यता। इसलिए मैंने कुछ ध्वनियों की कोशिश की है जो यहाँ के अच्छी तरह से प्रलेखित लोगों के बाहर थीं: TUNER88 / iOSSystemSoundsLibrary
मैंने तब 1352 पर ठोकर खाई है, जो साइलेंट स्विच या डिवाइस पर सेटिंग्स की परवाह किए बिना काम कर रहा है (Settings->vibrate on ring, vibrate on silent)
।
- (void)vibratePhone;
{
if([[UIDevice currentDevice].model isEqualToString:@"iPhone"])
{
AudioServicesPlaySystemSound (1352); //works ALWAYS as of this post
}
else
{
// Not an iPhone, so doesn't have vibrate
// play the less annoying tick noise or one of your own
AudioServicesPlayAlertSound (1105);
}
}
महत्वपूर्ण नोट: भविष्य में गिरावट का अलर्ट।
IOS 9.0 के रूप में , API के लिए वर्णन कार्य करता है:
AudioServicesPlaySystemSound(inSystemSoundID: SystemSoundID)
AudioServicesPlayAlertSound(inSystemSoundID: SystemSoundID)
निम्नलिखित नोट शामिल हैं:
This function will be deprecated in a future release.
Use AudioServicesPlayAlertSoundWithCompletion or
AudioServicesPlaySystemSoundWithCompletion instead.
जाने का सही तरीका इन दोनों में से किसी एक का उपयोग करना होगा:
AudioServicesPlayAlertSoundWithCompletion(kSystemSoundID_Vibrate, nil)
या
AudioServicesPlayAlertSoundWithCompletion(kSystemSoundID_Vibrate) {
//your callback code when the vibration is done (it may not vibrate in iPod, but this callback will be always called)
}
स्मरण में रखना
import AVFoundation
IPhone 7/7 प्लस या नए के लिए, इन तीन Haptic फ़ीडबैक API का उपयोग करें।
let generator = UINotificationFeedbackGenerator()
generator.notificationOccured(style: .error)
उपलब्ध शैलियों रहे हैं .error
, .success
, और .warning
। प्रत्येक की अपनी विशिष्ट अनुभूति है।
से डॉक्स :
एक ठोस
UIFeedbackGenerator
उपवर्ग जो सफलताओं, असफलताओं और चेतावनियों को संप्रेषित करने के लिए हाप्टिक्स बनाता है।
let generator = UIImpactFeedbackGenerator(style: .medium)
generator.impactOccured()
उपलब्ध शैलियों रहे हैं .heavy
, .medium
, और .light
। ये "कठोरता" की अलग-अलग डिग्री के साथ सरल कंपन हैं।
से डॉक्स :
एक ठोस
UIFeedbackGenerator
उपवर्ग जो भौतिक प्रभावों को अनुकरण करने के लिए haptics बनाता है
let generator = UISelectionFeedbackGenerator()
generator.selectionChanged()
यह सभी सरीसृपों में से कम से कम ध्यान देने योग्य है, और इसलिए सबसे उपयुक्त है जब हापिक्स को ऐप के अनुभव से अधिक नहीं लेना चाहिए।
से डॉक्स :
एक ठोस
UIFeedbackGenerator
उपवर्ग जो चयन में बदलाव का संकेत देने के लिए haptics बनाता है।
इन एपीआई का उपयोग करते समय कुछ बातें याद रखने लायक हैं।
आप वास्तव में हैप्टिक नहीं बनाते हैं। आप सिस्टम से हैप्टिक उत्पन्न करने का अनुरोध करते हैं । सिस्टम नीचे के आधार पर तय करेगा:
इसलिए, सिस्टम चुपचाप यदि संभव न हो तो जल्दबाजी के लिए आपके अनुरोध को अनदेखा कर देगा। यदि यह किसी असमर्थित डिवाइस के कारण है, तो आप यह कोशिश कर सकते हैं:
func haptic() {
// Get whether the device can generate haptics or not
// If feedbackSupportLevel is nil, will assign 0
let feedbackSupportLevel = UIDevice.current.value(forKey: "_feedbackSupportLevel") as? Int ?? 0
switch feedbackSupportLevel {
case 2:
// 2 means the device has a Taptic Engine
// Put Taptic Engine code here, using the APIs explained above
case 1:
// 1 means no Taptic Engine, but will support AudioToolbox
// AudioToolbox code from the myriad of other answers!
default: // 0
// No haptic support
// Do something else, like a beeping noise or LED flash instead of haptics
}
टिप्पणी स्थानापन्न switch
- case
बयान, और इस हैप्टिक पीढ़ी कोड अन्य IOS उपकरणों के लिए पोर्टेबल हो जाएगा। यह जल्दबाजी के उच्चतम स्तर को उत्पन्न करेगा।
prepare()
विधि होती है, इसे तत्परता की स्थिति में रखना। उदाहरण के लिए अपने गेम का उपयोग करना: आप यह जान सकते हैं कि उपयोगकर्ता एचपी के बहुत कम होने या खतरनाक राक्षस के पास होने के कारण गेम समाप्त होने वाला है।
इस मामले में, ताप्ती इंजन को तैयार करने से उच्च-गुणवत्ता, अधिक उत्तरदायी अनुभव पैदा होगा।
उदाहरण के लिए, मान लें कि आपका ऐप दृश्यमान दुनिया के हिस्से को बदलने के लिए पैन जेस्चर पहचानकर्ता का उपयोग करता है। जब आप उपयोगकर्ता को 360 डिग्री के 'गोल' दिखते हैं, तो आप उत्पन्न करना चाहते हैं। यहां बताया गया है कि आप इसका उपयोग कैसे कर सकते हैं prepare()
:
@IBAction func userChangedViewablePortionOfWorld(_ gesture: UIPanGestureRecogniser!) {
haptic = UIImpactFeedbackGenerator(style: .heavy)
switch gesture.state {
case .began:
// The user started dragging the screen.
haptic.prepare()
case .changed:
// The user trying to 'look' in another direction
// Code to change viewable portion of the virtual world
if virtualWorldViewpointDegreeMiddle = 360.0 {
haptic.impactOccured()
}
default:
break
}
import UIKit
!
haptic
इस विधि के अंदर एक नया उदाहरण नहीं बनाना चाहते हैं । आप impactOccured
उसी उदाहरण पर कॉल नहीं कर रहे हैं जिसे आप कॉल करते हैं prepare
।
मेरी यात्रा में मैंने पाया है कि यदि आप ऑडियो रिकॉर्ड करते समय निम्न में से किसी एक को आज़माते हैं, तो डिवाइस सक्षम होने पर भी कंपन नहीं करेगा।
1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
डिवाइस के आंदोलनों की माप में एक विशिष्ट समय पर मेरी विधि को बुलाया गया था। मुझे रिकॉर्डिंग बंद करनी थी और फिर कंपन होने के बाद इसे फिर से चालू करें।
ऐसा लग रहा था।
-(void)vibrate {
[recorder stop];
AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
[recorder start];
}
recorder
एक AVRecorder उदाहरण है।
आशा है कि यह दूसरों की मदद करता है जो पहले एक ही समस्या थी।
IOS 10 में, और नए iPhones पर, आप haptic API का उपयोग कर सकते हैं। यह हैप्टिक प्रतिक्रिया AudioToolbox API की तुलना में नरम है।
आपके GAME OVER परिदृश्य के लिए, भारी UI प्रभाव प्रतिक्रिया उपयुक्त होनी चाहिए।
UIImpactFeedbackGenerator(style: .heavy).impactOccurred()
आप अन्य haptic राय शैलियों का उपयोग कर सकते हैं ।
मेरे मामले में मैं AVCaptureSession का उपयोग कर रहा था। AudioToolbox परियोजना के निर्माण चरणों में था और इसे आयात किया गया था लेकिन फिर भी काम नहीं किया। इसे काम करने के लिए मैंने कंपन से पहले सत्र रोक दिया और उसके बाद भी जारी रहा।
#import <AudioToolbox/AudioToolbox.h>
...
@property (nonatomic) AVCaptureSession *session;
...
- (void)vibratePhone;
{
[self.session stopRunning];
NSLog(@"vibratePhone %@",@"here");
if([[UIDevice currentDevice].model isEqualToString:@"iPhone"])
{
AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
}
else
{
AudioServicesPlayAlertSound (kSystemSoundID_Vibrate);
}
[self.session startRunning];
}
आप उपयोग कर सकते हैं
1) AudioServicesPlayAlertSound (kSystemSoundID_Vibrate);
iPhone और कुछ नए iPods के लिए।
2) AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
आईपैड के लिए।