답변:
" iPhone Tutorial : iOS 장비의 기능을 확인하는 더 좋은 방법 "에서 :
매개 변수를 취하는 두 개의 유사한 기능이 있습니다 kSystemSoundID_Vibrate
.
1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
두 기능 모두 iPhone을 진동시킵니다. 그러나 진동을 지원하지 않는 장치에서 첫 번째 기능을 사용하면 경고음이 울립니다. 반면에 두 번째 기능은 지원되지 않는 장치에서는 아무 것도 수행하지 않습니다. 따라서 장치를 지속적으로 진동하려는 경우 기능 2를 사용하십시오.
먼저, AudioToolbox.framework
빌드 단계에서 대상에 AudioToolbox 프레임 워크 를 추가하십시오 .
그런 다음이 헤더 파일을 가져 오십시오.
#import <AudioToolbox/AudioServices.h>
AudioServicesPlayAlertSound(UInt32(kSystemSoundID_Vibrate))
(적어도 베타 2부터)
AudioToolbox 지금을 제시 kSystemSoundID_Vibrate
A와 SystemSoundID
코드가 그래서, 유형 :
import AudioToolbox.AudioServices
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
여분의 캐스트 단계를 거치지 않고
(@Dov에 지원)
그리고 여기 Swift 에서 수행하는 방법이 있습니다 (나와 같은 문제가 발생한 경우)
Link AudioToolbox.framework
to (프로젝트로 이동하여 대상 선택, 단계 빌드, 라이브러리와 바이너리 연결, 거기에 라이브러리 추가)
완료되면 :
import AudioToolbox.AudioServices
// Use either of these
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
치즈 맛 SystemSoundID
은 기본적으로 typealias
(멋진 스위프트 typedef
)입니다 UInt32
.kSystemSoundID_Vibrate
정기적입니다 Int
. 컴파일러에서 캐스트하려고 당신에게 오류를 제공 Int
하는 UInt32
,하지만 혼란 "SystemSoundID로 변환 할 수 없습니다"라고 오류가 읽습니다. 애플이 왜 그것을 스위프트 열거 형으로 만들지 않았습니까?
@ aponomarenko의 세부 사항에 들어가면 내 대답은 Swifters를위한 것입니다.
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);
}
}
중요 사항 : 향후 지원 중단 경고.
현재로 아이폰 OS 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 Plus 이상에서는 이러한 3 가지 햅틱 피드백 API를 사용하십시오.
let generator = UINotificationFeedbackGenerator()
generator.notificationOccured(style: .error)
사용 가능한 스타일은 .error
, .success
및 .warning
입니다. 각각 고유 한 느낌이 있습니다.
로부터 문서 :
UIFeedbackGenerator
성공, 실패 및 경고를 전달하기 위해 햅틱을 생성 하는 구체적인 하위 클래스입니다.
let generator = UIImpactFeedbackGenerator(style: .medium)
generator.impactOccured()
사용 가능한 스타일은 .heavy
, .medium
및 .light
입니다. 이것은 다양한 정도의 "경도"를 가진 단순한 진동입니다.
로부터 문서 :
UIFeedbackGenerator
물리적 영향을 시뮬레이션하기 위해 햅틱을 생성 하는 구체적인 하위 클래스
let generator = UISelectionFeedbackGenerator()
generator.selectionChanged()
이것은 모든 햅틱 중에서 가장 눈에 띄지 않으며 햅틱이 앱 경험을 인수하지 않아야 할 때 가장 적합합니다.
로부터 문서 :
UIFeedbackGenerator
선택의 변화를 나타내는 햅틱을 생성 하는 구체적인 서브 클래스.
이 API를 사용할 때 기억해야 할 것이 몇 가지 있습니다.
실제로 햅틱을 만들지는 않습니다. 당신은 시스템이 요청 햅틱를 생성합니다. 시스템은 다음을 기반으로 결정합니다.
따라서 시스템은 햅틱 요청이 가능하지 않으면 자동으로 무시합니다. 지원되지 않는 장치 때문인 경우 다음을 시도해보십시오.
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()
준비 상태 가되는 방법이 있습니다. 게임 오버 사용 예 : 사용자의 체력이 매우 낮거나 근처에 위험한 몬스터가 있으면 게임이 종료 될 수 있습니다.
이 경우, Taptic Engine을 준비하면보다 품질이 좋고 반응이 빠른 환경을 만들 수 있습니다.
예를 들어 앱에서 팬 제스처 인식기를 사용하여 보이는 세계의 일부를 변경한다고 가정 해 보겠습니다. 사용자가 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 및 최신 iPhone에서는 햅틱 API를 사용할 수도 있습니다. 이 햅틱 피드백은 AudioToolbox API보다 부드럽습니다.
GAME OVER 시나리오의 경우 무거운 UI 영향 피드백이 적합해야합니다.
UIImpactFeedbackGenerator(style: .heavy).impactOccurred()
다른 햅틱 피드백 스타일을 사용할 수 있습니다 .
제 경우에는 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 및 몇 가지 최신 iPod 용.
2) AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
iPad 용.