個人アプリ開発で月収5万円目指す

アプリ個人開発 まるブログ

アプリ開発覚え書き

【Unity】ローカルプッシュ通知を実装する Android & iOS

はじめに

プッシュ通知には
・サーバーを介さないローカルプッシュ
・サーバーを介するリモートプッシュ
があります。

今回はローカルプッシュを実装していきます。

環境

Unityバージョン2020.3.2f1
Mobile Notifications 1.3.2

パッケージをインストール

Unityが用意してくれているパッケージ「Mobile Notifications」を使用します。

取り込み方法
→ウインドウ
→パッケージマネージャー

プッシュ通知 パッケージマネージャー

→パッケージの種類をUnityレジストリに変更(Unityのバージョンによっては名前が違うかもしれません。)
→mobileで検索
→Mobile Notifications
→インストール
プッシュ通知 パッケージマネージャー

設定

設定画面を開いてAndroidiOSの個別のプッシュ通知設定をしていきます。

設定画面は
→編集
→プロジェクト設定
→Mobile Notifications
で見れます。

プッシュ通知

Android設定

Androidの設定は次の3つです。

プッシュ通知

・ReSchedule on Device Restart
 有効:デバイスの再起動後にスケジュールされた通知を保持する。
 無効:スケジュールされた通知はデバイスの再起動後に削除される。

 今回は無効で運用します。


・Use Custom Activity
 有効にすると

ユーザーが通知をタップしたときに開くアクティビティを上書きできます。

 とのことなのですがよくわかりませんね。
 任意の画面を開くということですかね?
 特に使用しないので無効にして運用します。

・Notifications Icons
 通知されたときの画像を登録します。
 登録する画像は2種類あり用途とサイズは以下です。
 追記 ※このサイズで作成する必要はありません。表示されるサイズになります。

 Smallアイコン
  用途:ステータスバーに表示されるアイコン
     ( 透明部分をくりぬいた白い画像が表示されます。) 
  サイズ:48×48

 Largeアイコン
  用途:プッシュ通知欄に表示されるアイコン
  サイズ:192x192



 <アイコン設定方法>
 使用する画像は、プロジェクト内に保存されている必要があります。
 Spritesフォルダなどを作って保存しておいて下さい。  


 そして、取り込んだ画像のインスペクター上で
 「読み込み/書き込み有効」にチェックを入れて適用して下さい。
 ※これをしないとアイコン画像設定時に怒られます。

 

 今回はこのように設定しました。
 アイコンのIdentifierについては、
 コード上でわかりやすくするため次のように設定しています。
 Smallアイコン:ic_stat_notify_small
 Largeアイコン:ic_stat_notify_large

 

iOS設定

iOSの設定は次の3つです。

・Request Authorization on App Launch
 有効:アプリの起動時に承認リクエストウインドウを表示する
 無効:アプリの起動時に承認リクエストウインドウを表示しない

 Androidではプッシュ通知の許可は不要ですが、
 iOSはユーザーの許可がないとプッシュ通知を送ることができません。
 そのため、承認リクエストウインドウを出して
 プッシュ通知を許可するかどうかを選択してもらう必要があります。

 アプリ起動時に承認リクエストウインドウを表示して問題無いので
 今回は有効にして進めます。

 例:承認リクエストウインドウ
 



・Enable Push Notifications
 有効:Xcode上でプッシュ通知機能の宣言を追加する
 無効:Xcode上でプッシュ通知機能の宣言を追加しない

 リモートプッシュをする際には、
 Xcodeでプッシュ通知を使用することを宣言する必要があります。
 ローカルプッシュでは無効にしておきます。

 Xcode上の宣言設定  



・Include Core Location Framework
 特定の場所の範囲に入ったら通知するような時に使用します。
 今回は使用しないのでオフにしておきます。


 公式ドキュメント(翻訳)

iOSNotificationLocationTriggerを使用するには、[ CoreLocationフレームワークを含める]オプションを有効にする必要があります。このオプションは、フレームワークXcodeプロジェクトに追加します。CoreLocation

コード実装

次の2種類のスクリプトを作成して実装していきます。
1.「ローカルプッシュ通知送信クラスのスクリプト
2.「ローカルプッシュ通知の条件を与えて呼び出すスクリプト

