ラベル iPhone の投稿を表示しています。 すべての投稿を表示
ラベル iPhone の投稿を表示しています。 すべての投稿を表示

2013/03/10

NSNotificationCenterの通知を受け取るときにちょっとハマったケース

非同期で処理を行いたい時には欠かせないNSNotificationCenterですが、とあるケースで通知が受け取れずにハマったので、ブログに書いておこうと思います。

NSNotificationCenterを使う最もポピュラーなケースとしては、非同期で通信を行い(NSObjectのサブクラス等)、受け取った結果を画面(UIViewControllerのサブクラス)に通知して反映する場合だと思います。大抵のサンプルもそれを前提にしていますよね?

今回やりたかったケースでは、画面と通信を行うクラスの間に通信を管理するクラスを作り、画面⇄管理⇄通信というふうに連携します。つまりNSObject→UIViewControllerと通知を投げるパターンの他、NSObject→NSObjectと通知を投げるパターンが発生するのです。

このNSObjectからNSObjectへの通知がくせ者でした。

例えば、下記のように通知を投げるとします。
NSNotification *notification = [NSNotification notificationWithName:@"DownloadComplete" object:self];
[[NSNotificationCenter defaultCenter] postNotification:notification];
通常であればこのように受取側を書くと思います。
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self selector:@selector(receiveDownload) name:@"DownloadComplete" object:nil];
ところが、この記述ではreceiveDownloadメソッドは呼ばれません。(エラーも出ません)

色々調べた結果、今回のケース(NSObject→NSObject)では受取側を下記の様に記述しなければならないようです。
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserverForName:@"DownloadComplete"
                                        object:nil
                                         queue:nil
                                    usingBlock:^(NSNotification *note) {
                                        [self receiveDownload];
                                    }];
addObserver:selector:name:object:でなくaddObserverForName:object:queue:usingBlock:の方を使う必要があったようです。
これでDownloadCompleteの通知が投げられた際に、receiveDownloadメソッドが呼ばれるようになりしました。

めでたし、めでたし。

2012/11/22

XCodeプロジェクトに Facebook SDK for iOS を同梱する

https://developers.facebook.com/docs/getting-started/facebook-sdk-for-ios/3.1/
ここ↑のgetting-startedのインストール手順だと、SDKは~/Documents/FacebookSDKにインストールされて、プロジェクトとSDKとはリンクされてるだけです。

SDKの本体は、~/Documents/FacebookSDK/FacebookSDK.framework になるので、
Finder上で組み込みたいプロジェクト(.xcodeprojと同じ階層)にコピーしてから、同じようにプロジェクトに追加します。

XCodeで、TARGETS>BuildSettings>Framework Search Pathsの値がそのプロジェクトのあるパスになっていればOKです。
※値としてはこのような変数が設定されていればOK→ "$(SRCROOT)"
※既に一度getting-startedの手順にてインストールしたことがある場合は、SDKへのパスが絶対パスで設定されてしまっていると思います。それは削除しちゃいましょう

あとはFacebookSDKのimportがエラーにならなければ、正しく読み込めていることになります。

これで、プロジェクトにFacebook SDKを同梱できました。
開発マシンとリリース作業をするマシンが別な時などはこの方法で対応しようと思います。

2012/09/24

iPhoneアプリからPOSTしたデータの確認

iPhoneアプリからサーバへ画像をPOSTする機能を実装しているとき、サーバサイド(今回はPHP)の出力(printやechoなんか)がXCode側で見られなかったので(俺がやり方をしらないだけ?)、サーバ側のテストプログラムでファイルを出力して確認してた。

一応インターフェースは決まっているが、名前ぐらいなので、POSTができない場合に問題を切り分ける必要があった。
つまり、アプリからはちゃんと送れてるぞという主張の根拠を提示したかったわけだw

ネットでvar_dump()をファイル出力する方法を見つけたので、$_REQUESTと$_FILESの情報をそのままvar_dump()してファイルに書き出してみた。拡張子が.htmlなのは、var_dump()して出力される内容がhtmlだったから。ブラウザからも確認しやすくてスゲー便利。var_dump()サイコー!

