ROADTO みちログ

ひとのみちのブログ。大阪でiOSアプリの道を歩くフリーランス。

Road to WWDC2015 「前夜祭」

WWDC前夜祭

@taketo1024 さんらの呼びかけで日本人Developerが集う前夜祭が開かれました。
去年は行けなくて残念だったので今年はすぐに参加表明しました。

出発

ホテルロビー集合で出発。
f:id:hitonomichi:20150607183756j:plain

会場は中華料理のFang

着いた着いたと思ったら@k_katsumiさんが。
ひさしぶり〜ってやろうと思ったら、まってましたとばかりにレイバンいじりを受けました。
その勢いたるやw
おかげでだいぶ和みました。

おのおの乾杯スタイルでスタート!

deploygateの安田さんにTシャツもらいました。
普段でも着れるクオリティー!
f:id:hitonomichi:20150607202453j:plain
deploygate.com

自己紹介とかどんな仕事してるとか
こんなことしようと思ってこれを頑張ってるとか
同じ業界で頑張ってる人たちと話せてまたエネルギーもらいました。
楽しかった!

@shu223 さんにアドバイスももらったので緊張して写真撮りました。
f:id:hitonomichi:20150607212354j:plain

会期中になかなか交流しにくいので前もって顔見知りになっておくと
より楽しく円滑に過ごせますね。

幹事の方々、ありがとうございました。
 
 
関連記事はこちら。
WWDC2015 カテゴリーの記事一覧 - ROADTO みちログ
 

Road to WWDC2015 「レジストレーション」

レジストレーション

ホテルから早速レジストレーションへ。

いわゆる受付で、WWDC初日のKeynoteを生で見るためには
前日までに済ましおく必要があります。

また、長旅で疲れた体にテンションを注入してくれる儀式です!

一年前歩いた道をすすむと見えてきましたあの看板! f:id:hitonomichi:20150607162747j:plain
来た来たー!

この辺りまで来ると背中に番号を背負った人たちがたくさん歩いています。
レジスト済ませた人はその年の背番号入りジャケットがもらえます。

Moscone Westへ

会場のモスコーンに入ると壁にどかーんとその年のアイコンが書いてあります。
レジストにWWDCチケットのPassbookとパスポートを出せば完了。
私はAppleWatchのPassbookでピッ。

ジャケットをもらって完了!簡単!親切!
はい以上。
f:id:hitonomichi:20150607163756j:plain

ジャケットですが私の前の人が太っちょさんでL頼まはって
明らかに入らんやろって思ってたら結局その人は一番お大きいやつにしてて
自分で自分のサイズわかってないんかよーwって思ってて、
次自分の番になって最初Mをお願いして試着してみたら少し大きくて、
Sに変えてくださいって言ってる自分に気付いて
はははー俺も自分のサイズわかってないなーwって思ったんですよって
これ誰が興味あんねん!

レジストレーション完了

f:id:hitonomichi:20150607164045j:plain

あと、前あったおもちゃ屋は潰れたけど他にもあるよ。

 
 
関連記事はこちら。
WWDC2015 カテゴリーの記事一覧 - ROADTO みちログ
 

Road to WWDC2015 「サンフランシスコに行くよ」

出発

いよいよこの日かやってきました。
WWDCに出発します。

ホテルまでの道のりです。

関空

まずは関空へ。

戦地に向かう男の背中は強さと頼もしさが満ち溢れていますね。
f:id:hitonomichi:20150609133403j:plain
いきなり飛行機の出発が3時間遅れという仕打ち。
おかげで予定してたApple本社への巡礼があっけなく水の泡。

f:id:hitonomichi:20150607154932j:plain
もろもろの出国準備を淡々と。

出国

関西組の皆さんとも合流。
f:id:hitonomichi:20150607170117j:plain
搭乗はAppleWatchで。

今回はサンフランシスコへの直行便。
United航空。
ご飯は普通。
f:id:hitonomichi:20150607211500j:plain

