GeliPayを支える技術
如何にして我々は便所から人を追放したか

その理論と実践
自己紹介
name: 西山勇世
twitter: @yuseinishiyama

blog: http://yuseinishiyama.com
•

iOSアプリケーション開発者。

•

Findaysという動画編集アプリを開発しています...
GeliPayとは

という「クソ」アプリ。Open Hack Day Japan 2
で明和電機賞という意味深な賞をいただきました。
勝因

•

審査員のカラーにあわせ
ること。

•

以上。
GeliPayを支える技術
ありません
•

ただのジオフェンシングだし…

•

昨年末ぐらいに流行ってたし…

•

何を今更とバカにされるの怖いし辛い…

•

傷つきたくないヨ(>_<)
頑張ります
やったこと
•

iBeaconの検出。

•

iBeacon領域内の滞在時間の計測。

•

サーバーサイド(Heroku+Rails)との通信。

•

音声合成。

•

PayPalでの課金処理。

•

次々出てくる食べ物の処理(ご...
バックグラウンド処理
Capabilities
音声再生(バックグラウンド)
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOption...
Local Notification
UILocalNotification *localNotification =
[[UILocalNotification alloc] init];
[localNotification setAlert...
注意
•

フォアグラウンドでLocal Notificationを通知し
ても無視される。

•

フォアグラウンド時のLocal Notificationは

AppDelegate内のコールバックで受け取り、そ
こで処理する。



- (v...
Estimote SDK
初期化
- (void)setupBeacon
{
_beaconManager = [[ESTBeaconManager alloc] init];
[_beaconManager setDelegate:self];
[_beaconMan...
リージョン監視
余裕、余裕…
!

[_beaconManager
 
         startMonitoringForRegion:_region];
!

-(void)beaconManager:(ESTBeaconManager ...
問題
•

結構遠くても検出されてしまう。

•

なかなか領域外を検出しない。数十メートル離れ
ないといけない。

•

つまり、トイレからだいぶ離れていても、トイレ
にいることにされて恥ずかしい音声が流れるので
ヤバイ。

•

もはや、単...
レンジング
•

リージョン内にいる場合、毎秒検出したビーコン
の配列を通知。おおまかな距離も判定できる。

•

跨いだ時だけ検出されるリージョン監視とは異
なり、何度も呼ばれるので冪等でない処理はセ
マフォ的な何かを作るなどして対応する必要...
[_beaconManager startRangingBeaconsInRegion:_region];
!
- (void)beaconManager:(ESTBeaconManager *)manager
didRangeBeacons:...
注意
監視開始時に領域内にいる場合はコールバックが呼ば
れない。こちらから問い合わせる必要がある。
!

[_beaconManager requestStateForRegion:_region];
!

-(void)beaconManag...
その他
AVSpeechSynthesizer
AVSpeechSynthesizer* speechSynthesizer =
[[AVSpeechSynthesizer alloc] init];
NSString* speakingText = ...
PayPal iOS SDK
-(void)presentPaymentViewController
{
PayPalPayment *payment = [[PayPalPayment alloc] init];
payment.amount...
Webサービス稼働中
•

http://gelipay.herokuapp.com/

•

私が、私のiBeaconの近くにいるかどうかを

一目で確認できます。話題の可視化。

•

Let s アクセス!!!┗(^o^ )┓三┗(^o^...
ありがとうございました

ソースコード: https://github.com/iBencon/GeliPayClient
Upcoming SlideShare
Loading in …5
×

GeliPayを支える技術

1,395 views

Published on

Open Hack Day Japan 2で開発した、GeliPayの解説(クライアント側)。

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,395
On SlideShare
0
From Embeds
0
Number of Embeds
61
Actions
Shares
0
Downloads
4
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

GeliPayを支える技術

  1. 1. GeliPayを支える技術 如何にして我々は便所から人を追放したか
 その理論と実践
  2. 2. 自己紹介 name: 西山勇世 twitter: @yuseinishiyama
 blog: http://yuseinishiyama.com • iOSアプリケーション開発者。 • Findaysという動画編集アプリを開発しています。 • Unityも少々。ARとか。 • Emacs!Emacs!Emacs! • (Lisp(LispLispLispLisp)) 神聖なるRMS
  3. 3. GeliPayとは という「クソ」アプリ。Open Hack Day Japan 2 で明和電機賞という意味深な賞をいただきました。
  4. 4. 勝因 • 審査員のカラーにあわせ ること。 • 以上。
  5. 5. GeliPayを支える技術
  6. 6. ありません • ただのジオフェンシングだし… • 昨年末ぐらいに流行ってたし… • 何を今更とバカにされるの怖いし辛い… • 傷つきたくないヨ(>_<)
  7. 7. 頑張ります
  8. 8. やったこと • iBeaconの検出。 • iBeacon領域内の滞在時間の計測。 • サーバーサイド(Heroku+Rails)との通信。 • 音声合成。 • PayPalでの課金処理。 • 次々出てくる食べ物の処理(ご馳走様でした)。
  9. 9. バックグラウンド処理
  10. 10. Capabilities
  11. 11. 音声再生(バックグラウンド) - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayback   error:nil]; [audioSession setActive:YES error:nil]; . . . }
  12. 12. Local Notification UILocalNotification *localNotification = [[UILocalNotification alloc] init]; [localNotification setAlertBody:@"hoge"]; [localNotification setSoundName:UILocalNotificationDefaultSoundName]; [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];
  13. 13. 注意 • フォアグラウンドでLocal Notificationを通知し ても無視される。 • フォアグラウンド時のLocal Notificationは
 AppDelegate内のコールバックで受け取り、そ こで処理する。
 
 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
  14. 14. Estimote SDK
  15. 15. 初期化 - (void)setupBeacon { _beaconManager = [[ESTBeaconManager alloc] init]; [_beaconManager setDelegate:self]; [_beaconManager setAvoidUnknownStateBeacons:YES]; _region = [[ESTBeaconRegion alloc]  initWithProximityUUID:ESTIMOTE_PROXIMITY_UUID major:kBeaconMajorID minor:kBeaconMinorID identifier:@"jp.co.GeliPayClient.iBencon"]; ! ! ! } [_beaconManager startMonitoringForRegion:_region]; [_beaconManager startRangingBeaconsInRegion:_region]; [_beaconManager requestStateForRegion:_region];
  16. 16. リージョン監視 余裕、余裕… ! [_beaconManager            startMonitoringForRegion:_region]; ! -(void)beaconManager:(ESTBeaconManager *)manager didEnterRegion:(ESTBeaconRegion *)region; ! -(void)beaconManager:(ESTBeaconManager *)manager didExitRegion:(ESTBeaconRegion *)region;
  17. 17. 問題 • 結構遠くても検出されてしまう。 • なかなか領域外を検出しない。数十メートル離れ ないといけない。 • つまり、トイレからだいぶ離れていても、トイレ にいることにされて恥ずかしい音声が流れるので ヤバイ。 • もはや、単なるテロでは。
  18. 18. レンジング • リージョン内にいる場合、毎秒検出したビーコン の配列を通知。おおまかな距離も判定できる。 • 跨いだ時だけ検出されるリージョン監視とは異 なり、何度も呼ばれるので冪等でない処理はセ マフォ的な何かを作るなどして対応する必要が ある。
  19. 19. [_beaconManager startRangingBeaconsInRegion:_region]; ! - (void)beaconManager:(ESTBeaconManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(ESTBeaconRegion *)region { if([beacons count] > 0) { ESTBeacon *selectedBeacon = beacons[0]; switch (selectedBeacon.proximity) { case CLProximityNear: [self onEnterRegion:region]; break; case CLProximityImmediate: [self onEnterRegion:region]; break; default: [self onExitRegion]; break; } } }
  20. 20. 注意 監視開始時に領域内にいる場合はコールバックが呼ば れない。こちらから問い合わせる必要がある。 ! [_beaconManager requestStateForRegion:_region]; ! -(void)beaconManager:(ESTBeaconManager *)manager didDetermineState:(CLRegionState)state forRegion:(ESTBeaconRegion *)region;
  21. 21. その他
  22. 22. AVSpeechSynthesizer AVSpeechSynthesizer* speechSynthesizer = [[AVSpeechSynthesizer alloc] init]; NSString* speakingText = @"私のトイレは長いです。" AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:speakingText]; [utterance setRate:0.3]; [speechSynthesizer speakUtterance:utterance];
  23. 23. PayPal iOS SDK -(void)presentPaymentViewController { PayPalPayment *payment = [[PayPalPayment alloc] init]; payment.amount = [[NSDecimalNumber alloc] initWithString:@"39.95"]; payment.currencyCode = @"USD"; payment.shortDescription = @"下痢止め"; if (!payment.processable) { NSLog(@"This payment would not be processable."); } // サンドボックスモード [PayPalPaymentViewController setEnvironment:PayPalEnvironmentNoNetwork]; NSString *aPayerId = @"hogehoge42@example.com"; PayPalPaymentViewController *paymentViewController; paymentViewController = [[PayPalPaymentViewController alloc] initWithClientId:kPayPalClientID    receiverEmail:kReceiverEmail payerId:aPayerId                        payment:payment delegate:[GPCPaymentManager sharedInstance]]; [self presentViewController:paymentViewController animated:YES completion:nil]; }
  24. 24. Webサービス稼働中 • http://gelipay.herokuapp.com/ • 私が、私のiBeaconの近くにいるかどうかを
 一目で確認できます。話題の可視化。 • Let s アクセス!!!┗(^o^ )┓三┗(^o^ )┓三
  25. 25. ありがとうございました ソースコード: https://github.com/iBencon/GeliPayClient

×