iOS8とiOS7にプッシュ通知を送る

iOS8では、プッシュ通知から直接返信するなどのアクションが出来るようになりましたが、
それに伴って通知の仕様も大きく変更されました。

この記事では基本的な手順とパラメータの変更点について簡単にまとめています。

プッシュ通知の登録手順の変更

上で述べた通知の機能拡張に伴い、アクションのない(=iOS7以前と同様の)プッシュ通知を行う場合でも実装方法が変わりました。
具体的には、これまでプッシュ通知の登録時に使用していたregisterForRemoteNotificationTypes:メソッドが非推奨になり、
registerUserNotificationSettings:メソッドとregisterForRemoteNotificationsメソッドを使う形になりました。

メソッド名だけ並べても分かりにくいので実際のコードで示すと

iOS7以前ではこうだったのが…

[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];

iOS8からはこうなりました。

UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound;UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; [application registerUserNotificationSettings:settings];[application registerForRemoteNotifications];

つまり、

iOS8のプッシュ通知登録は

  1. UiUserNotificationSettingクラスのインスタンスに通知の設定を行い
  2. その設定をアプリに登録し
  3. アプリにプッシュ通知の登録を行う

という形になっています。
(今回は説明を省略しましたが、UiUserNotificationSettingクラスの設定を変えることで、プッシュ通知からさまざまなアクションを実行可能にできます。)

また、通知の種類(バッジ、アラートなど)の許可設定パラメータについても変更がなされているのですが、
パッと見では気づきにくい(というより自分が気づけなかっただけですが…)変更点なので注意が必要です。
(これについては後述します。)

もちろん、新しいメソッドはiOS7以前では使えないので、
iOS8・iOS7のそれぞれのデバイスに対してプッシュ通知を行う場合は以下のような処理になります。

// OSのバージョンを取得CGFloat currentVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; if (currentVersion >= 8.0) { // iOS 8 以降の処理 // User Notificationの種類(バッヂ、アラート、サウンド)UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound; // User Notificationの設定を登録UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];[application registerUserNotificationSettings:settings]; // Remote Notificationの設定を登録[application registerForRemoteNotifications]; else { // iOS 7 以前の処理 // Remote Notificationの種類(バッヂ、アラート、サウンド)UIRemoteNotificationType types = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound; // Remote Notificationの設定を登録[application registerForRemoteNotificationTypes:types]; }

通知の種類を示すパラメータの変更

バッヂやアラートなど、通知の種類の設定方法は、大きな変更はありません。
ですが、iOS7以前ではUIRemoteNotificationTypeBadgeなどを使っていましたが、
iOS8移行ではUIUserNotificationTypeBadgeなどを使って指定するように変更されました。

とはいえ、iOS8でもUIRemote~のほうも使用できますし、指し示す値も変更はないので、動きはするのですが、それゆえに変更に気づくのに時間がかかりました。

※正確には、UIUser~のパラメータにはiOS7以前にあったUIRemoteNotificationTypeNewsstandContentAvailabilityに相当するものはなくなっているようです

通知許可設定を参照するプロパティの変更

通知の種類を示すパラメータがUIRemote~からUIUser~に変わったのと同様に、
デバイス側の通知許可設定を参照するプロパティも変更になりました。

iOS7以前ではenabledRemoteNotificationTypesプロパティで参照していたものが、
iOS8からはisRegisteredForRemoteNotificationsプロパティで参照するようになりました。

なので、iOS8/iOS7のそれぞれにおいて通知許可設定を参照する場合は以下のような処理になります。

// アプリの Remote Notification 許可設定UIRemoteNotificationType types = UIRemoteNotificationTypeNone; // OSのバージョンによって、許可設定の取得先が異なるif ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) { // iOS 8 以降types = [application isRegisteredForRemoteNotifications]; else { // iOS 7 以前types = [application enabledRemoteNotificationTypes];

Related Post

Parse.comを使ったiOSデバイスへのプッシュ通知[ターゲッティング編]Parse.comを使ったiOSデバイスへのプッシュ通知[ターゲッティング編]

前回、Parseを使ったiOSデバイス向けのプッシュ通知を行う方法をご紹介しました。今回はプッシュ通知先の絞り込みについて、無料版でも利用可能なChannelというパラメータを使用した方法をご紹介します。 大まかには、以下のような流れで行います。 デバイスにChannelの情報をひもづける Channelを指定してプッシュ通知を送る デバイスにChannelの情報をひもづける 次のメソッドを使って、デバイス側からParse(サーバ)側にChannel情報を登録できます。 NSString *channelName = @"hogehoge";   //登録するChannel名[PFPush

dotFes 2012 SENDAIに参加してきましたdotFes 2012 SENDAIに参加してきました

これまで写心機(ver.1、ver.2)で、2度コラボレーションしてきたワンパク(1PAC Inc.)さんからお誘いあって、dotFes 2012 SENDAIに3度目のコラボレーションとなるデジタルインスタレーションを出展してきました! 今回のインスタレーションは、dotFesに合わせて新しく企画し造ったのですが、アイデアのスタートとしては、「Kinectを使わないインスタレーションにする」「たくさんの余ったデバイスを使う」という縛りでした。両社が短い開発期間と本業の合間をぬって、たくさんのアイデア出しと熱い議論を重ねました。そして完成したのが 「device organized table

iPhoneでHTML5のaudio要素を使うときに気をつけたいことiPhoneでHTML5のaudio要素を使うときに気をつけたいこと

HTML5ではaudio要素が追加され、外部プラグインを使わずブラウザで音を扱えるようになりました。そこで、デモを作ろうとしたのですが、ハマったポイントがいくつかあったので紹介します。検証環境はPC:Safari5.0.5(WIN)、iPhone:iOS4.3.2のMobile Safariです。 loop属性が効かない audio要素ではloop属性を付けることで、繰り返し再生が可能です。PCでは動作しますが、iPhoneではこれがうまく動作せず、1回再生されて停止してしまいました。onendedを使い、最後まで再生したらもう一度再生させれば対処できます。 <audio src=”audio.mp3″ preload=”auto” onended=”this.play()”