1.ローカルプッシュ通知送信クラスのスクリプト作成

「LocalPushNotification」という名前でスクリプトを作成します。

#if UNITY_ANDROID
using Unity.Notifications.Android;
#endif
#if UNITY_IOS
using Unity.Notifications.iOS;
#endif
using System;


// ローカルプッシュ通知送信クラス
public static class LocalPushNotification
{
    
    // Androidで使用するプッシュ通知用のチャンネルを登録する。    
    public static void RegisterChannel(string cannelId, string title, string description)
    {
#if UNITY_ANDROID
        // チャンネルの登録
        var channel = new AndroidNotificationChannel()
        {
            Id = cannelId,
            Name = title,
            Importance = Importance.High,//ドキュメント 重要度を設定するを参照 https://developer.android.com/training/notify-user/channels?hl=ja
            Description = description,
        };
        AndroidNotificationCenter.RegisterNotificationChannel(channel);
#endif
    }




    
    /// 通知をすべてクリアーします。   
    public static void AllClear()
    {
#if UNITY_ANDROID
        // Androidの通知をすべて削除します。
        AndroidNotificationCenter.CancelAllScheduledNotifications();
        AndroidNotificationCenter.CancelAllNotifications();
#endif
#if UNITY_IOS
        // iOSの通知をすべて削除します。
        iOSNotificationCenter.RemoveAllScheduledNotifications();
        iOSNotificationCenter.RemoveAllDeliveredNotifications();
        // バッジを消します。
        iOSNotificationCenter.ApplicationBadge = 0;
#endif
    }




    
    // プッシュ通知を登録します。    
    public static void AddSchedule(string title, string message, int badgeCount, int elapsedTime, string cannelId)
    {
#if UNITY_ANDROID
        SetAndroidNotification(title, message, badgeCount, elapsedTime, cannelId);
#endif
#if UNITY_IOS
        SetIOSNotification(title, message, badgeCount, elapsedTime);
#endif
    }



#if UNITY_IOS
    // 通知を登録(iOS)
    static private void SetIOSNotification(string title, string message, int badgeCount, int elapsedTime)
    {
        // 通知を作成
        iOSNotificationCenter.ScheduleNotification(new iOSNotification()
        {
            //プッシュ通知を個別に取り消しなどをする場合はこのIdentifierを使用します。(未検証)
            Identifier = $"_notification_{badgeCount}",
            Title = title,
            Body = message,
            ShowInForeground = false,
            Badge = badgeCount,
            Trigger = new iOSNotificationTimeIntervalTrigger()
            {
                TimeInterval = new TimeSpan(0, 0, elapsedTime),
                Repeats = false
            }
        });
    }
#endif



#if UNITY_ANDROID
    
    // 通知を登録(Android)   
    static private void SetAndroidNotification(string title, string message, int badgeCount, int elapsedTime, string cannelId)
    {
        // 通知を作成します。
        var notification = new AndroidNotification
        {
            Title = title,
            Text = message,
            Number = badgeCount,

            //Androidのアイコンを設定
            SmallIcon = "ic_stat_notify_small",//どの画像を使用するかアイコンのIdentifierを指定 指定したIdentifierが見つからない場合アプリアイコンになる。
            LargeIcon = "ic_stat_notify_large",//どの画像を使用するかアイコンのIdentifierを指定 指定したIdentifierが見つからない場合アプリアイコンになる。
            FireTime = DateTime.Now.AddSeconds(elapsedTime)
        };

        // 通知を送信します。
        AndroidNotificationCenter.SendNotification(notification, cannelId);
       
    }
#endif
}



コピペで大丈夫です。
Androidのアイコンの指定は下記の部分で行なっています。
・「Androidのアイコン設定で登録したIdentifierの文字列」
・下記の「SmallIcon」または「LargeIcon」に代入する文字列
が異なっているとデフォルトのアイコンが表示されてしまいますので注意して下さい。

 //Androidのアイコンを設定
            SmallIcon = "ic_stat_notify_small",//どの画像を使用するかアイコンのIdentifierを指定 指定したIdentifierが見つからない場合アプリアイコンになる。
            LargeIcon = "ic_stat_notify_large",//どの画像を使用するかアイコンのIdentifierを指定 指定したIdentifierが見つからない場合アプリアイコンになる。

