DRYな備忘録

Don't Repeat Yourself.

【iOS】Push通知の実装(クライアント編その1)

最終ゴール

  • ApplePushNotificationを使ってサーバからクライアントにプッシュ通知を送りたい

今回のゴール

  1. クライアント側でユーザにプッシュ通知の許可をもらうダイアログを出す
  2. クライアントを一意に決定するトークンを取得する

f:id:otiai10:20140801003940j:plain

記録

とりま資料を見る

-(void)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)options {
    UIRemoteNotificationType myTypes = UIRemoteNotificationTypeSound |
    UIRemoteNotificationTypeBadge;
    [application registerForRemoteNotificationTypes:myTypes];
}
  • UIApplicationのprivateなメソッドdidFinishLaunchingWithOptionsというものがあるっぽい
  • 名前的に、アプリの起動が終わった瞬間に呼ばれるっぽい?
  • Optionsって何やねん感ございますね

_人人人人人人人人人人人人人人人人人人人人人人_
> そもそも、ViewControllerしか触ったこと無い <
 ̄^ Y ^ Y ^ Y ^ Y ^ Y ^ Y ^ Y ^ Y ^ Y ^ Y ^ Y ^ Y ^  ̄

UIApplication didFinishLaunching(以下略)を実装

どこにあんのこれ

% cd ~/proj/iOS/iApnSample
% rak didFinishLaunchingWithOptions
iApnSample/IHogeAppDelegate.m
  13|- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
%

把握。

こんな感じで書いた

f:id:otiai10:20140731222521j:plain

ダイアログ出ないでござる

とりあえずRunするも

f:id:otiai10:20140731222747j:plain

ログ出てるし通ってると思うんだけどな。

あー把握。ドキュメントもちゃんと読み進めると「callback定義してね」と書いてあるので

ということでdidFinishLaunchingWithOptionsのすぐ下にこれを書いた

f:id:otiai10:20140731223602j:plain

満を持して再びRun!

失敗するがな...

右下で失敗してることがわかる

f:id:otiai10:20140731223830j:plain

こういうときは落ち着いてエラーメッセージを読むに限る

2014-07-31 22:37:47.630 ApnSample[43565:60b] Error Domain=NSCocoaErrorDomain Code=3010 "remote notifications are not supported in the simulator" UserInfo=0x8d61560 {NSLocalizedDescription=remote notifications are not supported in the simulator}

remote notifications are not supported in the simulator

シミュレータではリモート通知サポートしてねえょ馬鹿かおととい来やがれ」とのこと。ヒドイ。そこまで言わなくてもいいじゃない...。

まあ確かに、ここで取れるはずのトークンはデバイスのユニークな識別子なはずだから、シミュレータで取れるはず無いか。

実機でやりゃあいいんでしょ

わかりましたよやりますよやりゃいいんでしょ、ということでビルドターゲットを

f:id:otiai10:20140731232203j:plain

otiai10's iPhoneにして、再びRun

Appの有効な“aps-environment”エンタイトルメント文字列が見つかりません

f:id:otiai10:20140731232419j:plain

ハァ?しばくぞ?ん?

なるほど

developer.apple.comでやること

  1. Push Notificationを有効にしたいApplication ID をつくる
  2. 上記Application IDに向けたProvisioning Profile をつくる

Xcodeでやること

  1. 設定のinfoでBundle Identifierを明記する
    • f:id:otiai10:20140801003400j:plain

  2. 設定のBuild SettingsのCode Settingsで、利用するProvisioning Profileを明示する
    • f:id:otiai10:20140801003630j:plain

これでどや!?

実機に向けてRunする

f:id:otiai10:20140801003940j:plain

よしきた![OK]を選択すると...

f:id:otiai10:20140801004432j:plain

トークン取れてる感ある

雑感

developer.apple.comとかitunesconnect.apple.comとかよく分からなくて苦手意識あったけど、徹底的に知ってる人に聞いて、自分でもたくさん触れて、とりあえず慣れていけば、どうにかならんこともないな、という印象。

DRYな備忘録