【Objective-C】iOSのバブレーションを0.1秒以下や10秒以上と長い時間動作させる方法

2020年8月27日

iOSのバイブレーションはiOSが提供する5種類ぐらいのバイブレーションしか存在しません。
しかしプライベートAPIを使用することでバイブレーションの長さや強さを自由にカスタマイズすることが可能です。

ただし、プライベートAPIを使用するのでアプリをAppStoreで公開することはできません。
プライベートAPIを使用したアプリは審査でリジェクトの基準になっているからです。
運良く通ったとしてもその後リジェクトされる可能性やアカウント停止処分を受ける可能性もあるため、AppStoreで配信するアプリでのご利用は控えた方が良さそうです。

バイブレーションを0.1秒以下で動作させる

#import "ViewController.h"

// AudioToolbox.frameworkのAudioServicesをインポート
#import <AudioToolbox/AudioServices.h>

// プライベートAPIを使用できるように宣言
void AudioServicesStopSystemSound(int);

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    [self vibrate];
}

- (void)vibrate {
    // バイブレーションを0.1秒だけならす
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
    // 0.1秒後にシステムサウンドをストップさせる
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        AudioServicesStopSystemSound(kSystemSoundID_Vibrate);
    });
}

@end

バブレーションを10秒以上と長い時間動作させる

#import "ViewController.h"

// AudioToolbox.frameworkのAudioServicesをインポート
#import <AudioToolbox/AudioServices.h>

// プライベートAPIを使用できるように宣言
void AudioServicesPlaySystemSoundWithVibration(int, id, NSDictionary *);

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    [self vibrate];
}

- (void)vibrate {

    // 10秒バイブレーションさせる(ミリ秒)
    int64_t vibrationLength = 10000;
    
    // パターンの作成
    NSArray *pattern = @[@NO, @0, @YES, @(vibrationLength)];
    
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
    dictionary[@"VibePattern"] = pattern;
    dictionary[@"Intensity"] = @1; // バイブレーションの強さ(0.0~1.0)
    
    // バイブレーション開始
    AudioServicesPlaySystemSoundWithVibration(kSystemSoundID_Vibrate, nil, dictionary);
}

@end