Econaな開発

iOS/Mac/Objective-C プログラミングについて色々と

iOSのPush通知処理

iOSへプッシュ通知の情報は認証鍵を作ったり、鯖側の処理だったりが多いのでiPhoneに通知が送られてきた後の処理についてかこうかと思います。

認証鍵の開発環境、本番環境もDeveloperCenterのUI変更等でちょっとわかりづらい部分が増えてきたんで時間があればそっちも後日まとめます。

ひとまず、認証鍵の作成等はこちらのブログを参考にしてください。
phpでiphoneのpush通知&APNS鍵作成
Push Notificationの実装方法

今回はデバイストークンの取得が終了し、サーバからのPush通知が送られてきている前提で話を進めます。

やりたい事はプッシュ通知からアプリに入った場合
・ロック画面でのプッシュ通知スライドによるアプリの起動後の処理
・起動中プッシュ通知タップでのアプリ起動後の処理
等のSNSアプリでよくある、プッシュ起動後の画面遷移とかホップアップ表示の方法です。


プッシュ通知を受け取った時の処理は、2通りあり、
1. アプリがバックグラウンドで起動していなく、プッシュ通知から起動する場合
2. アプリが既にバックグラウンドで起動していてプッシュ通知を受け取った場合

1の場合は

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

2の場合

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {}

が呼ばれます。

プッシュ通知内のメッセージの取り出し方もそれぞれ異なっており、1の場合

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
    NSDictionary *info = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    if (info != nil) 
    {
        //ここに処理
    }
}

2の場合

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    NSDictionary *info = userInfo;
    if (application.applicationState == UIApplicationStateActive)
    {
        //アプリが起動中にPush通知が来た場合

    }
    else if (application.applicationState == UIApplicationStateInactive)
    {
        //アプリがバックグラウンドで起動していて、Push通知から起動する場合

    }
}

となります。
NSDictionaryのinfoの中に鯖側で指定した情報が入っていますんでプッシュ通知の内容等を使用する場合はこのデータを取り出して使用します。

後は、if文の中でNSNotificationなり、メソッドを呼び出すなりして画面遷移等を行って処理をします。

注意しないといけない点は、
1. アプリがバックグラウンドで起動していなく、プッシュ通知から起動する場合
の場合、if分の中に画面遷移のコードを書いてしまうと動作しません。
returnがかえるまではまだアプリの画面は生成されていないため、プッシュ通知からのアプリ起動を行い画面遷移を行うのでしたら、performSelector等を使用して少し処理を遅らせてから実行してください。

実際にプッシュ通知を送らないと動作検証はできませんのでサンプルコード等はなしです。

コード等を使用して書くブログは初めてなのでぐだぐだですがこれから慣れて行きますのでよろしくお願いします。