source

아이폰 진동시키기

ittop 2023. 5. 27. 11:57
반응형

아이폰 진동시키기

아이폰이 한번 진동하도록 어떻게 설정할 수 있습니까?

예를 들어, 플레이어가 생명을 잃거나 게임이 끝나면 아이폰이 진동해야 합니다.

출처: "iPhone 튜토리얼: iOS 기기의 기능을 확인하는 더 좋은 방법":

유사해 보이는 두 개의 함수가 매개 변수를 사용합니다.kSystemSoundID_Vibrate:

1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

두 기능 모두 아이폰을 진동시킵니다.하지만 진동을 지원하지 않는 장치에서 첫 번째 기능을 사용하면 삐 소리가 납니다.그러나 두 번째 기능은 지원되지 않는 장치에서는 아무 것도 하지 않습니다.따라서 장치를 지속적으로 진동시키려면 상식적으로 기능 2를 사용합니다.

프레임워크인 AudioToolbox를 합니다.AudioToolbox.framework목표에 도달할 수 있습니다.

그런 다음 이 헤더 파일을 가져옵니다.

#import <AudioToolbox/AudioServices.h>

스위프트 2.0+

오디오 도구 상자에 도구 상자가 됩니다.kSystemSoundID_VibrateSystemSoundID다음과 같이 입력합니다.

import AudioToolbox.AudioServices

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)

추가 캐스팅 단계를 거쳐야 하는 대신

(@Dov에 대한 제안)

원본 답변(Swift 1.x)

그리고 스위프트에서 하는 방법은 다음과 같습니다(저와 같은 문제에 부딪힐 경우를 대비하여 주십시오.

에 대한 AudioToolbox.framework 단계,,

작업이 완료되면 다음을 수행합니다.

import AudioToolbox.AudioServices

// Use either of these
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

얄미운 것은SystemSoundID으로 기적으입니다로본▁basically▁is입▁a다.typealias(스피드 스위프트)typedef) 잠시 동안UInt32 리고그고.kSystemSoundID_Vibrate는 정기적인 단입다Int컴파일러에서 캐스트를 시도할 때 오류가 발생합니다.IntUInt32는 " convert to "로됩니다.아이디.ID"는 헷갈립니다.왜 애플은 그냥 스위프트 열거형으로 만들지 않았습니까?

@aponomarenko's는 세부 사항에 대해 설명합니다. 제 대답은 저기 있는 스위퍼들을 위한 것입니다.

간단한 방법은 오디오 서비스를 사용하는 것입니다.

#import <AudioToolbox/AudioToolbox.h> 
...    
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

진동이 꺼진 장치에 대해서는 큰 어려움을 겪었지만, 애플리케이션 작동에 매우 중요하고 문서화된 메서드 호출의 정수에 불과하기 때문에 검증을 통과해야 합니다.그래서 저는 여기에 잘 문서화된 소리 이외의 소리를 시도해 보았습니다: TURN88/iOSystemSounds Library

후는 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 Plus 이상 버전의 경우 다음 세 가지 Haptic 피드백 API를 사용합니다.

사용 가능한 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를 사용할 때 기억할 가치가 있는 몇 가지가 있습니다.

노트 A

실제로 햅틱을 만들지 않습니다.시스템에서 햅틱 생성을 요청합니다.시스템은 다음을 기준으로 결정합니다.

  • 장치에서 햅틱이 가능한 경우(이 경우 Taptic Engine이 있는지 여부)
  • 앱이 오디오를 녹음할 수 있는지 여부(원하지 않는 간섭을 방지하기 위해 녹음 중에 햅틱이 생성되지 않음)
  • 시스템 설정에서 햅틱을 활성화할지 여부입니다.

따라서 햅틱이 불가능한 경우 시스템은 사용자의 햅틱 요청을 자동으로 무시합니다.이 문제가 지원되지 않는 장치 때문인 경우 다음을 시도할 수 있습니다.

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 기기로 이동할 수 있습니다.가능한 최고 수준의 햅틱을 생성합니다.

비고 B

  • 햅틱 생성은 하드웨어 수준의 작업이기 때문에 햅틱 생성 코드를 호출할 때와 실제로 발생할 때 사이에 지연 시간이 있을 수 있습니다.이러한 이유로 Taptic Engine API는 모두 다음과 같은 기능을 가지고 있습니다.prepare()준비된 상태로 두는 방법.을 알 수 .당신은 사용자가 HP가 매우 낮거나 위험한 몬스터가 근처에 있으면 게임이 곧 끝날 것이라는 것을 알 수 있습니다.
  • 몇 초 이내에 햅틱을 생성하지 않으면 배터리 수명을 절약하기 위해 Taptic 엔진이 공회전 상태로 돌아갑니다.


이 경우 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

} 

그리고 만약 당신이 Xamarin (monotouch) 프레임워크를 사용하고 있다면, 간단히 전화하세요.

SystemSound.Vibrate.PlayAlertSound()

여행 중에 오디오를 녹음하는 동안 다음 중 하나를 시도하면 장치가 활성화되더라도 장치가 진동하지 않습니다.

1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

내 방법은 장치 움직임 측정에서 특정 시간에 호출되었습니다.저는 진동이 발생한 후 녹음을 중단하고 다시 시작해야 했습니다.

이렇게 생겼어요.

-(void)vibrate {
    [recorder stop];
    AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
    [recorder start];
}

recorderAVR 레코더 인스턴스입니다.

이것이 이전에 같은 문제를 겪은 다른 사람들에게 도움이 되기를 바랍니다.

iOS 10과 최신 아이폰에서도 햅틱 API를 사용할 수 있습니다.이 햅틱 피드백은 AudioToolbox API보다 부드럽습니다.

GAME OVER 시나리오의 경우 무거운 UI 영향 피드백이 적합해야 합니다.

UIImpactFeedbackGenerator(style: .heavy).impactOccurred()

다른 햅틱 피드백 스타일을 사용할 수 있습니다.

Swift에서:

import AVFoundation
...
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))

제 경우에는 AV Capture Session을 사용했습니다.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];
}

사용할 수 있습니다.

오디오 서비스경고음 재생(kSystemSound)ID_진동);

iPhone 및 몇 개의 최신 iPod용입니다.

오디오 서비스재생시스템사운드(k시스템사운드)ID_진동);

iPad용.

언급URL : https://stackoverflow.com/questions/4724980/making-the-iphone-vibrate

반응형