ホテルへ

10時間くらいのフライトでサンフランシスコへ。

空港からはBARTで移動。
f:id:hitonomichi:20150607150637j:plain
切符を買わずにClipper Cardを買ってみました。
この道と書いているカードがそれです。
ICOCAみたいなチャージするタイプのやつ。
$25チャージ、発行手数料$3でした。
うそです。道と書いているカードはClipper Cardではありません。
f:id:hitonomichi:20150609150034p:plain
ほどなくして最寄り駅Powell stに到着。
@nakiwoさんを探せ。
f:id:hitonomichi:20150607154541j:plain
同室の方と合流してホテルにチェックイン。

到着。

荷物を置いてほっと一息。
これこれ。この雑踏感。
来たなー。
今年もよろしくお願いします。

 
 
関連記事はこちら。
WWDC2015 カテゴリーの記事一覧 - ROADTO みちログ
 

Road to WWDC2015「準備するよ」

準備するよ

f:id:hitonomichi:20140601163853j:plain
WWDCの季節がやってきました。
去年に引き続き、今年も参加してきます。

まさ連続で行くことになろうとは。
数年前の自分に言っても信じないでしょう。

ということで、もうすぐ出発なので準備します。

去年の自分の記事も参考にして。
hitonomichi.hatenablog.com
hitonomichi.hatenablog.com

予約・申請系

  • WWDCチケット
  • 航空券予約
  • ホテル予約
  • パスポート
  • ESTA

オールOK。
ホテルはユースホステルの二人部屋。
ありがたいことに誘って頂いて部屋代も割り勘。 リーズナボー!

デジタル系

  • Macbook Airとケーブル
  • iPhone 6plusとケーブル
  • AppleWatchとケーブル
  • モバイルバッテリーとケーブル
  • イヤフォンとケーブル
  • 4穴USB充電ケーブル
  • モバイルWiFi関空でレンタル)

ケーブルの多さよ。関西電力かよ。
MBAの充電だけが心配。
発電機もっていったろか。
関西電力かよ。

着替えと小物

  • 半袖Tシャツ+長袖シャツの組み合わせを数セット
  • 下着と靴下(適当)
    洗濯できるっぽい。
    やったことないけどチャレンジしてみよ。
  • パンツ数本
  • 春物ジャケット
    ジャケットはKeynote並ぶ用と夜出歩く用。
    夜はぐっと冷えるし、たぶんWWDCジャケットもらえるけど
    それで歩くと狙われるから。
  • WWDCパスケース パス落とすと、もう入れないグッバイモスコーン!なので落としにくい首さげパスケースを持参。
  • 道プレート
  • ノートとペン
  • 名刺
  • 歯磨きセット
  • 整髪料
  • 英語話す気概

持っていかないもの

  • コンデジ
    去年持って行ったけどほとんどiPhoneで写真とってたので今年はなし。
  • イス
    並ぶときあるといいらしいけどウロウロする派なのでなし。
  • 洗濯グッズ
    潜在とかホテルにありそう。
  • 変圧器
    なくて大丈夫。
  • さぼりたい自分の中の弱い気持ち。

こんなもんかな。 去年より軽くしていきたいところです。

 
 
関連記事はこちら。
WWDC2015 カテゴリーの記事一覧 - ROADTO みちログ
 

 

GeoFenceとCoreMotionを組み合わせたバックグラウンド常駐監視の一案

仕事へのパッションが抑えられません。

ジオフェンシングとモーションセンサーを使って
バックグラウンドやロック状態でも何かをしたいときの一案。

ジオフェンシングって知ってますか?

そうだね、プロテインだね。

ではEnjoy ジオフェンシングとモーションセンサー!

やりたいこと

ある領域内にいるうちは定期的に何かしたい。

何かのトリガーでバックグラウンドでアプリを起動させても動くのって10秒ほど。
がんばって延長させても最長10分弱。

そうじゃなくて定期的に何かしたい。