<?php

/**
 ■POSTサンプル
 
*/ if (isset($_FILES['file_data']['tmp_name'])) { // リクエスト情報 $filename = '_REQUEST.html'; ob_start(); echo "var:\n"; var_dump($_REQUEST); $out = ob_get_contents(); ob_end_clean(); file_put_contents($filename, $out); // ファイル情報 $filename = '_FILES.html'; ob_start(); echo "var:\n"; var_dump($_FILES); $out = ob_get_contents(); ob_end_clean(); file_put_contents($filename, $out); // ファイルを移動 copy($_FILES['file_data']['tmp_name'], getcwd( )."/".$_FILES['file_data']['name']); }
※うーむ。SyntaxHighlighterがおかしいなぁ。コードの後に謎の空行がたくさん…

2012/02/02

Corona SDKで日本語のアプリ名をつける方法

昨日の勉強会でも質問に挙がっていましたが、最初問題になるところですよね。
ということで現状私がやっている方法をまとめてみました。


まずはiOSの場合。

build.settingsplist"CFBundleLocalizations"の設定を追加します。
下記の場合は"ja"と"en"を設定しました。
※plist周りについてはネイティブでの開発の情報をググるといいと思います

--build.settings(抜粋)
settings =
{
  ...
  iphone =
  {
    plist =
    {
      CFBundleLocalizations = {
        "ja",
        "en",
      },
      ...
  },
  ...
}
さらに追加した言語にあわせ下記のようにファイル
ja.lproj > InfoPlist.strings
en.lproj > InfoPlist.strings
を作成します。


それぞれファイル内には"CFBundleDisplayName"を設定します。

・ja.lproj/InfoPlist.strings
CFBundleDisplayName = "なでうさぎ";


・en.lproj/InfoPlist.strings
CFBundleDisplayName = "NadeUsagi";


これでビルドするとiPhoneの言語環境が日本語の場合は「なでうさぎ」と表示され、英語の場合は「NadeUsagi」と表示されるアプリになります。


※日本語および英語以外の場合も「NadeUsagi」と表示されるようです。
 他2〜3言語で試した限りはそうでした
※言語コードを増やせば他言語のアプリ名も付けられるようになります
※Buildダイアログの「Application name:」は「nadeusagi」のまま変更は加えていません
※ひとつのバイナリで言語に合わせたアプリ名に出し分けることが可能ということになります


さて次はAndroidの場合です

Buildダイアログの「Application name:」を変更します。
日本語のアプリ名にしたい場合は「nadeusagi」を「なでうさぎ」と変更してビルドします。


簡単ですね。といきたいところですが、このアプリは日本語以外の環境でも「なでうさぎ」と表示されます。

※残念ながらひとつのバイナリで言語に合わせたアプリ名に出し分けることはできないようです
こうやればできるといった情報をお持ちの方がいらっしゃったら、ぜひご教授ください。

日本でしかリリースしないアプリであればこれでOKだと思いますが、ビジネス的にはそんなことは考えにくいので、アプリのリリース先(国)との兼ね合いで別アプリにするとか、英語名に統一するとかの判断が必要なのかも知れませんね。

そういえば以前Coronaの会のMLに投稿された日本語+半角英字のアプリ名も実機転送までは問題なくできました。すでに修正されてるみたいです。


ちなみに、アプリ内のテキストを言語毎に切り替えて多言語対応のアプリにしたい場合は、下記のブログで紹介されている方法がわかりやすかったです。

Corona SDK: Localization made easy - BLOG - Monkeybin
http://monkeybin.no/blog/archives/2011/09/18/corona-sdk-localization-made-easy/

2012/01/04

アイコン/スプラッシュ画像の確認にCorona SDKを使う

スマートフォン関連のデザインをやっていると、PCの画面で見ている時と、実際にデバイス上に落とし込んで見ている時の印象の違いに「ほぅ!」って思うことも多々あります。(※イメージと違うわーってことです)

特にアイコンやスプラッシュ画像をデザインする際は、ロゴが潰れてないか、文字が読めるのか、またiPhone/iPad/Androidで画面サイズや画角が異なっているので、それぞれにバランスを調整しつつレイアウトしたりと(単純にリサイズしているだけじゃないんですよー。下記の画像を見比べてみてくださいねw)、気を遣う部分も多いので、必ず実機にインストールした状態での確認が不可欠です。

自作のアプリであれば開発の最終段階あたりで作業するので、実機にインストールしての確認も何ら問題なくできるのですが、アイコン/スプラッシュ画像のデザインのみ依頼を受けた場合等、組み込むアプリが手元にない場合はダミーのアプリを作って確認することになります。

前置きが長くなりましたが、ここからが本題です。
確認用のダミーアプリには「Corona SDK」が向いているということに気付きました。

私の場合はiPhone/iPad/Androidのダミーアプリをそれぞれ用意し、スプラッシュ画像をスプラッシュとしてではなく、アプリの背景画像として使用することで、じっくり確認できるようにしています。そして、このダミーアプリの画像(複数解像度のアイコンおよびスプラッシュ)を上書き>ビルド>実機転送>確認のサイクルを繰り返してブラッシュアップを行っています。

もう少しメリットを具体的にいうと
コードが短い(さらにファイル一式用意してしまえば、後は画像の差し替えのみ)
アプリ名をビルド時に変えられる(フォルダ名を変えてしまうのでもOK)
IDEに縛られない(自由だし小回り効くし)

といったところでしょうか。
なお実機転送は無料トライアル版でも可能です。



こちらは昨年末、株式会社あゆた様のご依頼で作成したものです。上記以外にもストア/マーケット用の画像も作成させていただきました。ARを使ったおもしろいアプリですので、一度お試しあれ。詳細はリンク先ページにて。

[iPhone,iPad,Android] "Christmas on a table AR" / "机の上のクリスマスAR"

2011/09/16

Corona SDKでアプリをリリースする際に起こった「えっ!?」ってこと

Corona SDKでのアプリ開発では、色々と問題も起きます。今回はちょっとキビシイ現実を書きます。

下記は「Cutie Horoscope」のbuild.settingsファイルの中身です。

settings =
{
  iphone =
  {
    plist =
    {
      MinimumOSVersion="4.0",
    },
  },
  android =
  {
    versionCode="2",
    versionName="1.1",
    installLocation="preferExternal",
  },
}

まず、iOS向けに「MinimumOSVersion="4.0"」が設定してあります。
これはiTunes Connectにファイルを送信し終えた時に、たまたまBinary Detailsをクリックすると、なんということでしょう「Minimum OS Requirements」が「3.1」に、そして「Supported Architecture」が「armv6, armv7」になっているではありませんか!
「Coronaは4以上で固定ではなかったのかよ〜」と、あわててファイルを削除し、「MinimumOSVersion="4.0"」を加えることによって回避することにしました。実際に最初にUPした設定のファイルをオーガナイザ経由で第1世代のiPod touch(iOS 3.1.3、armv6)の端末にインストールすることが可能でした。(起動はしますが、表示が崩れるとか使えない状態だったので、気付かなかったら、非常に危ないところでした)
Daily Build版を使用しているので、たまたまデグレが起こったのかも知れませんが、今後「MinimumOSVersion」は必ず設定しようと決めました。

次にAndroid向けに「installLocation="preferExternal"」が設定してあります。
これもおかしな現象なのですが、デバッグ・ビルドにおいては、端末にインストールしたアプリはSDカードに移動可能でしたので、デフォルトでそうゆう設定になっているのだろうと思っていたのですが、いざリリースしてみると、SDカードに移動できません。なんでやねん!ってことで、すぐさま修正版をリリースすることに。
※アプリの動作には関係ないですが、アプリのファイル容量が大きいので必ずやっておきたい設定です

まあこんな感じで、Coronaでの初リリースで色々とトラブル?に見舞われました。もしこのトラブルがだれか他の方に起こり「Corona使えねぇよ!クソがっ!」って評価をされていても、しょうがないと思います。実際半分ぐらい私もそう思っています。
※これは評価されるタイミングに用意できてない方が悪いので

あと「versionName="1.1"」ってなってますが、マーケットでの表示は「1.0」のママです。中の人はあまり細かいことには関心がないのかも知れません。

今回は否定的な事も含め、こうゆう現実があることも知っていて欲しいと思い、起こったことを書きました。
しかしながら、Corona SDKが私にとって作りたいと思ったアプリを一番作りやすかった開発環境であることには変わりませんので、この状態が続く限り、Coronaを使っていると思います。

この記事が、同じように躓いたりハマったりすることがあった方に、少しでも役に立てたら嬉しいです。

※私はアンスカのまわし者ではないですし、正直Coronaを広めたいとか考えていません
※人に「ぜひ使うべき」とか「勧めやすい」とは思っていないという意味です

タブレット向けにアプリ作りたいなぁ。

2011/08/31

Corona SDKでiPhone/Androidアプリをリリース

【予告】Corona SDKでiPhone/Androidアプリをリリース(予定)で予告したアプリをリリースしました。

アプリ紹介サイト
iTunesストア
Androidマーケット




スクリーンショットを見ていただければ分かるように、女性をターゲットにしたアプリです。
※動画はiPhoneで見せていますが、Androidでも全く同じUI(デザイン)です

このアプリをひと言で表すと「ピンク色の端末に似合うアプリ」です。

Corona SDKでアプリ開発をしようと思った経緯は前回書いた通りなのですが、実際にアプリのアイデアを検討している際に、以下の点から、本アプリを開発することを決定しました。

・無料の星占いAPIを見つけた点
(試してもらうために無料アプリとしてリリースしたかったので)

・カスタマイズ度の高いアプリとして女性向けにデザインされたアプリというのが合致している点
(女性向けというのはある意味分かりやすいかな?いや難しいか?)

・同類アプリが数多くリリースされている中で、デザインの差別化がどれだけ通用するか見たかった点
(本当にデザインは重要なのか? また、通用するデザインをつくることができるのか?)

・自分自身あまりやらないテイストのデザインに挑戦したかった点
(個人的なテイストとはかけはなれているので、デザインには通常よりも時間がかかりました。しかしながら、デザイナとして要件を満たすデザインは出来なくては!また出来るからこそデザイナです)

Corona SDKで開発したアプリ、しかもゲームではなくツール系で、なおかつ上記のような意味合いも含んだテストケースアプリとして、どこまでの結果が残せるか期待も込めて、しばらくは見守っていきたいと思っています。
※もちろんメンテナンス的アップデートや、プロモーション的なことはやっていきますよ!

ぜひダウンロードしてみてください m(_ _)m

Cutie Horoscope - keygx
Cutie Horoscope - keygx

Cross-platform Mobile App Development Showcase


2011/04/15

Titanium Mobileで開発したiPhoneアプリをリリース(その2)

前回に引き続き、今回はTitanium Mobileで開発している時に調べたこと、教えていただいたこと等をご紹介したいと思います。

まずアプリの基本的な部分はgihyo.jpの連載を参考にさせていただきました。UIがツイッタークライアントと似ている部分も多く、大変参考になりました。

その他に開発過程で挙がった課題について書いて行きます。
日本語のアプリ名
ImageViewの画像リサイズとデフォルト設定
Safariで開く
admobを仕込む
ビルド


日本語のアプリ名
Titanium Developerでプロジェクトを作成する際にアプリ名を英語で付けていましたが、最終的にはAndroid版と同じ「ぐぐっと!急上昇ワード」としてリリースしたいと思いました。

titanium-mobile-doc-ja
iOS系の場合はbuildフォルダに生成されたInfo.plistを加工後、プロジェクト直下に配置しておけばOK。
との記述が

Info.plist(一部抜粋)

 CFBundleDevelopmentRegion
 Japanese
 CFBundleDisplayName
 ぐぐっと!
 ...

1行に入るように「ぐぐっと!」だけ入れてますが、これで日本語アプリ名が表示されるようになりました。

また、Titanium BBS(JP unofficial)によるとAndroidでも可能なようです。



ImageViewの画像リサイズとデフォルト設定
キーワードに合わせてサムネール画像を取得している関係で、都度画像サイズが異なります。
そこで画像取得後リサイズしたいのですが、その方法とデフォルト画像を設定するとさらに良いのではと思います。

app.js (一部抜粋)
var thumb_img = Ti.UI.createImageView({
  defaultImage:'./images/default_image.png', //デフォルト画像を指定
  image:encodeURI(画像ファイルのURL),
 width:'auto',
 height:'auto'
});
// 画像読み込み完了時のイベント
thumb_img.addEventListener('load', function(e){
  // height 170以上の場合縮小
  if(.height>170){
    thumb_img.width = thumb_img.width*(170/thumb_img.height);
    thumb_img.height = 170;
  }
});
view.add(thumb_img);
読み込み完了後にリサイズ処理が走りますので、画面表示後、縮小された画像が表示されるまで多少タイムラグがあったりします。
なので実際に表示したい画像が表示されるまでのつなぎ、および最終形に近いサイズでの領域確保の意味合いもあります。
また、デフォルト画像を指定すると、画像の取得に失敗してもデフォルト画像が表示されているので、ごまかせたりもします。
今回のアプリでは画像があるというのがわかるようなデザインにしていますが、背景色と同じ画像を使ってもいいと思います。



Safariで開く
アプリ内でWebViewを使ってWebページを表示させ、ユーザーの任意の操作によってSafariを開きページを引き継ごうとした際に、すでにページ遷移している場合も考えて、現在表示されているページのURLを取得する必要があります。

app.js (一部抜粋)
// WebViewで現在表示しているページのURLを取得
webView.addEventListener('load', function(e){
  currentUrl = e.url;
});
// Safariで開く
btn_safari.addEventListener('click', function(){
  Titanium.Platform.openURL(currentUrl); //Safariで開く
});
WebView内でページがロードされるたびに、URLを取得しておきます。そいつを渡してやればOK!



admobを仕込む
Titaniumの開発元であるAppceleratorよりadmobモジュールが公開されたことで、Titanium Mobileで開発したアプリにも広告を掲載することが可能になりました。
モジュールの使い方がよくわからないので、Twitter経由で質問したところ、親切にもブログで解説していただいたので、参考にさせていただきました。

AdMobモジュールの設置方法

ダウンロードしてきたadmobモジュールを解凍しると、そのまま使える状態(ビルド済み)だったので、指定されたディレクトリにそのままコピーしました。
/Library/Application Support/Titanium/modules/iphone/ti.admob/......
↑こんな感じのパスになるように
※私が組み込んだ時点ではビルド不要だったのですが、今はビルドが必要との情報もあり

あとは、指定されたコードを追加します。
app.js (一部抜粋)
// admob
Titanium.Admob = require('ti.admob');
var adview = Titanium.Admob.createView({
  bottom:0,
  left:0,
 width:320,
  height:48,
 publisherId:'admobのパブリッシャーID'
});
win.add(adview);

tiapp.xml(一部抜粋)

  ...
 
    ti.admob
 

tiapp.xmlでは、最後あたりに追加すれば良いみたいです。

これで広告が表示されると思います。もうモジュールも怖くありません。

しかしadmobモジュールでハマった点がありました。何故か一番上(最初)のWindowでないと広告がタップできないのです。
アプリの作りが[リスト>詳細]となっていて、最初その詳細画面に設置していました。そうすると、広告は表示されるのですがタップできないという現象が…
回避方法が見つけられなかったので、一番上 のWindowにadmobを移動させました。何が悪いの?



ビルド
Titaniumでビルドするととても時間が掛かるようです。(私は途中でキャンセルしました)Titaniumで書き出されたXcodeのプロジェクトファイルをダブルクリックしてXcodeを起動してビルドした方が早いですし、実機転送やオーガナイザでの画面キャプチャなど、その後の作業がスムースに運んで幸せになれると思います。

ビルドやテスト、リリースについては、ネイティブ(というか通常のiPhone開発ですねw)での情報が入手しやすいです。
開発効率でTitanium mobileを選択したならば、いいとこ取りでいきましょー


開発中は必須のページ
下記は特にお世話になりました。
titanium-mobile-doc-ja
API Reference Guide
上記に書いてないことは、“titanium ○○○ ×××”見たいな感じでググって、根気よく探しています。
今後は、Titanium BBS辺りに集約されていくのかな?


以上、大したことない内容ですが、誰かのお役に立てば嬉しいです。


「ぐぐっと!急上昇ワード 」
ぐぐっと!急上昇ワード - keygx

2011/04/13

Titanium Mobileで開発したiPhoneアプリをリリース(その1)

リリース後2週間以上経ってしまいましたが、iPhoneアプリをリリースしたので、少々書き記しておきたいと思います。

アプリ名:ぐぐっと!急上昇ワード
価格:無料アプリ
動作環境:iOS3.1以降
リリース:3/27
対象地域:日本


ぐぐっと!急上昇ワード - keygx

去年リリースしたAndroidアプリ「ぐぐっと!急上昇ワード」が順調にDL数を伸ばし、「来月には5万DL突破だな」といった2月中旬「無料のAndroidアプリ(途中から広告入り)を開発&リリースし、運用してみて色々勉強になったけど、ここらで一段落かな。」と感じるようになり、「iPhoneアプリをやるしかない!」とiPhoneアプリ開発を決意しました。

実はTitanium Mobileを昨年末ぐらいにいじっていて、「ぐぐっと...」を途中まで作っていたのですが投げ出していて、今回iPhoneアプリを開発するにあたってはObjective-C(俺のC言語のスキルはさわり程度しかない)でやる!と意気込み、入門書を購入し、サンプルコードを参考に「ぐぐっと...」iPhone版を作り始めました。
ある程度まで進んだところで(偶然にもTitaniumで投げ出したのと同じようなところまでだった(^_^;))さて次はどうやるんだろうと試行錯誤モードの時に、気まぐれでTitaniumではどうやるんだろうとやってみると。。。アレ?なんか続きが出来たぞ!「このままTitanium Mobileで開発しよう」と、当初の意気込みは何処へやら、Titanium MobileのiPhoneアプリと相成ったという訳です。(Titaniumをいじろうと思ったのは、hidev勉強会でTitaniumやってる人が意外に多かったてのもあります)

その後はいくつかつまずくところがあったものの、比較的スムースに完成したのではないかと思います。
機能的にはAndroid版と同じものを目指しているので、粛々と実装をしていくだけだったのですが、INTENTでブラウザに処理を投げる&Backキーで戻るというAndroid的な処理ができないので、iPhone版はまずアプリ内ブラウザ(WebView)で見せて、Safariに引き継げるようにしたり、ナビゲーションをどのように実現するか(戻るキーとメニューキーの偉大さを実感)を考えないといけなかったりしたところが最大の課題だったともいえます。
※Titanium Mobileの開発で調べたことやTwitterで教えてもらったことは別途書こうと思います。

Developer登録でよくある問題に陥ったり、Reviewに時間がかかったり、といったことも経験しましたが、ググれば山のように出てくる話なので、ここでは割愛します。

余談ですが、Android版「ぐぐっと...」をリリースした時は、このジャンル(Google急上昇ワードのマッシュアップ)のアプリはiPhoneアプリの「トレ○ドなう」ぐらいだったと記憶していて、「ぐぐっと」はAndroidでは少なくとも先行者であると自負しています。今回iPhoneアプリを調べてみると、いくつかの類似アプリがリリースされていて、ひとつのジャンルが形成されていると感じました。(つまり、ニーズがあるということ)

iTunes Connectの見方がイマイチ分かりづらく、数字を読み間違えていないならば、リリース後2週間程で約5,000DLされた模様です。
この数字が多いのか少ないのかさえ分からない位、iPhoneアプリのノウハウを持ってないのですが、元々Long Termを狙ったアプリなので、今はあまり気にしないことにします。

今後もアプリの小さいアップデートを計画していますが、Android版も含めアプリとしての基本形は出来ていると思っています。
このアプリというかこのサービスを進化させていくためには、今後別のサービスとの連携が必要かなと思っていて、今それについて考えているところです。

とりあえず、技術的な話のない第一弾ということで。

次回に続く

ぐぐっと!急上昇ワード - keygx