2011/11/09

PushNotificationのテスト

今日は、勉強をしてみました。
今度作りたいと思ってるアプリのために、必要な機能のテスト。
サーバーサイドが経験不足なため、なかなか手を出してなかったPushNotificationです。

何のことかわかりにくいと思いますが、あれです。Twitterとかにメッセージが届いたら、iPhoneに通知が届くあれです。その機能の実装です。


詳しいことは、資料のリンク先を書いておきますので、そちらを参照してもらうカタチで書きます。いずれ、作ったアプリ(システム)は、オープンソースで公開するつもりなので、そのときは詳細に解説します。

僕が読んだ資料は以下の通り。
これは、日本語で書いてあるので結構いいです。ざっと目を通すことで、どういうことが行われてるのか理解できます。

次は、個人のブログ。
こちらも割と丁寧にかいてあり、たすかりました。

PHPのコードサンプルはこちらから。

OSXでPHPを動かすための設定はこちらを参考に。

やったことを列記します。
・アプリに組み込む証明書を発行する作業(AppleのDevサイトで設定とか)
・PushNotificationを受ける機能をつけたサンプルアプリを実装
・MacBookAirでPHPを動かせるようにする作業
・PHPでiPhoneへ通知を発信するサンプルプログラムの実装(コピペして修正)

で、今のところサーバー側は、超未完成通知発信だけバージョンなので、手動でTokenを設定します。
1. 作ったiOSアプリを実機で走らせる。
2. NSLogで表示したデバイスのトークンをコピー
3. PHPのプログラム中にペースト
4. 証明書から書き出したpemファイルをPHPと同じ階層に入れる

そうすると、こうなりました。


これ、テスト用とはいえグラフィックをざっくり作りました。
testを変えて、本番でも使うつもり。
ネットで見つけた絵をざっくりトレースしただけ。。

超ダサイですが、ブラウザでphpをたたきます。
すると、

じゃーん。でました。

アプリが落ちてるときでも、
見事に通知表示。ちゃんとiOS5の通知で出ました。

そして、
バッジも。

今日のスタディーはここまで。

この機能を使って、「自分が作ったアプリが売れたらベルが鳴るシステム」を作ります。
参考にしたのは、この映画。
「ミドルメン」アダルト業界でネットを変えた男たち

5 件のコメント:

  1. 初めまして。
    現在、PushNotificationの実装でつまづいておりまして、
    色々検索していたら、このページに辿り着きました。

    もしよろしければ、テストで作られたPushNotificationのプロジェクトを、
    githubなどへ公開して頂けると、ものすごく嬉しいです。。

    急なコメントで申し訳ございませんが、よろしくお願い致します!!

    返信削除
    返信
    1. このコメントは投稿者によって削除されました。

      削除
    2. 探してみましたが、このときのプロジェクトファイルは残ってませんでした。
      何が分からないか教えてもらえたらと思います。

      削除
  2. http://iphone.longearth.net/2009/09/01/%E3%80%90iphone%E3%80%91push-notification%E3%81%AE%E5%AE%9F%E8%A3%85%E6%96%B9%E6%B3%95/

    上記のサイトを参考に、
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {

    //デバイストークン認証通知 認証されるとapplication: didRegisterForRemoteNotificationsWithDeviceToken:が呼ばれる
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
    (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)];

    }

    - (void)application:(UIApplication*)app
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)devToken{
    NSLog(@"deviceToken: %@", devToken);
    //self.devToken;                   <=ここでエラーがでるのでコメントアウトしてみました。。
    [self sendProviderDeviceToken:devToken];
    }

    - (void)application:(UIApplication*)app
    didFailToRegisterForRemoteNotificationsWithError:(NSError*)err{
    NSLog(@"Errorinregistration.Error:%@",err);
    }

    - (void)sendProviderDeviceToken:(NSData *)token {
    NSMutableData *data = [NSMutableData data];
    [data appendData:[@"device=" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:token];

    NSMutableURLRequest *request;

    request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"ホスト名"]];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:data];
    [NSURLConnection connectionWithRequest:request delegate:self];


    }

    上記のホスト名にデバイストークン保存用のサーバーのURLを書きます。

    以上の書き方でdevicetokenをNSLogに書き出せないのは、やはりappleへの登録がうまくいっていないということでしょうか??

    返信削除
  3. NSLog(@"deviceToken: %@", devToken); ではなにが表示されるのですか?

    返信削除