[iOS8以降]Push通知の実装とテスト(swift)

# 概要

1. SwiftでPush通知受信処理を実装する
2. [houston](https://github.com/nomad/houston)を使って、Push通知を送信する

# 参考記事

* [iOSでプッシュ通知を実装する方法の超詳細まとめ(前編)](http://www.lancork.net/2013/08/how-to-ios-push-first/)
* [iOSでプッシュ通知を実装する方法の超詳細まとめ(後編)](http://www.lancork.net/2013/08/how-to-ios-push-second/)
* [iOS8のRemote Notificationの登録メソッドについて](http://qiita.com/70_10/items/4f56e09ba64969d922e1)
* [iOSでpush通知を受け取った後の起動とホーム画面のアイコンをタップした後の起動について](http://rikei-webmemo.hateblo.jp/entry/2014/04/16/112914)

# SwiftでPush通知受信処理を実装する

AppDelegate.swift

```AppDelegate.swift
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.

    // バッジ、サウンド、アラートをリモート通知対象として登録する
    let settings = UIUserNotificationSettings(forTypes: [.Badge, .Sound, .Alert], categories: nil)
    UIApplication.sharedApplication().registerForRemoteNotifications()
    UIApplication.sharedApplication().registerUserNotificationSettings(settings)
    
    if let userInfo = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] {
      // アプリが起動していない時にpush通知が届き、push通知から起動した場合
    }
  }

  // Push通知の登録が完了した場合、deviceTokenが返される
  func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData ) {
    print("deviceToken: \(deviceToken.description)")
  }

  // Push通知が利用不可であればerrorが返ってくる
  func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
    NSLog("error: " + "\(error)")
  }

  // Push通知受信時とPush通知をタッチして起動したときに呼ばれる
  func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
    switch application.applicationState {
    case .Inactive:
      // アプリがバックグラウンドにいる状態で、Push通知から起動したとき
      break
    case .Active:
      // アプリ起動時にPush通知を受信したとき
      break
    case .Background:
      // アプリがバックグラウンドにいる状態でPush通知を受信したとき
      break
    }
  }
}
```

# RubyでPush通知を送信する

[houston](https://github.com/nomad/houston)というRubyのライブラリを使って、Push通知を送信します

## Gemのインストール

```
$ gem install rake
$ gem install houston
```

## Rakefileを作成して、push通知用のタスクを作成

server_certificates_sandbox.pemは[iOSでプッシュ通知を実装する方法の超詳細まとめ(前編)](http://www.lancork.net/2013/08/how-to-ios-push-first/)で作成したものです。

```ruby
# Rakefile:

require 'houston'

ROOT = File.expand_path(File.dirname(__FILE__))

task :push_notification do
  # Environment variables are automatically read, or can be overridden by any specified options. You can also
  # conveniently use `Houston::Client.development` or `Houston::Client.production`.
  APN = Houston::Client.development
  APN.certificate = File.read("#{ROOT}/pem/server_certificates_sandbox.pem")
  # An example of the token sent back when a device registers for notifications
  # token = "<ce8be627 2e43e855 16033e24 b4c28922 0eeda487 9c477160 b2545e95 xxxxxxx>"
  token = ENV['DEVICE_TOKEN']

  # Create a notification that alerts a message to the user, plays a sound, and sets the badge on the app
  notification = Houston::Notification.new(device: token)
  notification.alert = "Hello, World!"

  # Notifications can also change the badge count, have a custom sound, have a category identifier, indicate available Newsstand content, or pass along arbitrary data.
  notification.badge = 57
  notification.sound = "sosumi.aiff"
  notification.category = "INVITE_CATEGORY"
  notification.content_available = true
  notification.custom_data = {foo: "bar"}

  # And... sent! That's all it takes.
  APN.push(notification)
end
```

## 実行

```
$ DEVICE_TOKEN=<xxxx> rake push_notification
```

iPhoneに通知が届けば成功です