Google Tag Manager for iOSについて調べてみた
Google Tag Manager(以下GTM)に自動イベントトラッキングなるものがあると聞き、 iOSアプリにも導入してみようと調査してみました。
自動イベントトラッキングとはWebではHTMLにイベント毎に特別な記述を書かなくても、 トラッキングすることが可能になるというすばらしい機能です。
これが実現できればアプリ審査を通さなくても いつでもトラッキング情報の変更ができるという正に夢のようなツールです。
期待に胸を膨らませながら調べ続けて数時間、一切情報を得られないまま・・・潔く諦めましたw 結論からいうとiOS SDKにはこの機能は無いみたいです。
ドキュメントにかじり付いて読んでみたんですが、 自動イベントトラッキングに関する情報は一切登場しませんでした。
https://developers.google.com/tag-manager/ios/v3/#intro
Web版の方にはありますね・・・。 興味ある方は下記をご覧ください。
https://support.google.com/tagmanager/answer/3420054?hl=en
ドキュメントに書いてあったGTMで管理できる項目は下記のようなものくらいです。
- 様々なUIの設定や表示する文字列など
- アプリ内のサイズ、場所、広告の種類
- ゲームの設定
簡単に言ってしまえばアプリ内の設定情報などを持つのではなく Google Tag Managerで設定情報を取得するようにして 変更したくなったら再ビルドすることなくWebの管理ツールでできるよって感じです。 その他にはGTMから条件を設定して、その条件を満たしたイベントのみを送信するとかでしょうか。
使えない、全然使えないよ!って言いたくなりますが、 再ビルド無しで設定値などの管理ができるのはそれなりのメリットはあると思うので良しとしましょう。
せっかくなので暇な時に使い方でも書いておきます。
Cocoa勉強会関西 #55 に参加してきました #cocoa_kansai
Cocoa勉強会関西に初めて参加してきました。 せっかく参加するので20分ほどいただいて、前から気になっていたMagicalRecordについて軽く話しをさせてもらいました。
その時使った資料です。
もう10年近くやっている勉強会ということもそうですが、Mac開発者の方が結構おられるようでiOSアプリから入った自分からすると結構驚きでした。
地元広島では中々こういった勉強会というのもなかったので、いい刺激になっていいなと思います。
@es_kumagaiさんのコメントに絵文字が使えるという話が妙に印象に残ってますw
懇親会に参加できなかったのが残念なので、次回も是非参加しようと思います。
勉強会に参加された皆様お疲れ様でした。 次回も宜しくお願いします!
ソースコードを一切書かなくてもアニメーション処理ができるCanvasがおもしろい
概要
ソースコードを一切書かな くてもアニメーションのエフェクトをUIViewに設定できるライブラリです。ちょっとしたアニメーションさせたい時などに使えそうです。
種類はまだ多くないですが、アニメーション処理をUIViewControllerから完全に分離できるのでコンセプトはとてもよいと思います。 現在サポートしているアニメーションの種類については上記サイトで確認できます。
導入手順
CocoaPodsでインストールできるのでPodfileを作成します。
platform :ios, '7.0' pod 'Canvas', '~> 0.1'
次にインストールです。
pod install
導入は以上でオッケーです。
アニメーション設定手順
アニメーションに関する設定はInterface Builderで行うので、その設定方法を紹介します。 まず下記の項目を設定します。
Key Path | Type | 説明 |
---|---|---|
type | Number | アニメーションの種類 |
duration | Number | アニメーションを実行する時間 |
delay | Number | 設定した時間経過後にアニメーションを実行 |
pauseAnimationOnAwake | Boolean | チェックすると初期表示時にアニメーションを実行しない |
アニメーションを実行したいUIViewのクラスをCSAnimationView
に変更します。
設定内容は下記を参考にしてください。
アニメーション実行手順
CSAnimationViewを設定したUIView、またはその親となるUIViewのstartCanvasAnimation
メソッドを実行することでアニメーションさせることができます。
[self.animationView startCanvasAnimation];
このメソッドは指定したUIView
のSubview中でCSAnimationView
が設定されているものがあれば全て実行してくれます。
下記を参照してもらえばstartCanvasAnimation
メソッドが実行されているのが確認できるので興味がある方は見てみてください。
https://github.com/CanvasPod/Canvas/blob/master/CanvasLibrary/CSAnimationView.m
実際に使用するアニメーションタイプはこちらのソースコードを参照してください。
https://github.com/CanvasPod/Canvas/blob/master/CanvasLibrary/CSAnimation.h
またアニメーションの実装はCSAnimation
に定義してあるので、どのような処理をしてるかはここを見れば確認できます。
https://github.com/CanvasPod/Canvas/blob/master/CanvasLibrary/CSAnimation.m
まとめ
アニメーション処理とUIViewControllerを完全に分離できるのでメリットは大きいと思います。
課題としてはアニメーションの種類が少ない点と独自で作ったアニメーションをこのライブラリに手をいれずに
追加する方法が公式に用意されていない点が上げられます。(この部分はCAAnimation
クラスを継承するなどで対応できるかもしれません)
この辺は今後のアップデートに期待するか、独自で作ってみてもよいと思います。
Crash Report解析サービスのCrashlyticsを試してみた
概要
先日Qiitaに書いた記事の続きとしてブログに書いてみました。
http://qiita.com/asakahara/items/7c890668a709abb949cf
アプリ開発では必須になりつつあるCrash Report解析サービスですが、今回はその一つであるCrashlyticsを導入した時のメモです。 Crashlyitcsは完全無料なので料金を気にせず気軽に使えます。 また無料ではありますが、Crash Reportを解析するために必要な機能はほとんど備わっている上、デザインも無駄(?)にかっこいいです。
導入手順
下記からまずユーザー登録をします。
登録するとYou're on the listというタイトルでメールが来ます。 待機リストに追加されて順番待ちということになるのですが、 Twitterアカウントを使ってログインすると、すぐに使い始めることができます。
ログインしたらCrashlyticsを使うためのツールをダウンロードします。 iOSを前提にしていますので、Xcodeを選択してください。
ツールをインストールしたらCrashlyticsの導入を開始します。 細かい手順はツールの手順に沿って行えば簡単にできますので割愛しますが、一点手順としてCococaPodsを使用する方法を書いておきます。 ツールの手順に従って導入する場合、下記のようにFrameworkをXcodeプロジェクトにドラッグしてくださいと表示されます。
ここではドラッグせずにCocoaPodsで提供されているCrashlyticsFrameworkを利用します。
platform :ios, '7.0' pod 'CrashlyticsFramework'
下記コマンドを実行してインストールしてください。
pod install
この一つ前の手順でRun Script Build Phase
する際に指定したコマンドのパスをPodsファイルのパスに併せて変更します
・変更前
./Crashlytics.framework/run xxxxxxxxxx
・変更後
./Pods/CrashlyticsFramework/Crashlytics.framework/run xxxxxxxxxxxxx
ツールが自動生成するプロジェクトフォルダ直下にできるCrashlytics.framework
フォルダは不要なので削除しておきましょう。
それ以降の手順はツールの内容と同様で問題ありません。
Crashlytics.framework
- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [Crashlytics startWithAPIKey:@"<API-KEY>"]; // ... }
これで全ての準備オッケーです。
テストとしてわざとエラーが発生する処理を記述して実行させます。
- (IBAction)crashAction:(id)sender{ NSArray *array = [NSArray array]; id data = array[0]; }
上記処理を実行するとCrashlyticsにCrash Reportがリアルタイムで送信されます。 下記のように情報を見る事ができます。
Bread Crumbs
にも対応しており、CLS_LOG(format, ...)
でログを残すことでCrashlyticsのCrash Reportにも反映されます。
感想
無料でここまでできるのでまずCrash Report解析ツールを使ってみたいということであればお勧めです。 .dSYMファイルもビルド時に自動的で送信してくれるようなのでデバッグシンボルの復元も特に何もしなくてもできます。
Crashlyticsでバグのない品質のいいアプリ開発を心がけましょう!
アプリエンジニアがアプリのデザインで困った時に頼るべきサイト一覧
アプリを開発する環境やチームは人それぞれだと思います。数人のプログラマーとデザイナーのチームで開発することもあればほとんど全てを一人でやる場合など。
特に日曜プログラマーの人でアプリを公開してみたいとなるとデザイナーの知り合いにお願いするか、お金を払ってデザインの発注するをするのはちょっと厳しい場合もあると思います。 そんな時に全てではなくともある程度のデザインを自力でする力があると非常に助かります。
私も個人でアプリ出してますが、デザインがうまくできないせいでホントによく苦労しました。そんな中で参考にさせていただいたサイトや実際につかっているアイコン集などもあるので、数は少ないですが紹介してみます。
実際にリリースされているデザインのよい様々なアプリのスクリーンショットをカテゴリ毎に見れます。デザインの参考になるアプリが見たい場合はまずこちらがお勧めです。
アプリ以外のデザインもありますが、ここに掲載されているアプリのデザインもとてもよいものが多いです。ここに掲載されているものは実際のアプリではなくコンセプト的なデザイン画像がほとんどです。
他にも日本のサイトでよいデザインを紹介してくれているサイトです。
こんなデザインがゼロからできるようになりたい!とよく思いますw
私はデザインのプロではないですし、デザインについて語れるほどの知識は持ち合わせていませんが、様々なデザインを見て、実際にアプリを触ってみることでより良い方法を知り、それらを取り入れていくことがより良い物を作る一番の近道だと思います。
自分でアイコン作るのも無理!という方は下記ここらのサイトからアイコンをゲットするのがよいです。有料のものが多いですが、一から描くことを考えると購入した方がかなり工数削減できます。それに加えVectorなどの様々なフォーマットに対応しているのでカスタマイズもできます。
アプリ作ってる方でデザインに苦労してる方に是非参考にして頂きたいと思います!
2月から株式会社はてなに入社します
最近はフリーランスで仕事してたので今流行り?の華々しい退職エントリーは書けませんが、 技術ネタ以外で書く事に困っていたのでお知らせの意味もかねてこのエントリー書きます。
直近の約1年間はフリーランスでiOSアプリ開発(Androidも少し)をメインに仕事してまして、 年末までの半年間は地元広島を離れて東京で某大手企業のアプリを担当してました。 スマートフォン系の仕事の多さや勉強になることも多々あって、 東京に移り住んでゆくゆくは会社でも作るか!なんてこと軽く考えてたんですが、 家庭の事情で地元広島か、もしくはなるべく広島に近い場所で就職しようという事になった次第です。
そんな時広島から少し遠いけど前から憧れの企業だったはてなが、 iPhone, Androidアプリエンジニアを募集してるのを知りダメ元で応募してみました。 すると自分でもびっくりなんですがトントン拍子で最終面接までたどり着き、 課題だったプレゼンもなんとかこなして2月から入社することになりました。 (東京でもチャレンジ兼ねて就活して2社ほど内定いただきましたが、結局行けなくなってしまい関係者の方々すいません)
元々生まれも育ちも広島で、地元のSierに就職してからは業務システムの開発(主にJava Webと.NET C#)やLinux、UNIXサーバの構築、 保守などのインフラ周りを主にやってきた人間です。 そういう経歴にも関わらず以前からシリコンバレーのベンチャー企業への憧れがすごくあって、 SIerよりITベンチャーで働きたいという思いが強かったのですが、 広島にそんな有望なベンチャーもなく、何年も鬱々とした日々を過ごしてきました。
そんな状況をなんとかしたくて約4年前から個人でiOSアプリを少しずつ作り始めました。 がんばった甲斐あっていくつかアプリを公開できるほどになり、 気がつけば仕事・趣味含めほぼiOSアプリ開発(Androidも少しね)ばかりやるような状況になってました。 ただ当時は周りにiOSエンジニアがほとんどいなくて、 Webだけでいいじゃんという人にアプリの良さを理解してもらうのにはよく苦労しました。 それでもアプリ開発が楽しく率先して仕事選んでましたねw
というわけで、Perlはほぼ未経験ではてなに入ることになりちょっと心配な面もありますが、 PerlもがんばりつつiOS周りの開発で培ったノウハウを活かして、はてならしいアプリを提供できればと思ってます。
個人でアプリを作り始めた4年前、とても自分がはてなに入社できるなんて思ってもみませんでした。 でも縁あってこの機会をもらえたからには、はてなが更に飛躍できるよう力の限りがんばっていく所存です。 若くて優秀なエンジニアがたくさんいる環境で、36歳の自分がどこまでやれるのか楽しみでもあります。
そしてこのはてなブログも息切れしないよう力の限り続けていく!?・・・予定です。
爆速ではてなブログリーダー・アプリを作ってソースコード公開してみた!
はてなブログには人気エントリーを返すRSSフィードがあるので人気エントリーを表示するアプリを勉強がてらに作ってみました。
Core Data に取得した人気エントリーを保存してるのでオフラインでもみれます。
(ただこのアプリ、表示できるのは人気エントリーの一覧だけです・・・)
http://blog.hatena.ne.jp/-/hotentry/rss
アプリのスクリーンショットです。
・ブログ一覧画面(縦)
・ブログ詳細画面(縦)
・ブログ一覧画面(横)
・ブログ詳細画面(横)
Xcode5から使いやすくなったAuto LayoutやXCTestなどあまりキャッチアップできていなかった部分の勉強や単体テストをちゃんと書くという目的があったのですが、作りっぱなしでは面白くないので公開します!
https://github.com/asakahara/ASHatenaBlogReader
感想としてAuto Layoutは正直かなりよかったです!
これまでUILabel
の高さを可変にする表示はNSString:sizeWithFont:constrainedToSize:lineBreakMode:
を使って毎回計算してました。
Auto Layoutの使う場合、制約の設定さえちゃんとしておけばUILabel
の高さ調整は勝手にやってくれます。
(もっと早く知っておきたかった・・・)
勝手にやってくれるんで sizeToFit
などのメソッドをプログラムから呼び出さないようにしましょう。
ただ一つ問題として横画面にも対応させたのですが、縦から横画面へした際にStoryBoardから設定した制約だけではUILabel
の横幅の制御がどうもうまくいきません。
仕方なくUILabel.preferredMaxLayoutWidthを横画面のサイズに併せて変更かけることで対応しています。
- (void)updateLabelPreferredMaxLayoutWidthToCurrentWidth:(UILabel *)label { label.preferredMaxLayoutWidth = [label alignmentRectForFrame:label.frame].size.width; } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; // 横画面にした際にラベルの横幅が縦画面のサイズのままになってしまうため、 // preferredMaxLayoutWidthを画面サイズに併せて調整する [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.bodyLabel]; [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.titleLabel]; [self.view layoutSubviews]; }
その他にもCore Data用に初めて使ったMagicalRecordは思った以上に便利でした。
特にマルチスレッドでCore Dataを扱う部分をかなり楽にしてくれます。
MagicalRecordのドキュメントにあったサンプルを見てもらえば納得してもらえると思います。
Person *person = ...; [MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext){ Person *localPerson = [person MR_inContext:localContext]; localPerson.firstName = @"John"; localPerson.lastName = @"Appleseed"; } completion:^{ self.everyoneInTheDepartment = [Person findAll]; }];
ブロック内に書いた処理を全て別スレッドで処理を行い、完了ブロックはメインスレッドで動作します。
あと単体テストはXCTestを使って最低限のモデルのテスト書いてます。
HTTP通信周りはOHHTTPStubs使ってやってます。
今回特に参考にさせていただいた資料としてはてな教科書があります。
初心者の方にも分かりやすい内容となっており、一通りこなせばこの手のアプリは誰でもきっと誰でも作れるはずです!
一から作ったり勉強するのはいや!という方はソースだけでもダウンロードしてお試しください。
やっぱりアプリ作るのは楽しいですね!