Heroku+RailsでiOSに簡単プッシュ #ハツカソン

Heroku+RailsでiOSに簡単プッシュ #ハツカソン以前から試してみたかったRailsからのPushを実行してみました。RailsにAPIを書いてHerokuにおいておいて、iOSからAPI叩くと、指定した宛先にPushが送れるというシンプルなものです。Rails学習の一環としてやってみました。

利用したもの

  • Ruby: 2.1.1
  • Rails: 4.1.4
  • grape: 0.7.0
  • Houston: 2.1.0
  • Heroku
  • iOS側はObjective-C。Swiftには脳内変換で対応して下さい。

参考にしたページ

Rails側で書いたコード

require 'houston'

class API < Grape::API
  prefix "api"
  version 'v1', :using => :path
  format :json

  resource "push" do

    params do 
      requires :device_token, type: String
    end
    post do
      APN = Houston::Client.development
      APN.certificate = File.read("/path/to/your.pem")
      # An example of the token sent back when a device registers for notifications
      token = params[: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, indicate available Newsstand content, or pass along arbitrary data.
      notification.badge = 57
      notification.sound = "sosumi.aiff"
      notification.content_available = true
      notification.custom_data = {foo: "bar"}

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

  end
end

iOS側で書いたコード

簡易的にNSURLSessionで書いてみました。

Push依頼部分

NSData *data = [@"device_token=to_device_token
                dataUsingEncoding:NSUTF8StringEncoding];

NSURL *url = [NSURL URLWithString:@"http://your-app.herokuapp.com/api/v1/push/"];
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
request.HTTPBody = data;

NSURLSessionDataTask * task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    if (error) {
        NSLog(@"error: %@", error.localizedDescription);
        return;
    }
}];
[task resume];
}

Push設定&受け取り部分

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
    
    return YES;
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSLog(@"application:didRegisterForRemoteNotificationsWithDeviceToken: %@", deviceToken);
    
    // Register the device token with a webservice
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
    NSLog(@"Error: %@", error);
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    NSLog(@"Notification: %@",userInfo);
}

ほとんど、Houstonのサンプルコードをコピっただけです。とりあえず、API叩かれたらPushというところまで行きましたが、これにDB組み合わせることで色々自由にPushが操れそうです。

その他

Pocket
LINEで送る

You may also like...