Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

概要

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

なし

参考

bhind13
最近Rustしかしとらん
http://bhind.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away