回答:
「iPhoneチュートリアル:iOSデバイスの機能を確認するためのより良い方法」から:
パラメータを取る2つの一見似た関数がありますkSystemSoundID_Vibrate
。
1) AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
2) AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
どちらの機能もiPhoneを振動させます。ただし、振動に対応していないデバイスで最初の機能を使用すると、ビープ音が鳴ります。一方、2番目の関数は、サポートされていないデバイスでは何も行いません。したがって、常識的に言うと、デバイスを継続的に振動させる場合は、関数2を使用します。
まず、AudioToolbox.framework
ビルド段階でAudioToolboxフレームワークをターゲットに追加します。
次に、このヘッダーファイルをインポートします。
#import <AudioToolbox/AudioServices.h>
AudioServicesPlayAlertSound(UInt32(kSystemSoundID_Vibrate))
少なくともベータ2以降)
AudioToolboxはをタイプkSystemSoundID_Vibrate
として表示するSystemSoundID
ため、コードは次のとおりです。
import AudioToolbox.AudioServices
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
追加のキャスト手順を実行する代わりに
(@Dovの小道具)
そして、これがSwiftでそれを行う方法です(あなたが私と同じ問題に遭遇した場合に備えて)
リンク先AudioToolbox.framework
(プロジェクトに移動し、ターゲットを選択し、フェーズを構築し、ライブラリとバイナリをリンクし、そこにライブラリを追加します)
それが完了すると:
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に変換できません」とエラーが読み込みます。なぜAppleがSwift列挙型にしたのではないのでしょうか。
@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);
}
}
重要な注意:今後のサポート終了のアラート。
以下のようiOSの9.0、APIの機能の説明については:
AudioServicesPlaySystemSound(inSystemSoundID: SystemSoundID)
AudioServicesPlayAlertSound(inSystemSoundID: SystemSoundID)
次のメモが含まれます。
This function will be deprecated in a future release.
Use AudioServicesPlayAlertSoundWithCompletion or
AudioServicesPlaySystemSoundWithCompletion instead.
正しい方法は、次の2つのいずれかを使用することです。
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()
、準備が整った状態にするためのメソッドがあります。ゲームオーバーの例の使用:ユーザーがHPが非常に低いか、危険なモンスターが近くにいるため、ゲームが間もなく終了することを知っているかもしれません。
この場合、Tapticエンジンを準備すると、より高品質で応答性の高いエクスペリエンスが作成されます。
たとえば、アプリがパンジェスチャー認識機能を使用して、表示される世界の部分を変更するとします。ユーザーが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用。