読者です 読者をやめる 読者になる 読者になる

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」を選択しました。
下記の画面で、「+」のアイコンをクリックします。

f:id:suzaku114:20131001021431p:plain

今回は開発用のプロビジョニングプロファイルを作成するので、「Development」の「iOS App Development」を選択します。 「Continue」をクリックします。

f:id:suzaku114:20131001021424p:plain

作成対象としたいApp IDを選択し、「Continue」をクリックします。

f:id:suzaku114:20131001021417p:plain

含めたい証明書を選択し、「Continue」をクリックします。

f:id:suzaku114:20131001021411p:plain

含めたい端末を選択し、「Continue」をクリックします。
(端末が増えると、ここもやり直しになってしまうのが、めんどいところですね)

f:id:suzaku114:20131001021404p:plain

このプロファイルの名前を入力します。
今回は、Development用なので、末尾に「Development」を付けました。
「Generate」をクリックします。

f:id:suzaku114:20131001021356p:plain

プロビジョニングプロファイルが作成されましたので、「Download」をクリックします。 ダウンロードが完了したら、「Done」をクリックします。

f:id:suzaku114:20131001022422p:plain

「プロファイルの名前.mobileprovision」をダブルクリックすると、Xcodeに設定されます。
あとは、プロジェクトの「Build Settings」の「Code Signing」の「Provisioning Profile」を「プロファイルの名前」に変更します。

f:id:suzaku114:20131001021342p:plain

この状態で、再度実機で実行すると、アラートが表示され、ログにデバイストークンが表示されました。
ただし、

deviceToken: という形で表示されるので、"<", ">", " "の文字が余計なような気がします。
他の人のコードを見ていると、省いているようですが、そこら辺はまた今度やろうと思います。