やることの要約

  • 指定領域内に入ったらモーションセンサー開始
  • モーションセンサーで歩くたびに何かする
  • 指定領域内は継続
  • バックグラウンドでもロック時も動作開始、継続
  • 指定領域から出たらモーションセンサー停止

前提

  • Xcode6.3.1
  • 検証機はiPhone6plus iOS8.3。
  • AppStoreに申請したことはない。
  • SwiftじゃないよObjective-Cです。

「・・・」のところは本筋から外れるので間引いています。
気になる方はサンプルコードからどうぞ。
サンプルコード

実装のまえに

プロテイ、、プロジェクトの設定をします。

位置情報「常に使用」を有効にします。
* Info.plistにNSLocationAlwaysUsageDescriptionを追加 f:id:hitonomichi:20150529192716p:plain バックグラウンドで動かす設定をします。
* TARGETS - Capabilities - Background Modes をON
* Location updatesにチェックをつける
f:id:hitonomichi:20150529192733p:plain

やっと実装

まずはインポート。

余談ですがframeworkに追加しなくてよくなったのね。
framework追加なしでエラーになりません。

#import <CoreLocation/CoreLocation.h>
#import <CoreMotion/CoreMotion.h>

CLLocationManager初期化と監視領域の指定。

CLLocationCoordinate2DMakeで指定した緯度軽度を中心に、
CLLocationDistanceで指定した領域を監視します。

//CLLocationManager初期化
self.locationManager = [[CLLocationManager alloc] init];
・・・
self.locationManager.delegate = self;

//Region初期化
CLLocationCoordinate2D coordinate 
    = CLLocationCoordinate2DMake(37.324540, -122.041241);//アメリカ(クパチーノ)
CLLocationDistance radiusOnMeter = 100.0;//範囲指定
self.geoRegion = [[CLCircularRegion alloc] initWithCenter:coordinate
                                                   radius:radiusOnMeter
                                               identifier:@"jp.roadto.ROADTO-Geo"];

//位置情報の許可状況に合わせて動作開始
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
    // iOS8
    switch ([CLLocationManager authorizationStatus]) {
        case kCLAuthorizationStatusNotDetermined:
            NSLog(@"位置情報の許可が未設定なのでユーザに確認する");
            [self.locationManager requestAlwaysAuthorization];
            break;
        case kCLAuthorizationStatusAuthorizedAlways:
            NSLog(@"「常に許可」されている");
            break;
            ・・・
    }
} else {
    // iOS7以下
    [self.locationManager startUpdatingLocation];
}

続きましてCLLocationManagerDelegateメソッドたち

requestStateForRegionで監視が始まったときとか
requestAlwaysAuthorizationの位置情報使用確認後とかに通知されます。

領域内に入ったときにモーションセンサーをONにし、
領域外になったときにモーションセンサーをOFFにします。

説明はコメントにて。

#pragma mark - CLLocationManagerDelegate
// CLLocationManager初期化時または
// アプリの位置情報の許可状態ステータスが変更されたときに通知される
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    switch (status) {
        case kCLAuthorizationStatusNotDetermined:
            break;
        case kCLAuthorizationStatusAuthorizedAlways:
            NSLog(@"「常に許可」");
            // 領域監視スタート
            [self.locationManager startMonitoringForRegion:self.geoRegion];
            break;
            ・・・
    }
}

//領域監視がスタートしたときに通知
- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {
    //現在の領域状態を確認。
    //「- locationManager:didDetermineState:forRegion:」が呼ばれます。
    [self.locationManager requestStateForRegion:region];
}

//領域内に入ったときに通知
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
    NSLog(@"領域内になったよ");
    
    //モーションセンサー 開始 内容は次の章で説明。
    [self startMotionActivity];
}

//領域の状態について通知。状態が変わるたびに呼び出される。
- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region {
    switch (state) {
        case CLRegionStateInside:
            NSLog(@"領域内");
            //モーションセンサー 開始 内容は次の章で説明。
            [self startMotionActivity];
            break;
            ・・・
    }
}

