2014年1月23日木曜日

duplicate symbolエラー

linker command failed with exit code 1 

同じ名前のクラス、変数、メソッドなどが使われている場合に発生します。変数、メソッドの場合はソース編集中に警告が出るので悩まされることはあまりないと思いますが、クラスの場合はビルドするとエラーが出ます。

ちなみに今回はcocos2dxを利用して以下処理を入れようとしたら発生

処理の流れ
1.Cocos2d-X上でスクリーンショットを撮って、ファイルに保存
 ↓
2.保存したファイルのパスを取得して、ネイティブに渡す
 ↓
3.ネイティブはパスから画像を取得し、ツイートする

(参考はこちら)http://d.hatena.ne.jp/okahiro_p/20130807/1375881600

ここでビルド時にエラーが出た。

どうやらandroidのファイルもxcode上のコンパイルに入っていることが要因

Build Phases から Compile Sources から 
android用のファイルを外すことで、無事回避できた。

■該当ファイル
NativeCodeLauncher.cpp

単純な話だが勉強になりましたのでメモ

Property 'viewcontroller' refers to an incomplete Objective-C class 'RootViewController' with no @interface(available)

Property 'viewcontroller' refers to an incomplete Objective-C class 'RootViewController' with no @interface(available)

本件のエラーが出た際の対応としては

該当のヘッダファイルに

@property(nonatomic, assign) RootViewController *viewController; 

そして.mmファイル側にも
@synthesize viewController; 

を追加する必要がある。

そうすればエラーは消える、忘れがちなのでメモ

2014年1月22日水曜日

time_t time の注意事項

なぜか

func (time_t time)

とメンバ関数を定義した後に、その関数内のロジックにて

time(&now)

と記載するとxcodeにてエラーになる

Called object type 'time_t' (aka 'long') is not a function or function pointer

どうやら関数内で定義した故のよう

備忘録のためメモ

2014年1月11日土曜日

"This bundle is invalid. when supporting iPhone, the executable must include support for armv6 architecture, unless the UIRequireDeviceCapabilities include the 'armv7' capability."

iOSを配布する際に少しはまったこと

"This bundle is invalid. when supporting iPhone, the executable must include support for armv6 architecture, unless the UIRequireDeviceCapabilities include the 'armv7' capability."

上記ログがvalidateする時に出た際には

Build Settings の iOS Deployment Target をiOS4.3以上にしなければならない 

参考URLはこちら

2014年1月9日木曜日

iOSにadmobを掲載する際に忘れがちなことBuild Phasesの設定

Build Phases→Link Binary with Libraries

ここにcocos2dxのフォルダにある

/cocos2d-x-2.2/cocos2dx/platform/third_party/ios/libraries/libcurl.a

/cocos2d-x-2.2/external/libwebsockets/ios/lib/libwebsockets.a

を追加する必要あり

忘れてめんどいこと多いので、メモ

2014年1月8日水曜日

iOSをリリースするまでの手順

非常にわかりやすいサイトがありましたので備忘録として
URLを残しておきます

http://dev.classmethod.jp/smartphone/iphone/ios-app-how-to-release/#toc--provisioning-profile-

http://www.raywenderlich.com/ja/44098/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92apple%E3%81%AB%E7%94%B3%E8%AB%8B%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%8B%E3%82%89

http://www.raywenderlich.com/ja/44102/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92apple%E3%81%AB%E7%94%B3%E8%AB%8B%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%8B%E3%82%89-2

2014年1月6日月曜日

iPhone アプリをローカライズするまでの手順をメモ


以下サイトより転機させて頂きました。
http://lab.dolice.net/blog/2013/04/17/xcode-localize/


iPhoneアプリをローカライズするまでの全スクリーンショット

iOSアプリをローカライズするまでの全スクリーンショットに手順を添えて紹介します。
下記にサンプルを用意しました。スクリーンショットも同梱しています。

サンプルダウンロード

スクリーンショットとローカライズ手順

1. PROJECT -> info -> Localizationsの項目に Japaniese (ja)を追加する

1. PROJECT -> info -> Localizationsの項目に Japaniese (ja)を追加する1. PROJECT -> info -> Localizationsの項目に Japaniese (ja)を追加する

2. MainStoryboard.storyboardと InfoPlist.stringsにチェックを入れて Finishを選択

2. MainStoryboard.storyboardと InfoPlist.stringsにチェックを入れて Finishを選択2. MainStoryboard.storyboardと InfoPlist.stringsにチェックを入れて Finishを選択

3. MainStoryboardが複製され、Japanieseと Englishの2つに分かれました

3. MainStoryboardが複製され、Japanieseと Englishの2つに分かれました3. MainStoryboardが複製され、Japanieseと Englishの2つに分かれました

4. Strings Filesを新規作成します

4. Strings Filesを新規作成します4. Strings Filesを新規作成します

5. ファイル名を「Localizable.strings」にします

5. ファイル名を「Localizable.strings」にします5. ファイル名を「Localizable.strings」にします

6. 作成した Localizable.stringsファイルを選択し、「Localize…」ボタンを押します

6. 作成した Localizable.stringsファイルを選択し、「Localize…」ボタンを押します6. 作成した Localizable.stringsファイルを選択し、「Localize…」ボタンを押します

7. Englishと Japanieseの両方にチェックを入れます

7. Englishと Japanieseの両方にチェックを入れます7. Englishと Japanieseの両方にチェックを入れます

8. Localizable.stringsファイルに各国の単語を定義します