2.ローカルプッシュ通知の条件を与えて呼び出すスクリプト作成

「LocalPushTest」という名前でスクリプトを作成しました。(名前はなんでも良いです。) このコードでは3つのプッシュ通知を登録しています。

using UnityEngine;

public class LocalPushTest : MonoBehaviour
{   
    //Unityが用意した関数(名前は固定)
    //「アプリを開始した時」、「Homeボタンを押した時」、「Backボタンを押した時(ボタンはAndroidのみに存在)」、「OvewViewボタンを押した時(ボタンはAndroidのみに存在)」に実行
    private void OnApplicationFocus()
    {
        SettingPush();//プッシュ通知の設定
    }


    //プッシュ通知の設定
    private void SettingPush()
    {
        // Androidチャンネルの登録
        //LocalPushNotification.RegisterChannel(引数1,引数2,引数3);
        //引数1 Androidで使用するチャンネルID なんでもいい LocalPushNotification.AddSchedule()で使用する
        //引数2 チャンネルの名前 なんでもいい アプリ名でも入れておく
        //引数3 通知の説明 なんでもいい 自分がわかる用に書いておくもの 
        LocalPushNotification.RegisterChannel("channelId", "PushTest", "通知の説明");

        //通知のクリア
        LocalPushNotification.AllClear();

        // プッシュ通知の登録
        //LocalPushNotification.AddSchedule(引数1,引数2,引数3,引数4,引数5);
        //引数1 プッシュ通知のタイトル
        //引数2 通知メッセージ
        //引数3 表示するバッジの数(バッジ数はiOSのみ適用の様子 Androidで数値を入れても問題無い)
        //引数4 何秒後に表示させるか?
        //引数5 Androidで使用するチャンネルID 「Androidチャンネルの登録」で登録したチャンネルIDと合わせておく
        //注意 iOSは45秒経過後からしかプッシュ通知が表示されない        
        LocalPushNotification.AddSchedule("プッシュ通知一つ目", "45秒経過", 1, 45, "channelId");
        LocalPushNotification.AddSchedule("プッシュ通知二つ目", "60秒経過", 2, 60, "channelId");
        LocalPushNotification.AddSchedule("プッシュ通知三つ目", "75秒経過", 3, 75, "channelId");
    }

}


詳しくはコード内に書きましたので、概要だけ書きます。

プッシュ通知の設定関数「SettingPush()」で行っている処理は3つです。
1.Androidのチャンネルの登録 (儀式みたいなものと思っています。)
2.通知のクリア
 (予約されているプッシュ通知やアイコン上に表示されているバッジマークを消します。)
3.プッシュ通知の登録

そして、SettingPush()で設定された処理を
OnApplicationFocus()で呼び出しています。

OnApplicationFocus()の関数はUnityが用意した関数で下記の場合に実行されます。
・アプリを開始した時
・Homeボタンを押した時
・Backボタンを押した時(ボタンはAndroidのみに存在)
・OvewViewボタンを押した時(ボタンはAndroidのみに存在)

詳しくはこちら
qiita.com

SettingPush()の関数をスタート関数で実行するだけでもプッシュ通知は呼ばれますが、
アプリバックグラウンド起動中にプッシュ通知がきてアプリを開いても
プッシュ通知がリセットされません。
また、バッジ設定をしていた場合ずっとバッジのアイコンが残ったままになってしまいます。

3.オブジェクトに割り当ててビルド

空のオブジェクトを作成し「LocalPushTest」のスクリプトを割り当ててビルドして下さい。 f:id:marumaro7:20210711170625p:plain

結果

AndroidiOSにて、 アプリを開いて45秒後、60秒後、75秒後に通知が来ます。

Android
f:id:marumaro7:20210711171009p:plain:w400

iOS
f:id:marumaro7:20210711171054p:plain

おわりに

指定日時に送るときにはこちらが参考になりそうです。

qiita.com

参考

shikaku-sh.hatenablog.com

qiita.com

docs.unity3d.com

grtlab.com

greenkour.hateblo.jp