質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.96%

LocalNotificationで通知音を変更したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,751

score 9

前提・実現したいこと

iOSでpush通知機能を作成しています。
amazon snsと連携したpush通知を実装しようとしているのですが、
push通知音が変更できません。
原因の切り分けのため、localNotificationを利用して通知音を鳴らそうとしても
上手く行きませんでした。
やり方を教えて下さい。
イメージ説明
設定は上記のように追加しています。

該当のソースコード

ここにご自身が実行したソースコードを書いてください
  • (void) nextButtonSelected: (UIButton *)button {

    //Amazon SNS

    NSLog(@"Registering for push notifications...");

    [self.popUp dismiss:YES];
    UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes: (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)  categories:nil];

    [[UIApplication sharedApplication] registerUserNotificationSettings:setting];
    [[UIApplication sharedApplication] registerForRemoteNotifications];

}

-(void) application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler {
    [PFPush handlePush:userInfo];
    NSLog(@"didReceiveRemoteNotification Notification");
    pushCount = pushCount + 1;
    UILocalNotification *localNotification = [[UILocalNotification alloc] init];
    localNotification.fireDate = [NSDate date];
    localNotification.timeZone = [NSTimeZone localTimeZone];
    localNotification.applicationIconBadgeNumber = pushCount;
    localNotification.soundName = @"out.caf";
    [application scheduleLocalNotification:localNotification];
    [application setApplicationIconBadgeNumber:pushCount];

}

// Local Notificationの場合

  • (void)application:(UIApplication *)application
            handleActionWithIdentifier:(NSString *)identifier
            forLocalNotification:(UILocalNotification *)notification
            completionHandler:(void(^)())completionHandler {
        NSLog(@"Local Notification");
        [application setApplicationIconBadgeNumber:pushCount];
    }

試したこと

mp3でテスト
wavファイルでテスト

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

本当に通知音が悪いのか切り分けるのに以下のコードのみ記述して実行してみてください。
これで鳴らなければ音声ファイルの問題だと思います。

①プログラムを実行して通知を受ける旨のダイアログを許可します。
②許可したら直ぐバックグラウンドにしてください。10秒後にローカル通知がなります。

// AppDelegate

#import "AppDelegate.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
        [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
    }
    return YES;
}
@end

// ViewController

#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    UILocalNotification *localNotification = [[UILocalNotification alloc] init];
    localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow: 10];
    localNotification.alertTitle = @"Alert Title";
    localNotification.alertBody = @"Alert Body";
    localNotification.timeZone = [NSTimeZone localTimeZone];
    localNotification.soundName = @"out.caf";
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}

@end

最近あまりこの辺り触ってないのでうろ覚えですが、そもそもRemotePushでカスタムした音を鳴らす場合はサーバーから決まったフォーマットのJSONに記述するしくみではないですか?

iOSのPUSH通知(APNs)の種類について、ざっくり。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

通知音ファイル(out.caf)をどのようにして作成しましたか?

https://blog.takezou.com/archives/1832
を参考にしてGarageBandとafconvertコマンドで作成するか、そのページで公開されているサンプルcafファイルをダウンロードして使ってみれば、通知音ファイルの問題か、別の問題か切り分けできると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/04 10:04

    ありがとうございます。試してみます!

    キャンセル

  • 2016/05/04 16:12 編集

    サンプルファイルを利用して試してみましたが、
    音は鳴りませんでした。
    パスの問題なのかなと今調べていますが、解決には至っていません。
    他、どのようなことが考えられますでしょうか?


    -(void) application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler {
    [PFPush handlePush:userInfo];
    NSLog(@"didReceiveRemoteNotification Notification");
    pushCount = pushCount + 1;
    UILocalNotification *localNotification = [[UILocalNotification alloc] init];
    localNotification.fireDate = [NSDate date];
    localNotification.timeZone = [NSTimeZone localTimeZone];
    localNotification.applicationIconBadgeNumber = pushCount;
    localNotification.soundName = @"out.caf";
    [application scheduleLocalNotification:localNotification];
    [application setApplicationIconBadgeNumber:pushCount];

    }

    - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
    NSLog(@"didReceiveLocalNotification Notification");
    NSLog(@"%d",notification.applicationIconBadgeNumber);

    [application setApplicationIconBadgeNumber:pushCount];
    }

    キャンセル

  • 2016/05/05 08:09 編集

    提示されたコードをコピペ(PFPushはたぶんAmazonSNSのクラスだと思うのでその処理は削除)して、回答で紹介した通知音ファイルをダウンロードして、私の環境で実行してみたら、変更された通知音がちゃんと鳴りました。

    念のため確認したいのですが、アプリがフォアグラウンドにいる時に通知が来ても通知音は鳴らないことは認識していますか?
    アプリを起動したら、ホームボタンを押してアプリがバックグラウンドにいる状態でプッシュ通知テストしていますか?
    (フォアグラウンドで通知を受けた場合は、デフォルトの通知音が鳴るのではなく、通知音自体が鳴りません。また、通知メッセージも表示されません。)

    また、提示されたコードはリモートプッシュ通知でバックグラウンドフェッチを行い、バックグラウンドフェッチ中にローカル通知を行うコードだと認識しましたが、バックグラウンドフェッチ処理自体は正しくできるようになっていますか?(リモートプッシュ通知を受けて、バックグラウンド状態でdidReceiveRemoteNotificationが呼び出されるよう作られていますか?)

    ただ、そもそもは単純にリモートプッシュ通知で通知音を変更したかっただけなのに、リモートプッシュ通知とバックグラウンドフェッチとローカル通知を組み合わせてテストするという余計複雑で難しい状況に自分で自分を陥れているだけのようにも思えます。

    通知音ファイルがちゃんと変更できるかどうかテストするなら、まずはKenterouさんがアドバイスされたような基本的なローカル通知のコードを実行して、ちゃんと変更した通知音が鳴るかどうかを確かめてみるところから始めることをお勧めします。

    キャンセル

  • 2016/05/05 16:47

    ありがとうございます。
    >単純にリモートプッシュ通知で通知音を変更したかっただけなのに、リモートプッシュ通知とバックグラウンドフェッチとローカル通知を組み合わせてテストするという余計複雑で難しい状況
    こちらでした。
    一つ一つ手順を追って確認し、そもそも
    サーバサイドの実装に問題があることを確認できました。
    迷走しておかしな状態にした上での質問、ご迷惑をお掛けしました。
    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.96%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る