2011年8月23日火曜日
Google Syncが使える奴になって来た!
久々に更新など・・・
お題は表題の通り「Google Sync」。
言わずと知れた、iphone上でGmail・Googleカレンダー・Google Contacts(Gmail 連絡先)のOTAでのプッシュ同期が出来る機能です。
提供開始当時は「スゲー!」とは思ったのですが、実際使ってみると細かいところで色々と使いにくい所があって使用を断念してました。
しかし、あれから2年・・・革新は速いけど、対応の遅いGoogleさんでも流石に実用できるレベルまで来てました!(Apple側の対応も含む)
[IMAP]->[Google Sync]
Gmailに関しては、以前からほとんど問題なかったんですが、例えばドコモからのメールの文字化け等は解消済みですね。
噂によると、iOS5のノーティフィケーションセンターでの通知が"いい感じ"らしいですし、Mail.appの着信音も変更可能になるらしいですし、絵文字キーボードも使用できる様になるらしいですから、かなり使えるようになるのでは?
そして、IMAP方式だと、15分おきもしくはPNS系のアプリ(Boxcar等)で「プッシュ通知」してましたが、正真正銘「プッシュ配信」されます。(メール着信を通知のみではなく、メール着信を通知と同時にダウンロードまで)
まぁ、極度にバッテリーの持ちを気にする方とか、送信元アドレスを変更して使用するヘビーユーザな方などは、まだ完全には乗り換えは難しいでしょうが・・・
ちなみに、バッテリーですが、プッシュに切り替えた翌日などはやはり減りがメチャメチャ速いような気がしますが、少しの間使ってると、そんなに気にするレベルでもなくなってきました。あくまで私の場合ですが・・・
[CalDav]->[Google Sync]
カレンダーに関しては、当初、登録できるカレンダー数に制限があったみたいですが、現在では25個までOKらしいですから実際問題なしですよね。
あと、これまではCalDavにアドバンテージがあったカレンダーの色が同期しない問題ですが、噂によるとiOS5からはiOS側でカレンダーの色が変更できるようになるらしいのでこれも解決ですよね。
標準アプリが若干機能不足ですが、iOSのカレンダーデータを参照するカレンダーアプリを使えば解決ですよね。最近のアプリは大抵対応してますし。
何より、PCからGoogleカレンダーに入力した予定が瞬時にiPhoneに転送されているのは感動すら覚えます。CalDavの場合少し間が有りましたからね。と言っても、実際問題スケジュールの転送が瞬時ではなく、1時間ぐらい遅れてもほとんど影響は無いですけどね・・・
[Macと同期の連絡先]->[Google Sync]
今まではこれが、一番ダメダメでした。
・項目の不一致
・フリガナ未対応
・同期時に姓名が逆になる
・グループ未対応
・Gmail側のWebUIが糞
・・・etc
でも、これが一番やりたかった方法なので、これが使えるようになったのは嬉しいです。
項目に関しては、Google側が大幅に改善したので実害のないレベルでほぼ一致するようになりました。
致命的な問題だったフリガナも対応。WebUI側でも入力できるようになりました。
無理矢理iPhone側で反転する必要のあった姓名の逆転現象も現在は、私のところでは起こっていません。
残念ながらグループの同期に関しては現在もサポートされていないのですが、よくよく考えてみると、私の場合、1500件以上の連絡先があるのですが、大概は「すべての連絡先」グループにて検索かけてました。その他のメールや電話のアプリなどでもグループが無いことによる支障はないので、iPhone上ではグループがなくても問題ありません。クラウド上には残ってますし。
ちなみに、macのアドレスブックのデータをGmail連絡先に移行するのは、アドレスブックから全データを一括でvcardエクスポートして、Gmail側でインポートするとほぼ完璧に移行できます。ただ、グループに関しては、アドレスブックのグループをあらかじめGmailの連絡先に作っておく必要がありますが、その仕込みさえできてればグループ含めて、誕生日や関係(親・子など)まで移行できます。
あと、仮にiPhone側が問題なくても致命的だったのが、Gmail連絡先のWebUI。
連絡先に関しては、PCでラクラク入力でiPhoneと同期というのが私のやり方なので、PC側のUIが使えるレベルにないと話にならない。
じゃ、アドレスブックで良いような気もしますが、Gmail連絡先が使えるレベルになると、
・自己満足レベルの瞬間同期が可能(^^;
・クラウドなので入力場所を選ばない(これが大きい)
・ZindusアドインをつかってThuderbirdのアドレス帳と同期可能!
と何かと嬉しい。ただ、前までのGmail連絡先のUIは前述の項目やフリガナ対応などができなかったし、氏名や住所の分割入力ができなかった。氏名ぐらいはスペース開ければよかったけど、住所の表記はコツが必要で常用できるレベルの話ではなかった。
住所以外は結構前に解決してたのだが、つい最近住所の分割入力が可能になってやっと使い物になるレベルに達した!
ただ、細かいことを言えば、フリガナの欄をイチイチ追加するのが面倒だったりと不満はあるが、とにかく「使える」様にはなった。
ってなわけで、AndroidとGoogleの親和性が羨ましいなと思っていたのですが、Goole使いでiPhone使いな人でも、ようやく、普通に使えるようになって来たかなと言うお話でした。
オマケでGoogle連絡先のどの項目がiPhoneに同期されるのかを調べてみた。
まぁ、現実的にほぼ網羅と言っていいレベルかと・・・
名前関連
※ 部署はGoogle側にないので、カスタムフィールドで作成する必要あり。(iPhone側で作成すると自動的に作られる)
メール
※ 但し、自宅、仕事、カスタムそれぞれ1つまでしか同期されない
※ iPhone側の表記は全て「メール」になる
電話番号関連
※ 但し、それぞれ1つまでしか同期されない
※ それぞれ2つまで同期可能
住所関連
※ 但し、それぞれ1つまでしか同期されない
※ 詳細項目は全て反映「町名以下の住所」~「国」
日付関連
※ 但し、記念日は1つまで同期されない(誕生日はGoogle側でも1つ)
URL関連
※ 但し、URL関連全体で1つまでしか同期されない
※ iPhone側の表記は全て「Web」になる
関係
※ 但し、それぞれ1つまでしか同期されない
IM
※ IM全体で3つまで。
※ iPhone側の表記は全て「IM」になる
メモ
お題は表題の通り「Google Sync」。
言わずと知れた、iphone上でGmail・Googleカレンダー・Google Contacts(Gmail 連絡先)のOTAでのプッシュ同期が出来る機能です。
提供開始当時は「スゲー!」とは思ったのですが、実際使ってみると細かいところで色々と使いにくい所があって使用を断念してました。
しかし、あれから2年・・・革新は速いけど、対応の遅いGoogleさんでも流石に実用できるレベルまで来てました!(Apple側の対応も含む)
[IMAP]->[Google Sync]
Gmailに関しては、以前からほとんど問題なかったんですが、例えばドコモからのメールの文字化け等は解消済みですね。
噂によると、iOS5のノーティフィケーションセンターでの通知が"いい感じ"らしいですし、Mail.appの着信音も変更可能になるらしいですし、絵文字キーボードも使用できる様になるらしいですから、かなり使えるようになるのでは?
そして、IMAP方式だと、15分おきもしくはPNS系のアプリ(Boxcar等)で「プッシュ通知」してましたが、正真正銘「プッシュ配信」されます。(メール着信を通知のみではなく、メール着信を通知と同時にダウンロードまで)
まぁ、極度にバッテリーの持ちを気にする方とか、送信元アドレスを変更して使用するヘビーユーザな方などは、まだ完全には乗り換えは難しいでしょうが・・・
ちなみに、バッテリーですが、プッシュに切り替えた翌日などはやはり減りがメチャメチャ速いような気がしますが、少しの間使ってると、そんなに気にするレベルでもなくなってきました。あくまで私の場合ですが・・・
[CalDav]->[Google Sync]
カレンダーに関しては、当初、登録できるカレンダー数に制限があったみたいですが、現在では25個までOKらしいですから実際問題なしですよね。
あと、これまではCalDavにアドバンテージがあったカレンダーの色が同期しない問題ですが、噂によるとiOS5からはiOS側でカレンダーの色が変更できるようになるらしいのでこれも解決ですよね。
標準アプリが若干機能不足ですが、iOSのカレンダーデータを参照するカレンダーアプリを使えば解決ですよね。最近のアプリは大抵対応してますし。
何より、PCからGoogleカレンダーに入力した予定が瞬時にiPhoneに転送されているのは感動すら覚えます。CalDavの場合少し間が有りましたからね。と言っても、実際問題スケジュールの転送が瞬時ではなく、1時間ぐらい遅れてもほとんど影響は無いですけどね・・・
[Macと同期の連絡先]->[Google Sync]
今まではこれが、一番ダメダメでした。
・項目の不一致
・フリガナ未対応
・同期時に姓名が逆になる
・グループ未対応
・Gmail側のWebUIが糞
・・・etc
でも、これが一番やりたかった方法なので、これが使えるようになったのは嬉しいです。
項目に関しては、Google側が大幅に改善したので実害のないレベルでほぼ一致するようになりました。
致命的な問題だったフリガナも対応。WebUI側でも入力できるようになりました。
無理矢理iPhone側で反転する必要のあった姓名の逆転現象も現在は、私のところでは起こっていません。
残念ながらグループの同期に関しては現在もサポートされていないのですが、よくよく考えてみると、私の場合、1500件以上の連絡先があるのですが、大概は「すべての連絡先」グループにて検索かけてました。その他のメールや電話のアプリなどでもグループが無いことによる支障はないので、iPhone上ではグループがなくても問題ありません。クラウド上には残ってますし。
ちなみに、macのアドレスブックのデータをGmail連絡先に移行するのは、アドレスブックから全データを一括でvcardエクスポートして、Gmail側でインポートするとほぼ完璧に移行できます。ただ、グループに関しては、アドレスブックのグループをあらかじめGmailの連絡先に作っておく必要がありますが、その仕込みさえできてればグループ含めて、誕生日や関係(親・子など)まで移行できます。
あと、仮にiPhone側が問題なくても致命的だったのが、Gmail連絡先のWebUI。
連絡先に関しては、PCでラクラク入力でiPhoneと同期というのが私のやり方なので、PC側のUIが使えるレベルにないと話にならない。
じゃ、アドレスブックで良いような気もしますが、Gmail連絡先が使えるレベルになると、
・自己満足レベルの瞬間同期が可能(^^;
・クラウドなので入力場所を選ばない(これが大きい)
・ZindusアドインをつかってThuderbirdのアドレス帳と同期可能!
と何かと嬉しい。ただ、前までのGmail連絡先のUIは前述の項目やフリガナ対応などができなかったし、氏名や住所の分割入力ができなかった。氏名ぐらいはスペース開ければよかったけど、住所の表記はコツが必要で常用できるレベルの話ではなかった。
住所以外は結構前に解決してたのだが、つい最近住所の分割入力が可能になってやっと使い物になるレベルに達した!
ただ、細かいことを言えば、フリガナの欄をイチイチ追加するのが面倒だったりと不満はあるが、とにかく「使える」様にはなった。
ってなわけで、AndroidとGoogleの親和性が羨ましいなと思っていたのですが、Goole使いでiPhone使いな人でも、ようやく、普通に使えるようになって来たかなと言うお話でした。
オマケでGoogle連絡先のどの項目がiPhoneに同期されるのかを調べてみた。
まぁ、現実的にほぼ網羅と言っていいレベルかと・・・
名前関連
- OK 画像
- OK 敬称(名前の前)
- OK 名
- OK ミドルネーム/旧姓
- OK 姓
- OK 敬称(名前の後)
- OK フリガナ(姓)
- OK フリガナ(名)
- OK 役職
- OK 会社
- NG ファイル形式
- OK 部署
※ 部署はGoogle側にないので、カスタムフィールドで作成する必要あり。(iPhone側で作成すると自動的に作られる)
メール
- OK 自宅
- OK 仕事
- OK カスタム
※ 但し、自宅、仕事、カスタムそれぞれ1つまでしか同期されない
※ iPhone側の表記は全て「メール」になる
電話番号関連
- OK 携帯電話
- OK FAX(勤務先)
- OK FAX(自宅)
- OK ポケベル
※ 但し、それぞれ1つまでしか同期されない
- OK 仕事
- OK 自宅
※ それぞれ2つまで同期可能
- NG メイン
- NG Google Voice
- NG カスタム
住所関連
- OK 自宅
- OK 仕事
- OK カスタム
※ 但し、それぞれ1つまでしか同期されない
※ 詳細項目は全て反映「町名以下の住所」~「国」
日付関連
- OK 誕生日
- OK 記念日
※ 但し、記念日は1つまで同期されない(誕生日はGoogle側でも1つ)
- NG カスタム
URL関連
- OK ホームページ
- OK ブログ
- OK プロフィール
- OK 仕事
- OK カスタム
※ 但し、URL関連全体で1つまでしか同期されない
※ iPhone側の表記は全て「Web」になる
関係
- OK 配偶者
- OK アシスタント
※ 但し、それぞれ1つまでしか同期されない
- NG 子ども
- NG 母
- NG 父
- NG 親
- NG 兄弟
- NG 姉妹
- NG 友達
- NG 親戚
- NG 上司
- NG 紹介者
- NG パートナー
- NG パートナー(国内)
- NG カスタム
IM
- OK Google トーク
- OK AIM
- OK Yahoo
- OK Skype
- OK QQ
- OK MSN
- OK ICQ
- OK Jabber
- OK カスタム
※ IM全体で3つまで。
※ iPhone側の表記は全て「IM」になる
メモ
- OK メモ
2011年6月24日金曜日
久々にGT.BLEDSのホームページ更新
まえまえからGT.BLEDSのホームページがなんか野暮ったいというかなんというか・・・かなり気に入らなかったんだけど、面倒臭がって更新するのサボってました・・・
が、やっとこさできました!ジャン!!
http://www.gtbleds.net
まぁ、しょせん私程度なのでデザインはイケてるわけではないですが、だいぶスッキリした感じではないでしょうか???
が、やっとこさできました!ジャン!!
http://www.gtbleds.net
まぁ、しょせん私程度なのでデザインはイケてるわけではないですが、だいぶスッキリした感じではないでしょうか???
2011年5月4日水曜日
[続] iAdをメインにしてAdmobをバックアップとして設置
iAdをメインにしてAdmobをバックアップとして設置の続編。
なんか、AdMobのコードが更新されたとかなんとか言って来るので、試験的に組み込み。
その他、ちょっといろいろ工夫してみました。ただいまテスト中・・・なんとか動いてるみたいだけど・・・
↓以下サンプルソース
viewController.h
viewController.m
なんか、AdMobのコードが更新されたとかなんとか言って来るので、試験的に組み込み。
Admobの登録して、SDKをダウンロードして、
- GoogleAdMobAdsSDK
を面倒くさいのでフォルダごと組み込みました。そして、以下のフレームワークを追加。必要なフレームワークがちょっと減ってますね。
- AudioToolbox
- MessageUI
- SystemConfiguration
- iAd
iAdはOS3.xをターゲットにするならiAdをweklinkにする必要あり。
その他、ちょっといろいろ工夫してみました。ただいまテスト中・・・なんとか動いてるみたいだけど・・・
↓以下サンプルソース
viewController.h
- ...
- #import <iAd/iAd.h>
- #import "GADBannerView.h"
- ...
- @interface viewController :UiViewController < ... , ADBannerViewDelegate, GADBannerViewDelegate>{
- ...
- GADBannerView *adMobAd;
- ADBannerView *bannerView;
- ...
- }
- ...
- - (void) startiAd;
- - (void) startAdMobAd;
- - (void) endAdMobAd;
- ...
- @end
... #import <iAd/iAd.h> #import "GADBannerView.h" ... @interface viewController :UiViewController < ... , ADBannerViewDelegate, GADBannerViewDelegate>{ ... GADBannerView *adMobAd; ADBannerView *bannerView; ... } ... - (void) startiAd; - (void) startAdMobAd; - (void) endAdMobAd; ... @end
viewController.m
- #import "viewController.h"
- @implementation:viewController
- #define MY_BANNER_UNIT_ID @"publisher id" // 自分のパブリッシャーIDを設定
- #define ADMOBAD_TESTING YES // リリース時はNOにする
- BOOL isEnableAdMob = NO;
- ...
- //========================================================
- // 起動時設定
- //========================================================
- - (void)viewDidLoad {
- [super viewDidLoad];
- ...
- //iAd(OS4.0以上)
- if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0) {
- [self startiAd];
- } else {
- [self startAdMobAd];
- }
- ...
- }
- //========================================================
- // メモリ解放
- //========================================================
- - (void)dealloc {
- [super dealloc];
- ...
- //Admob
- if (isEnableAdMob) {
- adMobAd.delegate = nil;
- [adMobAd release];
- }
- //iAd
- bannerView.delegate = nil;
- [bannerView release];
- ...
- }
- ...
- ...
- ...
- ...
- #pragma mark iAd,Admob
- //**********************************************************************
- // iAd関連
- //**********************************************************************
- //======================================================================
- // iAD広告開始
- //======================================================================
- - (void) startiAd {
- NSLog(@"iAd:startiAd");
- // iAd初期化
- bannerView = [[ADBannerView alloc] init];
- bannerView.delegate = self;
- // 広告サイズのiOSバージョン別設定
- if (&ADBannerContentSizeIdentifierPortrait != nil) {
- bannerView.currentContentSizeIdentifier = ADBannerContentSizeIdentifierPortrait;
- }else {
- bannerView.currentContentSizeIdentifier = ADBannerContentSizeIdentifier320x50;
- }
- // 初期は隠す
- bannerView.frame = CGRectMake(0.0,
- self.view.frame.size.height,
- bannerView.frame.size.width,
- bannerView.frame.size.height);
- [self.view addSubview:bannerView];
- }
- //======================================================================
- // iAD広告取得成功時
- //======================================================================
- - (void)bannerViewDidLoadAd:(ADBannerView *)banner{
- NSLog(@"iAd:bannerViewDidLoadAd");
- // AdMob非表示
- [self endAdMobAd];
- // iAdアニメーション表示
- bannerView.frame = CGRectMake(0.0,
- self.view.frame.size.height,
- banner.frame.size.width,
- banner.frame.size.height);
- [UIView beginAnimations:@"BannerViewMoveOnScreen" context:NULL];
- bannerView.frame = CGRectMake(0.0,
- self.view.frame.size.height - banner.frame.size.height,
- banner.frame.size.width,
- banner.frame.size.height);
- [UIView commitAnimations];
- }
- //======================================================================
- // iAD広告取得失敗時
- //======================================================================
- - (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error{
- NSLog(@"iAd:didFailToReceiveAdWithError:%@", [error localizedDescription]);
- // Admob開始
- [self startAdMobAd];
- // iADアニメーション非表示
- [UIView beginAnimations:@"BannerViewMoveOffScreen" context:NULL];
- bannerView.frame = CGRectMake(0.0,
- self.view.frame.size.height,
- banner.frame.size.width,
- banner.frame.size.height);
- [UIView commitAnimations];
- }
- //**********************************************************************
- // Admob関連
- //**********************************************************************
- //======================================================================
- // Admob広告開始
- //======================================================================
- - (void) startAdMobAd {
- if (!isEnableAdMob) {
- NSLog(@"AdMob:startAdMobAd:isEnableAdmob=%d", isEnableAdMob);
- // AdMob初期化
- adMobAd = [[GADBannerView alloc]
- initWithFrame:CGRectMake(0.0,
- self.view.frame.size.height,
- GAD_SIZE_320x50.width,
- GAD_SIZE_320x50.height)];
- adMobAd.adUnitID = MY_BANNER_UNIT_ID; // パブリッシャーID
- adMobAd.rootViewController = self;
- [self.view addSubview:adMobAd];
- adMobAd.delegate = self;
- GADRequest *request = [GADRequest request];
- request.testing = ADMOBAD_TESTING; // テストモード
- [adMobAd loadRequest:request];
- isEnableAdMob = YES;
- }
- }
- //======================================================================
- // Admob広告終了
- //======================================================================
- - (void) endAdMobAd {
- if (isEnableAdMob) {
- NSLog(@"AdMob:endAdMobAd:isEnableAdmob=%d", isEnableAdMob);
- // AdMobアニメーション非表示
- [UIView beginAnimations:@"AdMobBannerMoveOffScreen" context:NULL];
- adMobAd.frame = CGRectMake(0.0,
- self.view.frame.size.height,
- GAD_SIZE_320x50.width,
- GAD_SIZE_320x50.height);
- [UIView commitAnimations];
- // Admobリリース
- [adMobAd removeFromSuperview];
- adMobAd.delegate = nil;
- [adMobAd release];
- isEnableAdMob = NO;
- }
- }
- //======================================================================
- // Admob広告取得成功時
- //======================================================================
- - (void)adViewDidReceiveAd:(GADBannerView *)adMobView {
- NSLog(@"Admob:adViewDidReceiveAd");
- // AdMobアニメーション表示
- adMobAd.frame = CGRectMake(0.0,
- self.view.frame.size.height,
- adMobView.frame.size.width,
- adMobView.frame.size.height);
- [UIView beginAnimations:@"AdMobBannerMoveOnScreen" context:NULL];
- adMobAd.frame = CGRectMake(0.0,
- self.view.frame.size.height - adMobView.frame.size.height,
- adMobView.frame.size.width,
- adMobView.frame.size.height);
- [UIView commitAnimations];
- }
- //======================================================================
- // Admob広告取得失敗時
- //======================================================================
- - (void)adView:(GADBannerView *)adMobView didFailToReceiveAdWithError:(GADRequestError *)error {
- NSLog(@"Admob:didFailToReceiveAdWithError:%@", [error localizedDescription]);
- }
- @end
#import "viewController.h" @implementation:viewController #define MY_BANNER_UNIT_ID @"publisher id" // 自分のパブリッシャーIDを設定 #define ADMOBAD_TESTING YES // リリース時はNOにする BOOL isEnableAdMob = NO; ... //======================================================== // 起動時設定 //======================================================== - (void)viewDidLoad { [super viewDidLoad]; ... //iAd(OS4.0以上) if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0) { [self startiAd]; } else { [self startAdMobAd]; } ... } //======================================================== // メモリ解放 //======================================================== - (void)dealloc { [super dealloc]; ... //Admob if (isEnableAdMob) { adMobAd.delegate = nil; [adMobAd release]; } //iAd bannerView.delegate = nil; [bannerView release]; ... } ... ... ... ... #pragma mark iAd,Admob //********************************************************************** // iAd関連 //********************************************************************** //====================================================================== // iAD広告開始 //====================================================================== - (void) startiAd { NSLog(@"iAd:startiAd"); // iAd初期化 bannerView = [[ADBannerView alloc] init]; bannerView.delegate = self; // 広告サイズのiOSバージョン別設定 if (&ADBannerContentSizeIdentifierPortrait != nil) { bannerView.currentContentSizeIdentifier = ADBannerContentSizeIdentifierPortrait; }else { bannerView.currentContentSizeIdentifier = ADBannerContentSizeIdentifier320x50; } // 初期は隠す bannerView.frame = CGRectMake(0.0, self.view.frame.size.height, bannerView.frame.size.width, bannerView.frame.size.height); [self.view addSubview:bannerView]; } //====================================================================== // iAD広告取得成功時 //====================================================================== - (void)bannerViewDidLoadAd:(ADBannerView *)banner{ NSLog(@"iAd:bannerViewDidLoadAd"); // AdMob非表示 [self endAdMobAd]; // iAdアニメーション表示 bannerView.frame = CGRectMake(0.0, self.view.frame.size.height, banner.frame.size.width, banner.frame.size.height); [UIView beginAnimations:@"BannerViewMoveOnScreen" context:NULL]; bannerView.frame = CGRectMake(0.0, self.view.frame.size.height - banner.frame.size.height, banner.frame.size.width, banner.frame.size.height); [UIView commitAnimations]; } //====================================================================== // iAD広告取得失敗時 //====================================================================== - (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error{ NSLog(@"iAd:didFailToReceiveAdWithError:%@", [error localizedDescription]); // Admob開始 [self startAdMobAd]; // iADアニメーション非表示 [UIView beginAnimations:@"BannerViewMoveOffScreen" context:NULL]; bannerView.frame = CGRectMake(0.0, self.view.frame.size.height, banner.frame.size.width, banner.frame.size.height); [UIView commitAnimations]; } //********************************************************************** // Admob関連 //********************************************************************** //====================================================================== // Admob広告開始 //====================================================================== - (void) startAdMobAd { if (!isEnableAdMob) { NSLog(@"AdMob:startAdMobAd:isEnableAdmob=%d", isEnableAdMob); // AdMob初期化 adMobAd = [[GADBannerView alloc] initWithFrame:CGRectMake(0.0, self.view.frame.size.height, GAD_SIZE_320x50.width, GAD_SIZE_320x50.height)]; adMobAd.adUnitID = MY_BANNER_UNIT_ID; // パブリッシャーID adMobAd.rootViewController = self; [self.view addSubview:adMobAd]; adMobAd.delegate = self; GADRequest *request = [GADRequest request]; request.testing = ADMOBAD_TESTING; // テストモード [adMobAd loadRequest:request]; isEnableAdMob = YES; } } //====================================================================== // Admob広告終了 //====================================================================== - (void) endAdMobAd { if (isEnableAdMob) { NSLog(@"AdMob:endAdMobAd:isEnableAdmob=%d", isEnableAdMob); // AdMobアニメーション非表示 [UIView beginAnimations:@"AdMobBannerMoveOffScreen" context:NULL]; adMobAd.frame = CGRectMake(0.0, self.view.frame.size.height, GAD_SIZE_320x50.width, GAD_SIZE_320x50.height); [UIView commitAnimations]; // Admobリリース [adMobAd removeFromSuperview]; adMobAd.delegate = nil; [adMobAd release]; isEnableAdMob = NO; } } //====================================================================== // Admob広告取得成功時 //====================================================================== - (void)adViewDidReceiveAd:(GADBannerView *)adMobView { NSLog(@"Admob:adViewDidReceiveAd"); // AdMobアニメーション表示 adMobAd.frame = CGRectMake(0.0, self.view.frame.size.height, adMobView.frame.size.width, adMobView.frame.size.height); [UIView beginAnimations:@"AdMobBannerMoveOnScreen" context:NULL]; adMobAd.frame = CGRectMake(0.0, self.view.frame.size.height - adMobView.frame.size.height, adMobView.frame.size.width, adMobView.frame.size.height); [UIView commitAnimations]; } //====================================================================== // Admob広告取得失敗時 //====================================================================== - (void)adView:(GADBannerView *)adMobView didFailToReceiveAdWithError:(GADRequestError *)error { NSLog(@"Admob:didFailToReceiveAdWithError:%@", [error localizedDescription]); } @end
2011年2月28日月曜日
2011年2月26日土曜日
SyntaxHighlighterをBlogでつかう
クリボウの Blogger Tips: コードをハイライトする「Blogger Syntax ...
これ参考に導入してみた。やり方はそのまんまなんだけど、MacのChromeでやるとうまくいかなかったので、メモ・・・
普通は↓の画面が出るんだけど、
バージョンによるかもしれんけど、MacのChromeだと・・・
こんな感じでバグって、一応Add to Bloggerボタンは押せるけど、コレで登録しても全然ハイライトが有効にならなくてチョットハマった・・・
一応Chromeのバージョンは・・・
でも、Objective-Cは対応してないんだね・・・
これ参考に導入してみた。やり方はそのまんまなんだけど、MacのChromeでやるとうまくいかなかったので、メモ・・・
普通は↓の画面が出るんだけど、
バージョンによるかもしれんけど、MacのChromeだと・・・
こんな感じでバグって、一応Add to Bloggerボタンは押せるけど、コレで登録しても全然ハイライトが有効にならなくてチョットハマった・・・
一応Chromeのバージョンは・・・
でも、Objective-Cは対応してないんだね・・・
2011年2月25日金曜日
iAdをメインにしてAdmobをバックアップとして設置
とりあえず、かなり前にiAdの勉強がてら、リリースしたShot Clock Timer Freeだけど、iAdってとりあえず日本ではまだ始まってないし、スタートしてるアメリカとかでも表示率が100%ではない。なので、AdmobもしくはAdmobとのハイブリッドが理想型らしいけど、当時はAdmobの設置方法はちんぷんかんぷんだったので、ほったらかしてた。
最近ちょっとづつ分かってきたので、いろんなとこ調べながら、やってみました。
http://yayacocoa.blogspot.com/2010/11/iadadmob.html
http://xcodenoobies.blogspot.com/2011/01/how-to-integrate-iad-for-os32-and-admob.html
ここら辺りを参考に始めたけど、お世話になってる寺子屋サルできにて、よくわかるソースを発見!
iAdはOS4だけで動作するのでビルド設定に注意
コレを参考に、微妙に修正して組み込んでみました!
とりあえず、Admobの登録して、SDKをダウンロードして、
を組み込み。AdMobフォルダは
だけでもいいみたいだけどよくわかんないんで全部ぶち込みました。そして、以下のフレームワークを追加。
iAdはOS3.xをターゲットにするならiAdをweklinkにする必要あり。
で、Admobのサイトでパブリッシャーidをコピッてきて、
ここの「publisher id」に置き換え。で行けるはず。
あと、
ここの「Device identifier」にXcodeオーガナイザで確認できるDevice identifierを入れると、実機でもテスト広告が出る。ただし、Admobのサイトのアプリ設定で、テストモードを無効化してると、意味はない。
後は、コンソールをみながら、
でiAdのテスト広告が表示されて、
でAdmobの広告がでればOK!・・・かと思われる。
うまくいけば暫く待てばfailしてくれるが、もしかしたらずっとloadしてるとAdmobの確認ができないかもしれない・・・
ちなみにオリジナルからいじった所は、viewDidLoadのAdmobの部分で、起動時には一旦、hiddenをYESにして、moveBannerViewOffScreenの部分でNOにしたところです。
iAdの読み込みには少し時間がかかるみたいで、起動時にiAdもAdmobも両方取得成功したときに、広告表示が、Admob->iAdとばたついて表示されるのを防ぐためです。
ただ、一時も広告の非表示時間を減らしたくない場合は得策でない場合がありますね。
また、Admobメインで考えるなら、逆にしたほうがいいでしょう。
「...」はアプリそれぞれのコードが入っていることを表しています。
↓以下サンプルソース
*.h
*.m
最近ちょっとづつ分かってきたので、いろんなとこ調べながら、やってみました。
http://yayacocoa.blogspot.com/2010/11/iadadmob.html
http://xcodenoobies.blogspot.com/2011/01/how-to-integrate-iad-for-os32-and-admob.html
ここら辺りを参考に始めたけど、お世話になってる寺子屋サルできにて、よくわかるソースを発見!
iAdはOS4だけで動作するのでビルド設定に注意
コレを参考に、微妙に修正して組み込んでみました!
とりあえず、Admobの登録して、SDKをダウンロードして、
- AdMob
- TouchJSON
を組み込み。AdMobフォルダは
- AdMobDelegateProtocol.h
- AdMobView.h
- libAdMob.a
だけでもいいみたいだけどよくわかんないんで全部ぶち込みました。そして、以下のフレームワークを追加。
- AudioToolbox
- CoreGraphics
- MediaPlayer
- MessageUI
- QuartzCore
- iAd
iAdはOS3.xをターゲットにするならiAdをweklinkにする必要あり。
で、Admobのサイトでパブリッシャーidをコピッてきて、
- //========================================================
- // publisher id
- //========================================================
- - (NSString *)publisherIdForAd:(AdMobView *)adView {
- return @"publisher id";
- }
//======================================================== // publisher id //======================================================== - (NSString *)publisherIdForAd:(AdMobView *)adView { return @"publisher id"; }
ここの「publisher id」に置き換え。で行けるはず。
あと、
- //========================================================
- // Admobテスト用設定 リリース時にはコメントアウト?
- //========================================================
- //*/
- - (NSArray *)testDevices {
- return [NSArray arrayWithObjects:
- ADMOB_SIMULATOR_ID, // Simulator
- @"Device identifier", // Xオーガナイザで確認
- nil];
- }
- ///*
//======================================================== // Admobテスト用設定 リリース時にはコメントアウト? //======================================================== //*/ - (NSArray *)testDevices { return [NSArray arrayWithObjects: ADMOB_SIMULATOR_ID, // Simulator @"Device identifier", // Xオーガナイザで確認 nil]; } ///*
ここの「Device identifier」にXcodeオーガナイザで確認できるDevice identifierを入れると、実機でもテスト広告が出る。ただし、Admobのサイトのアプリ設定で、テストモードを無効化してると、意味はない。
後は、コンソールをみながら、
iAd: Did load ad
でiAdのテスト広告が表示されて、
iAd: Did fail to receive ad
でAdmobの広告がでればOK!・・・かと思われる。
うまくいけば暫く待てばfailしてくれるが、もしかしたらずっとloadしてるとAdmobの確認ができないかもしれない・・・
ちなみにオリジナルからいじった所は、viewDidLoadのAdmobの部分で、起動時には一旦、hiddenをYESにして、moveBannerViewOffScreenの部分でNOにしたところです。
iAdの読み込みには少し時間がかかるみたいで、起動時にiAdもAdmobも両方取得成功したときに、広告表示が、Admob->iAdとばたついて表示されるのを防ぐためです。
ただ、一時も広告の非表示時間を減らしたくない場合は得策でない場合がありますね。
また、Admobメインで考えるなら、逆にしたほうがいいでしょう。
「...」はアプリそれぞれのコードが入っていることを表しています。
↓以下サンプルソース
*.h
- ...
- #import <iAd/iAd.h>
- #import "AdMobDelegateProtocol.h"
- ...
- @interface viewController :UiViewController < ... , ADBannerViewDelegate, AdMobDelegate>{
- ...
- AdMobView *adMobAd;
- ADBannerView *bannerView;
- ...
- }
- ...
- - (void) moveBannerViewOnScreen;
- - (void) moveBannerViewOffScreen;
- ...
- @end
... #import <iAd/iAd.h> #import "AdMobDelegateProtocol.h" ... @interface viewController :UiViewController < ... , ADBannerViewDelegate, AdMobDelegate>{ ... AdMobView *adMobAd; ADBannerView *bannerView; ... } ... - (void) moveBannerViewOnScreen; - (void) moveBannerViewOffScreen; ... @end
*.m
- #import "viewController.h"
- #import "AdMobView.h"
- @implementation:viewController
- ...
- //========================================================
- // 起動時設定
- //========================================================
- - (void)viewDidLoad {
- ...
- //iAd(OS4.0以上)
- if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0) {
- bannerView = [[ADBannerView alloc] init];
- bannerView.delegate = self;
- [self.view addSubview:bannerView];
- [self moveBannerViewOffScreen];
- }
- //Admob
- adMobAd = [AdMobView requestAdWithDelegate:self];
- [adMobAd retain];
- adMobAd.hidden = YES;
- ...
- }
- //========================================================
- // メモリ解放
- //========================================================
- - (void)dealloc {
- ...
- //Admob
- [adMobAd release];
- //iAd
- bannerView.delegate = nil;
- [bannerView release];
- ...
- }
- ...
- ...
- ...
- ...
- #pragma mark iAd,Admob
- //**********************************************************
- // iAd⇔Admob切り替え
- //**********************************************************
- //========================================================
- // iAd広告表示
- //========================================================
- - (void) moveBannerViewOnScreen {
- //Admob広告を隠す
- if (adMobAd != nil) {
- if (adMobAd.frame.origin.y == self.view.frame.size.height -48) {
- CGRect frame = self.view.frame;
- adMobAd.frame = CGRectMake(0, frame.size.height, frame.size.width, 48);
- }
- }
- //iAd広告を表示
- CGRect newBannerView = self.view.frame;
- newBannerView.origin.y = self.view.frame.size.height - bannerView.frame.size.height;
- [UIView beginAnimations:@"BannerViewIntro" context:NULL];
- bannerView.frame = newBannerView;
- [UIView commitAnimations];
- }
- //========================================================
- // iAd広告非表示
- //========================================================
- - (void) moveBannerViewOffScreen {
- //iAd広告を隠す
- CGRect newBannerView = self.view.frame;
- newBannerView.origin.y = self.view.frame.size.height;
- bannerView.frame = newBannerView;
- //Admob広告を表示
- adMobAd.hidden = NO;
- if (adMobAd != nil) {
- if (adMobAd.frame.origin.y == self.view.frame.size.height) {
- CGRect frame = self.view.frame;
- [UIView beginAnimations:@"AdMobBanner" context:NULL];
- adMobAd.frame = CGRectMake(0, frame.size.height - 48, frame.size.width, 48);
- [UIView commitAnimations];
- }
- }
- }
- //**********************************************************
- // iAd関連
- //**********************************************************
- //========================================================
- // iAD広告取得成功時
- //========================================================
- - (void)bannerViewDidLoadAd:(ADBannerView *)banner{
- NSLog(@"iAd: Did load ad");
- //Admob広告非表示->iAd広告表示
- [self moveBannerViewOnScreen];
- }
- //========================================================
- // iAD広告取得失敗時
- //========================================================
- - (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error{
- NSLog(@"iAd: Did fail to receive ad");
- //iAd広告非表示->Admob広告表示
- [self moveBannerViewOffScreen] ;
- }
- //**********************************************************
- // Admob関連
- //**********************************************************
- //========================================================
- // publisher id
- //========================================================
- - (NSString *)publisherIdForAd:(AdMobView *)adView {
- return @"publisher id";
- }
- //========================================================
- // current view controller
- //========================================================
- - (UIViewController *)currentViewControllerForAd:(AdMobView *)adView {
- return self;
- }
- //========================================================
- // Admob広告取得成功時
- //========================================================
- - (void)didReceiveAd:(AdMobView *)adView {
- NSLog(@"Admob: Did receive ad");
- CGRect frame = self.view.frame;
- adMobAd.frame = CGRectMake(0, frame.size.height, frame.size.width, 48);
- [self.view addSubview:adMobAd];
- [UIView beginAnimations:@"AdMobBannerstart" context:NULL];
- adMobAd.frame = CGRectMake(0, frame.size.height - 48, frame.size.width, 48);
- [UIView commitAnimations];
- }
- //========================================================
- // Admob広告取得失敗時
- //========================================================
- - (void)didFailToReceiveAd:(AdMobView *)adView {
- NSLog(@"Admob: Did fail receive ad");
- [adMobAd removeFromSuperview];
- [adMobAd release];
- adMobAd = nil;
- }
- //========================================================
- // Admobテスト用設定 リリース時にはコメントアウト?
- //========================================================
- //*/
- - (NSArray *)testDevices {
- return [NSArray arrayWithObjects:
- ADMOB_SIMULATOR_ID, // Simulator
- //@"Device identifier", // Xオーガナイザで確認
- nil];
- }
- ///*
- ...
- ...
- ...
- ...
- @end
#import "viewController.h" #import "AdMobView.h" @implementation:viewController ... //======================================================== // 起動時設定 //======================================================== - (void)viewDidLoad { ... //iAd(OS4.0以上) if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0) { bannerView = [[ADBannerView alloc] init]; bannerView.delegate = self; [self.view addSubview:bannerView]; [self moveBannerViewOffScreen]; } //Admob adMobAd = [AdMobView requestAdWithDelegate:self]; [adMobAd retain]; adMobAd.hidden = YES; ... } //======================================================== // メモリ解放 //======================================================== - (void)dealloc { ... //Admob [adMobAd release]; //iAd bannerView.delegate = nil; [bannerView release]; ... } ... ... ... ... #pragma mark iAd,Admob //********************************************************** // iAd⇔Admob切り替え //********************************************************** //======================================================== // iAd広告表示 //======================================================== - (void) moveBannerViewOnScreen { //Admob広告を隠す if (adMobAd != nil) { if (adMobAd.frame.origin.y == self.view.frame.size.height -48) { CGRect frame = self.view.frame; adMobAd.frame = CGRectMake(0, frame.size.height, frame.size.width, 48); } } //iAd広告を表示 CGRect newBannerView = self.view.frame; newBannerView.origin.y = self.view.frame.size.height - bannerView.frame.size.height; [UIView beginAnimations:@"BannerViewIntro" context:NULL]; bannerView.frame = newBannerView; [UIView commitAnimations]; } //======================================================== // iAd広告非表示 //======================================================== - (void) moveBannerViewOffScreen { //iAd広告を隠す CGRect newBannerView = self.view.frame; newBannerView.origin.y = self.view.frame.size.height; bannerView.frame = newBannerView; //Admob広告を表示 adMobAd.hidden = NO; if (adMobAd != nil) { if (adMobAd.frame.origin.y == self.view.frame.size.height) { CGRect frame = self.view.frame; [UIView beginAnimations:@"AdMobBanner" context:NULL]; adMobAd.frame = CGRectMake(0, frame.size.height - 48, frame.size.width, 48); [UIView commitAnimations]; } } } //********************************************************** // iAd関連 //********************************************************** //======================================================== // iAD広告取得成功時 //======================================================== - (void)bannerViewDidLoadAd:(ADBannerView *)banner{ NSLog(@"iAd: Did load ad"); //Admob広告非表示->iAd広告表示 [self moveBannerViewOnScreen]; } //======================================================== // iAD広告取得失敗時 //======================================================== - (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error{ NSLog(@"iAd: Did fail to receive ad"); //iAd広告非表示->Admob広告表示 [self moveBannerViewOffScreen] ; } //********************************************************** // Admob関連 //********************************************************** //======================================================== // publisher id //======================================================== - (NSString *)publisherIdForAd:(AdMobView *)adView { return @"publisher id"; } //======================================================== // current view controller //======================================================== - (UIViewController *)currentViewControllerForAd:(AdMobView *)adView { return self; } //======================================================== // Admob広告取得成功時 //======================================================== - (void)didReceiveAd:(AdMobView *)adView { NSLog(@"Admob: Did receive ad"); CGRect frame = self.view.frame; adMobAd.frame = CGRectMake(0, frame.size.height, frame.size.width, 48); [self.view addSubview:adMobAd]; [UIView beginAnimations:@"AdMobBannerstart" context:NULL]; adMobAd.frame = CGRectMake(0, frame.size.height - 48, frame.size.width, 48); [UIView commitAnimations]; } //======================================================== // Admob広告取得失敗時 //======================================================== - (void)didFailToReceiveAd:(AdMobView *)adView { NSLog(@"Admob: Did fail receive ad"); [adMobAd removeFromSuperview]; [adMobAd release]; adMobAd = nil; } //======================================================== // Admobテスト用設定 リリース時にはコメントアウト? //======================================================== //*/ - (NSArray *)testDevices { return [NSArray arrayWithObjects: ADMOB_SIMULATOR_ID, // Simulator //@"Device identifier", // Xオーガナイザで確認 nil]; } ///* ... ... ... ... @end
iMacかMacBookか・・・
いや、別に買わないですよ。。。でも、前のMacデビュー機のMacBook(early 2008)からもうすぐ3年。ボチボチと考えちゃうわけですよ。前のは入門機的に勝ったんで、そろそろね・・・
でもって、今日発表されましたよね!これ。

うーん。素敵・・・・
ただ、iMacの新しいのももうすぐって噂もあるし、そうなると、デスクトップか・・・ノートか・・・
スペック的にはもちろんiMacとなるんでしょう。画面の大きさを始め、その他も・・・(現時点ではMacBook Proの方がスペック上かも知れんけど、次のは併せてくるでしょ?クァッドコアとか)
で、圧倒的に持ち出す事なんて少ないし、MacBookが余ってくるんだから、いざとなったら引っ張り出せばいい。って事でiMacなのかな・・・ただ、MacBook Proかっこいい・・・
iMacとAirで20弱か・・・イヤイヤ。
でもって、今日発表されましたよね!これ。
うーん。素敵・・・・
ただ、iMacの新しいのももうすぐって噂もあるし、そうなると、デスクトップか・・・ノートか・・・
スペック的にはもちろんiMacとなるんでしょう。画面の大きさを始め、その他も・・・(現時点ではMacBook Proの方がスペック上かも知れんけど、次のは併せてくるでしょ?クァッドコアとか)
で、圧倒的に持ち出す事なんて少ないし、MacBookが余ってくるんだから、いざとなったら引っ張り出せばいい。って事でiMacなのかな・・・ただ、MacBook Proかっこいい・・・
iMacとAirで20弱か・・・イヤイヤ。
2011年2月22日火曜日
B-Ball Score Book iPadでのバグ修正版はもうすぐ
B-Ball Score Bookにて、iPadで試合結果を送信した後にフリーズするバグの報告をメールで貰った。ありがたい・・・
日曜日に申請だしたので、今週中には公開されるはず!
当現象がでてる方、ご迷惑をおかけしますが、もう少し我慢を・・・
2/25 追記
修正版が公開されました!!
日曜日に申請だしたので、今週中には公開されるはず!
当現象がでてる方、ご迷惑をおかけしますが、もう少し我慢を・・・
2/25 追記
修正版が公開されました!!
2011年2月21日月曜日
サルできさんにて公認もらいました!
【サルでき公認アプリ】GT.BLEDS3作品 リリース!
独自の切り口で、iPhoneアプリの開発を応援してくれているサイトにて、私の作ったアプリを紹介してもらいました!少し恥ずかしいですが・・・
サルにもできるiPhoneアプリの作り方
独自の切り口で、iPhoneアプリの開発を応援してくれているサイトにて、私の作ったアプリを紹介してもらいました!少し恥ずかしいですが・・・
サルにもできるiPhoneアプリの作り方
登録:
投稿 (Atom)