べすとえふぉーと

プログラミング等のノート 

PushNotificationの試し方

 

 

三ヶ月前の古いメモを書き起こしてるんで不正確かも

わからなかったり引っかかったりしたらおググりになって下さい。

 

[1]iOS DevのOverviewを開く

https://developer.apple.com/ios/manage/overview/index.action

 

[2]App IDsを開く
https://developer.apple.com/ios/manage/bundles/index.action

 

[3]CreateApp IDを開いてIDを作成する
https://developer.apple.com/ios/manage/bundles/add.action
例:
Description "pushtest"
Bundle Identifier "jp.co.hoge.pushtest"

 

[4]作成したIDの設定

作成したIDのConrfigureリンクに飛ぶ
Enable for Apple Push Notification serviceをチェック
Development Push SSL CertificateのConfigureをクリック

 

[5]証明書作成
キーチェーン起動→証明アシスタント→認証局に証明書を要求
ディスクに保存をチェック→続ける→保存

 

[6]証明書アップロード
ブラウザに戻ってContinue
証明書を選択してGenerate
認証されたらContinue
DownloadしてDoneで閉じる 
Enabledになっていることを確認

 

[7]証明書書き出し
ダウンロードした証明書をダブルクリックして保存
キーチェーン左メニューの「自分の証明書」内Push Servicesを選択
ファイル→書き出す(p12)→保存 apns-dev-certと入力
キーチェーン画面からApple Development Push Services横の三角を開く
秘密鍵を選択→ファイル→書き出す(p12)→保存(apns-dev-key.p12)

 

[8]pem作成
下記コマンドを実行
openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12
openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem
cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem

 

[9] Provisioning Portalでプロファイルを変更
DevelopmentのプロファイルのApp IDをpushtestに変更してダウンロード
プロジェクトのプロファイルをダウンロードしたものに変更

 

[10]iOS側ソース

受信するNotifyのタイプを登録する
************************************************************************************
- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//省略
[[UIApplication sharedApplication]
registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge|
UIRemoteNotificationTypeSound|
UIRemoteNotificationTypeAlert)];

************************************************************************************

デバイスのトークンを取得
************************************************************************************
-(void)application:(UIApplication *)application 
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSLog(@"deviceToken:%@ " , deviceToken);
}
************************************************************************************

Notifyが来たら呼ばれる
************************************************************************************
- (void)application:(UIApplication *)application 
didReceiveRemoteNotification:(NSDictionary *)userInfo
{
NSLog(@"ReceiveRemoteNotification on foreground: %@", userInfo);
}
************************************************************************************

[11]Rubyスクリプト
作成した.pemファイルと同じディレクトリに作成

************************************************************************************************************
#!/usr/bin/ruby

require 'openssl'
require 'socket'

device = ['*************************************************************']

socket = TCPSocket.new('gateway.sandbox.push.apple.com',2195)

context = OpenSSL::SSL::SSLContext.new('SSLv3')
context.cert = OpenSSL::X509::Certificate.new(File.read('apns-dev.pem'))
context.key = OpenSSL::PKey::RSA.new(File.read('apns-dev-key-noenc.pem'))

ssl = OpenSSL::SSL::SSLSocket.new(socket, context)
ssl.connect

payload = <<-EOS
{
"aps":{
"alert":"New Message!",
"badge":1,
"sound":"default"
}
}
EOS
(message = []) << ['0'].pack('H') << [32].pack('n') << device.pack('H*') << [payload.size].pack('n') << payload


ssl.write(message.join(''))
ssl.close
socket.close
************************************************************************************************************