LoginSignup
1
1

More than 5 years have passed since last update.

iOS リモートPushのSoundペイロード指定ファイルのアプリ変更方法について(iOS9以降)

Posted at

このブログのコピーです。

概要

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

なし

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1