iOSのPUSH通知実装を行う(iOSネイティブその1)
前回はPush Notificationの有効化と、証明書の作成を行ったので、今回はiOS側のコーディングを行います。
基本的なことは、Appleの公式ドキュメント を見ましょう。
リスト 2-3あたりです。
今回の差分はこのへんです。
手順
まず、どのようなPUSH通知を利用するかを指定し、登録プロセスの開始を依頼します。
コードとしては、AppDelegateの application:didFinishLaunchingWithOptions: にて、 registerForRemoteNotificationTypes: を実行します。
今回は、バッジ(Home画面のアプリアイコンに数字を付ける)・サウンド・アラート(文字列を表示する)の全てを指定しています。
不要なものがあれば、省くべきかと思います。(あとで、やっぱり必要になった。とかが無いのであれば)
// PUSH通知の設定
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge|
UIRemoteNotificationTypeSound|
UIRemoteNotificationTypeAlert)];
次に、デバイストークンを取得するために application:didRegisterForRemoteNotificationsWithDeviceToken: を実装します。
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken { NSMutableString *tokenId = [[NSMutableString alloc] initWithString:[NSString stringWithFormat:@"%@",devToken]]; // TODO 変換が必要? NSLog(@"deviceToken: %@", tokenId); }
引数で与えられた、 devToken がデバイストークンと呼ばれているものです。
ただし、NSData * 型で与えられるので、サーバに送信する際などには文字列とした方が便利だと思います。
今回は一旦、NSMutableString * 型に変換して、ログ出力を行います。
しかし、エラー
application:didRegisterForRemoteNotificationsWithDeviceToken: メソッドが実行されず、
Errorinregistration:Error Domain=NSCocoaErrorDomain Code=3000 "Appの有効な“aps-environment”エンタイトルメント文字列が見つかりません" UserInfo=0x17daec40 {NSLocalizedDescription=Appの有効な“aps-environment”エンタイトルメント文字列が見つかりません}
がログに出力されました。
このサイト が見つかったので、プロビジョニングプロファイルを再生成することにしました。
おそらく、Xcode上で「Fix issue」を押してしまった後に、Identifier?を変更したためだと思われます。
順番が違っていたら、不要な手順かも。
プロビジョニングプロファイルの生成手順
iOS Dev Centerから、「Certificates, Identifiers & Profiles」を選択し、「Provisioning Profiles」を選択しました。
下記の画面で、「+」のアイコンをクリックします。
今回は開発用のプロビジョニングプロファイルを作成するので、「Development」の「iOS App Development」を選択します。 「Continue」をクリックします。
作成対象としたいApp IDを選択し、「Continue」をクリックします。
含めたい証明書を選択し、「Continue」をクリックします。
含めたい端末を選択し、「Continue」をクリックします。
(端末が増えると、ここもやり直しになってしまうのが、めんどいところですね)
このプロファイルの名前を入力します。
今回は、Development用なので、末尾に「Development」を付けました。
「Generate」をクリックします。
プロビジョニングプロファイルが作成されましたので、「Download」をクリックします。 ダウンロードが完了したら、「Done」をクリックします。
「プロファイルの名前.mobileprovision」をダブルクリックすると、Xcodeに設定されます。
あとは、プロジェクトの「Build Settings」の「Code Signing」の「Provisioning Profile」を「プロファイルの名前」に変更します。
この状態で、再度実機で実行すると、アラートが表示され、ログにデバイストークンが表示されました。
ただし、
deviceToken:
という形で表示されるので、"<", ">", " "の文字が余計なような気がします。
他の人のコードを見ていると、省いているようですが、そこら辺はまた今度やろうと思います。