このブログのコピーです。
概要
iOSのリモートPush(APNS)でSoundペイロードが指定でき、その再生ファイルをアプリ側でコントロール可能なのですが、その挙動についてiOSのバージョン(iOS8と9以降)で異なるので記事にしました。
環境
- macOS Sierra 10.12.3
- Xcode 8.2.1
- iOS 10から8まで
APNSペイロード
{
"aps": {
"alert": {
"body":"🍺APNSプッシュテストです",
"title":"🌟APNSプッシュテストタイトル🌟",
"action-loc-key":"アプリへ"
},
"badge":1,
"sound":"b.caf",
"mutable-content":"1"
}
}
コード
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// テスト用なのでdidFinishLaunchingWithOptionsで力強く実行
///(snip)
NSError* error = nil;
BOOL result;
NSFileManager* fm = [NSFileManager defaultManager];
NSString* libraryDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
NSString* dataDir = [libraryDir stringByAppendingPathComponent:@"Sounds"];
NSLog(@"dataDir: %@", dataDir);
// Library/Soundsディレクトリが未作成なら作成します
if(![fm fileExistsAtPath: dataDir isDirectory: &result] && !result) {
NSLog(@"create dir");
[fm createDirectoryAtPath: dataDir
withIntermediateDirectories:YES
attributes:nil
error:&error];
if(error) {
/// FIXME
NSLog(@"Error: %@", error);
}
}
// copy先が存在するとエラーとなるので削除します
[fm removeItemAtPath:[dataDir stringByAppendingPathComponent:@"b.caf"] error:nil];
// main bundle配下のファイルをサーバー指定"b.caf”でLibrary/Soundsディレクトリにコピーします
result = [fm copyItemAtPath:[[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"a.caf"] toPath:[dataDir stringByAppendingPathComponent: @"b.caf"] error: &error];
// 別のファイルにすれば音も変わります(サーバー側のsound payloadは"b.caf"固定)
// result = [fm copyItemAtPath:[[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"c.caf"] toPath:[dataDir stringByAppendingPathComponent: @"b.caf"] error: &error];
if(!result) {
/// FIXME
NSLog(@"Error: %@", error);
}
結果
iOS10 カスタム音が鳴る
iOS9 カスタム音が鳴る
iOS8 カスタム音が鳴らない Σ(゚Д゚)フアッ
一通りドキュメントを探してみたのだが、エビデンスは見当たらなかった… orz
ハマったこと・課題など
- iOS8でカスタム音が鳴らない
github
なし