//領域から出たことを通知
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
    NSLog(@"領域外になったよ");
    
    //モーションセンサー 停止
    [self stopMotionActivity];
}

あとはモーションセンサー

CMMotionActivityManagerを使ってモーションを取ります。
今回は歩いているか否かを使っていますが、他にもいろんな状態をとれます。
「//do something」でしたい何かの処理を書きます。

#pragma mark - モーションセンサー
//モーションセンサー 初期化
- (CMMotionActivityManager *)getActivityManager {
    if (!self.motionActivityManager) {
        self.motionActivityManager = [[CMMotionActivityManager alloc] init];
    }
    return self.motionActivityManager;
}

//モーションセンサー 開始
- (void)startMotionActivity {
    NSLog(@"モーションセンサー 開始");
    
    //iOS7,8ともに必要
    [self.locationManager startUpdatingLocation];    //←キモ。iOS7,8ともに必要です。
    
    if([CMMotionActivityManager isActivityAvailable]){
        NSOperationQueue *queue = [NSOperationQueue mainQueue];
        CMMotionActivityManager *motionActivityManager = [self getActivityManager];
        [motionActivityManager startActivityUpdatesToQueue:queue withHandler:^(CMMotionActivity *motionActivity){
            
            //do something

            NSString *log = [NSString stringWithFormat:@"motion %@", motionActivity.walking ? @"そうだね。プロテインだね。" : @"んーんーんー。"];
            NSLog(log);
            ・・・
        }];
    }
}

//モーションセンサー 停止
- (void)stopMotionActivity {
    NSLog(@"モーションセンサー 停止");
    CMMotionActivityManager *motionActivityManagerUpdate = [self getActivityManager];
    [motionActivityManagerUpdate stopActivityUpdates];
}

テストに出ます

「←キモ」のところ。
startMotionActivity内で「-locationManager startUpdatingLocation」を呼んでいます。
これ自体は位置情報の更新監視をスタートさせるものですが
なぜかこれを書くとモーションセンサーもバックグラウンドで動いてくれます。

バックグラウンドでもロック状態でも起動するし、
フォアグラウンドで起動して、バックグラウンドやロック状態になっても動き続けます。

尚、「M7」モーションセンサーはiPhone5sから搭載なので、
iPhone5以前は使えません。

結果

サンプルコードを起動させます。
サンプルコードでは画面に出力させています。

歩いているかどうかを判定しています。
歩いてると出てますね。「そうだね。プロテインだね。」
f:id:hitonomichi:20150529193201p:plain

バックグラウンドでも動いていますね。「そうだね。プロテインだね。」
f:id:hitonomichi:20150529193317p:plain

以上です。

エヴィバディパッション!

Road to Passbookの作成

Passbookを作ってみる機会があって色々調べたので残しておきましょう。
ではEnjoy Passboooooooooook!

前提

  • MacYosemite
  • 検証機はiPhone6plus iOS8.2。
  • iOS Developer Program に登録していること。
  • 自動更新とかサーバ絡んだことは考慮しない。

素材を集める

証明書を作成

「キーチェーンアクセス」ー「証明書アシスタント」ー「認証局に証明書を要求」
「CertificateSigningRequest.certSigningRequest」ができました。
あとで使います。

Pass Type IDsを作成

デブセンでPass Type IDsを作成します。
証明書(さっき作った.certSigningRequest)を使用します。
できたらDownloadします。
ダブルクリックでキーチェーンに保管します。

テンプレートをゲットだぜ

Passbookのテンプレートを取得します。
ここから。Passbook Support Materials
「Passbook Materials」てリンクからダウンロード。
落ちてきたpassbook_materials.dmgを開く。

必要なやつだけ別に置いてみたら分かりやすいんじゃね?