8. Localizable.stringsファイルに各国の単語を定義します8. Localizable.stringsファイルに各国の単語を定義します

9. アプリ名とアプリアイコンの下に表示される名前を指定することも出来ます

9. アプリ名とアプリアイコンの下に表示される名前を指定することも出来ます9. アプリ名とアプリアイコンの下に表示される名前を指定することも出来ます

10. 「NSLocalizedStrings」にキーワードを指定すると、各国語に対応した単語が表示されます

10. 「NSLocalizedStrings」にキーワードを指定すると、各国語に対応した単語が表示されます10. 「NSLocalizedStrings」にキーワードを指定すると、各国語に対応した単語が表示されます

ソースコード

1
2
3
4
- (void)main
{
  NSLog(@"%@", NSLocalizedString(@"AppName", nil));
}

出力結果

システム言語を英語に設定していた場合

My Apps

システム言語を日本語に設定していた場合

マイアプリ

2014年1月5日日曜日

「月の満ち欠け」アプリの配信地域を増やしてみました

月の満ち欠けアプリは英語対応もしていたために、配信地域に公用語が英語の地域を増やしてみました。

気になるマーケティングデータがありましたら、公開しますので、
乞うご期待ください。


■アプリ名

月の満ち欠け〜本日の月は?〜

■価格
無料

cocos2d-xにおけるローカライズ(多言語対応)方法 CCLocalizedString2

Android.mkの追記方法は以下が正解だった。
こうしないとそもそも動かない


LOCAL_SRC_FILES := hellocpp/main.cpp \

                   ../../../../cocos2dx/platform/CCLocalizedString.cpp

2014年1月3日金曜日

cocos2d-xにおけるローカライズ(多言語対応)方法 CCLocalizedString



明日試してみたいと思うが以下メモを転機させて頂きました。



CCLocalizedString

(今更ですが)ローカライズのときに便利なCCLocalizedString関数を紹介します。iOSではNSLocalizedStringがありましたが、cocos2d-xには存在しません。そこで小 苏氏がCCLocalizedString関数を公開してくれているので、感謝しつつこれを利用しましょう。
ファイルはこちらからダウンロードできます。
http://www.cocos2d-x.org/boards/18/topics/14981?r=15087#message-15087
CCLocalizedString
しかし、最新バージョン(cocos2d-x 2.1.2)で利用するにはソースを編集しなければいけないので、導入手順も含めご紹介します。動作確認はiOSとAndroidで行っています。なお利用方法はNSLocalizedStringと同じです。

導入手順

  1. CCLocalizedString.cppの変更箇所は3ヶ所あります。
14行目 「cocoa/」を追加します。
?
1
#include "cocoa/CCString.h"
30行目 getCurrentLanguage関数の呼び出し方法変更
?
1
ccLanguageType curLanguage = CCApplication::sharedApplication()->getCurrentLanguage();
57行目 fullPathForFilename関数へ変更
?
1
fullPath = CCFileUtils::sharedFileUtils()->fullPathForFilename( fileName );

  1. ソースの配置
CCLocalizedString.h/.cppを
cocos2d-2.1rc0-x-2.1.2/cocos2dx/platform
へ配置します。

  1. cocos2d.hの編集
cocos2d-2.1rc0-x-2.1.2/cocos2dx/include/cocos2d.h
?
1
#include "platform/CCLocalizedString.h"
を追記します。

  1. プロジェクトへの取り込み
  • Androidの場合
cocos2d-2.1rc0-x-2.1.2/cocos2dx/Android.mk
上記ファイルにて、「LOCAL_SRC_FILES」に対して「platform/CCLocalizedString.cpp」を追加します。
?
1
2
LOCAL_SRC_FILES := \
platform/CCLocalizedString.cpp \
  • iOSの場合
Xcode上で、cocos2dxプロジェクトにCCLocalizedString.h/.cppを取り込みます。

利用方法

  1. CCLocalizedString.cppの修正
32行目よりローカライズの言語設定を行います。例えば、英語と日本語(デフォルト英語)に対応するのであれば、次のようにすれば良いでしょう。
?
1
2
3
4
5
6
7
8
switch (curLanguage) {
    case kLanguageJapanese:
        fileName = "Localized_ja";
        break;
    default:
        fileName = "Localized_en";
        break;
}

  1. ローカライズ用のファイルを作成する
1. で設定したファイル名のファイルを、Resourcesディレクトリに配置します。上記の場合は、
  •  Localized_en
  •  Localized_ja
を用意します。
ファイルの中身は
(キー) = “(表示する文字列)”;
の形式で記述します。例えば、キーが「HELLO」表示する文字列が「ハローワールド」の場合、
?
1
HELLO = "ハローワールド";
とします。

  1. ローカライズが必要な箇所にてCCLocalizedString関数を利用する。
CCLocalizedString関数の第1引数はキー、第2引数はコメントとなっています。NSLocalizedStringと同じですね。
?
1
2
string hoge = CCLocalizedString("HELLO", NULL);
string fuga = CCLocalizedString("HELLO", "はろーわーるど");
ただ毎回CCLocalizedStringと書くのは面倒なので、マクロ定義しておけば良いでしょう。
?
1
#define CCLS(key) CCLocalizedString(key, NULL)
すると、ソースがスッキリします。
?
1
string hoge = CCLS("HELLO");

  1. アプリの実行
画像だけでは判り難いですが、OSの言語設定を変更すると日本語と英語が切り替わります。
ローカライズ英語
ローカライズ日本語