任意の場所にフォルダを作成。今回は「PassSample」とします。
「PassSample」にサンプルjsonファイルと必要素材のどれかを置きます。
今回は「Generic.raw」を使用します。
signpassのプロジェクトをXcodeでビルドし作成されたsignpassを「PassSample」フォルダに移動に置きます。
f:id:hitonomichi:20150328155047p:plain
こんな感じ。

Passbookの中に具を詰めます

pass.jsonを編集します。

まず、必要な情報があるのでキーチェーンアクセスから証明書を見てみます。
作成して保存した証明書を右クリックから「情報を見る」で開きます。 f:id:hitonomichi:20150328155028p:plain
詳細な情報を開くと、あったあった。

これらをpass.jsonに設定します。

  • passTypeIdentifierにPass Type IDを指定
    例)"pass.com.example.PassbookSample"
  • teamIdentifierに部署を指定。10桁の英数字文字列です。
  • organizationNameに組織を指定。

その他必要な項目を設定します。
ここを参考に。
Pass Design and Creation

オーブンに入れて出来上がりを待ちます

ターミナル起動。
「PassSample」ディレクトリに移動。
実行。
./signpass -p Generic.raw

Generic.pkpassができました!
ダブルクリックでプレビューできます。
作成手順は以上です!

アレンジで自分だけのPassbookを。

去年のWWDCで現地のディベロッパーは名刺をPassbookで持ってるって耳にしたので、
試しにひとのみちPassbook名刺をつくりました。
ひとのみちPassbook名刺
iPhoneだとPassbookアプリに入るよ。
え?いらない?ですよね。いらない人は燃えるゴミの日にだすか、かたつむりにあげてください。

別腹

余談ですが。 PassbookはiBeaconに反応してロック画面に表示しますが、
表示対象のPassbook複数あったらどうなるか。
たぶん並んで表示されるんやろーなーと思ってたら、、なんと! f:id:hitonomichi:20150328162438j:plain
思ってた通り並んで表示されました。

ちなみに、passTypeIdentifierが違えば別モノとして表示、
passTypeIdentifierが同じでserialNumberが違うと同じpassTypeIdentifierのうちどれか一つが表示されました。

食後に

PassbookはiBeaconや緯度経度に連動するし、
AppleWatchにも搭載されるし、
あんまり流行っていないけど、使い道はあると思ってるんですけどね。

自動更新とかサーバ絡んだことはまたそのうち研究します。

iBeaconとPassbookのサンプルを作ったよ。

iBeaconとPassbookのサンプル作りました。 サンプルコードとか技術的な話はないです。ないんです。

ビーコンとは最近流行ってるIoTの切り込み隊長で、 電波を発信してモバイル端末に訴えかける仕組みです。

小売店や映画館とか、割と事例が出てきてます。

はい。 こんな感じです。

作ったサンプルですが、下の写真の黒い四角いのがビーコンです。 一個1000円で電池で動きます。

f:id:hitonomichi:20150303012331j:plain

空想上の街イベントアプリを作りました。

食とバンド、アートが街のいろんなところで楽しませてくれます。

例えば、ハンバーガーショップに近づくとアプリがビーコンに反応します。 ピロンとアラートが表示されますねー。

この例ではクーポン¥300,000OFFをゲットです。
f:id:hitonomichi:20150303013824g:plain

店側からしたら、なかなかアピールする手段がない中、 こちらから訴えかける一つの仕組みとして有効ですね。

あと、Passbookも一度iPhoneに取り込めばビーコンに反応して、 ロック画面に出てきます。

こちらも合わせてアピールの道具になりそうですね。

自己紹介
メガネは売っていません
高浜 一道(たかはま かずみち)
大阪でiOSアプリの道を歩くフリーランス。
iPad・iPhoneとサーバを連携した、JSONやDBといったキーワードが出てくるツール系が多めです。
お仕事のご依頼やご連絡はこちらから。
お仕事ください!
Web : ROADTO
ML : k-takahama(a)roadto.jp

個人的なアカウントはこちら。
Tw : @hitonomichi
Fb : kazumichi.takahama