UIActivityのその他(more)を押すとスクリーンの方向が変わる

uiactivity_more

UnityにてSocialConnectorを使って、シェア機能を使っていて遭遇したんですが、横向きのみのアプリでこのSocialConnectorを使って、iOSのUIActiveViewControllerを呼び出し、そこからその他(more)を押すと許可するメディアの一覧が出てきます。
そのタイミングで端末の回転にロックがかかっていなく、端末自体がアプリの方向とは違う方向に傾いているとUnityのスクリーンの方向(Screen.orientation)が変わってしまった。。(横向きアプリのはずが縦向きなどになる)
1度発生してしまうとUnity上でScreen.orientationを書き換えてももう直らない。。。
取れる方法は、Screen.orientationをみて、本来の値と違っていたらエラーを出すとかになるでしょうか。
Unityのバグなのか、UIActivityのバグなのか、、、SocialConnectorではなさそうな気はするけど。

UIActivityのローカライゼーション

Unityで、Social Connectorを使うと簡単に、UIActivityが呼び出せる。

uiactivity

しかし、表記が英語になってしまう。
info.plistにてLocalization native development regionjaなどに変えれば指定の言語で表記されるようになる。
ただ、Localization native development regionは基本言語なので、ローカライズさせるには

UIActivity

こちらの値を変えたほうがいいかも。
XCodeProjectUpdaterを使う場合には、自分でつけ足す必要がある。
キーはCFBundleLocalizations、値はJapanseではなくja

ちなみに、LINEへの投稿を増やしたい場合には、iOS9以降許可するスキームの設定が必要。
XcodeProjectUpdaterにてApplication Queries Schemesの値を追加してみたけど、うまく反映されていなかった。
みてみたらSetApplicationQueriesSchemesの処理が抜けているようなので(僕が消した??)、その処理も加えて無事LINEへの投稿もできるようになりました。

ムービーを外部へ保存して扱う

mp4などのムービーをHandheld.PlayFullScreenMovieなどで使うときは、Unity用の変換がされないようにStreamingAssetsフォルダに格納する必要がある。
StreamingAssetsに置くとUnity用の変換がされず、生のデータとして扱えるけどムービーなどの大きなファイルの場合書き出した本体ファイルが大きくなってしまう。
そこで、アセットバンドルの仕組みでムービーを外部に置きたいけど、アセットバンドル構築の際に

‘MovieTexture’ is not supported when building for ****.

と怒られてしまう。
Continue…

SOOMLA@Unityによるストアの情報取得(値段とか)

課金を行う際に、値段やタイトルなどアプリに組み込むとタイトルの変更や為替の変動による価格の変更に対応するためアプリの再申請が必要になってしまう。
そもそも世界で売る場合は使用しているマーケットの国がわからないので金額が分かりませんね。
なのでマーケット(iTunes Store/Google Play)から直接取得した方がイイ。

SOOMLAだとまずはイベントのリスニング

StoreEvents.OnSoomlaStoreInitialized += this.OnSoomlaStoreInitialized;
StoreEvents.OnMarketItemsRefreshFinished += this.OnMarketItemsRefreshFinished;
StoreEvents.OnMarketItemsRefreshFailed += this.OnMarketItemsRefreshFailed;

this.storeAssets = new StoreAssets();
SoomlaStore.Initialize(this.storeAssets);

そして、初期化完了後にマーケットの情報を取得しに行く。

void OnSoomlaStoreInitialized() {
	#if UNITY_EDITOR
	this.OnMarketItemsRefreshFinished(new List<MarketItem>());
	#else
	SoomlaStore.RefreshMarketItemsDetails();
	#endif
}

取得ができたら自分のストアの設定の情報を取得したMarketItemで上書き。

void OnMarketItemsRefreshFinished(List<MarketItem> marketItems) {
	// ストアの情報を取得したMarketItemで上書きさせていく
	foreach (MarketItem item in marketItems) {
		foreach (VirtualGood good in this.storeAssets.GetGoods()) {
			PurchaseWithMarket purchaseType = good.PurchaseType as PurchaseWithMarket;

			if (purchaseType.MarketItem.ProductId == item.ProductId) {
				purchaseType.MarketItem = item;
			}
	}

	StoreEvents.OnSoomlaStoreInitialized -= this.OnSoomlaStoreInitialized;
	StoreEvents.OnMarketItemsRefreshFinished -= this.OnMarketItemsRefreshFinished;
	StoreEvents.OnMarketItemsRefreshFailed -= this.OnMarketItemsRefreshFailed;
}

ここは…こんな感じでいいのかしら…?
手動でやるのかな?
ストアの情報の取得は稀に失敗することもあるので、何度かリトライさせる必要もありそうです。

SOOMLA@Unityによる、iOS, Androidでの課金方法

UnityでIAP(アプリ内課金)をやってみたのでメモ。(Store Version 1.8.2)
まず、どんなライブラリがあるのかはこちらが参考になります。
基本的にSOOMLAは課金周りの処理だけではなくて、ユーザーのアイテム管理、ショップ管理までサポートするフレームワークでそこに課金機能もサポートされているという感じ。ユーザーの持ち物をすべてOS側のデータ領域に保存してくれる。
アプリ内でショップ、持ち物の管理ができるので便利だけど、サーバー側でも同じような管理をする場合にはその辺の機能は使わず購入処理だけうまく使う感じになりますが、その場合はprime31なんかを使った方がシンプルかもしれません。(有料 iOS/Androidそれぞれ$70くらい)
今回はサーバーでアイテムを管理するものの、SOOMLAのソースコードやコメントがキレイだったり、アップデートが頻繁だったりSOOMLA側のスタッフやユーザーのコミュニティが活発だったのでSOOMLAを選んでみた。

SOOMLAで(消耗型)課金コンテンツの実装でのメモ。
そもそもアプリ内課金自体が初めてなので、各プラットフォームの下準備。
まずはiOS側の下準備。

Continue…

App Previewsの動画アップができない

iTunes Connectにて動画がアップできないのでなんでか調べたら音声のサンプルレートが高かったからみたいだ。
44.1kHzにしたら行けた。
他にもフレームレートも30fpsじゃないといけなかったり注意が必要。
アップできる仕様はこちら
しかも、各スクリーンサイズに合わせて動画用意しないといけないのか。。。大変だ。

64bit(arm64)対応の際の動的メソッドの呼び出し

64bit化に対応する際にちょっとハマったので調べてみたら、動的にメソッドを呼ぶ際の呼び出し方に対応が必要そうだった。
もともとのソースは。

Method method = class_getInstanceMethod([self->object class], self->selector);
IMP callback = method_getImplementation(method);
callback(self->object, self->selector, [[NSNumber alloc] initWithInt:1]);

もしくは

objc_msgSend(self->object, self->selector, [[NSNumber alloc] initWithInt:1])

こんなコードはパラメータで渡したオブジェクトがうまく渡らずEXEC_BAD_ACCESSで落ちてしまった。
それを

((void(*)(id, SEL, id))objc_msgSend)(self->object, self->success, [[NSNumber alloc] initWithInt:1]);

このように変えたらうまく動いた。

あと、「Implicitly declaring library function ‘objc_msgSend’ with type ‘id (id, SEL, …)’」というワーニングが出てたけど
#import <objc/runtime.h>
としているところを
#import <objc/message.h>
と変えたらワーニングも消えた。

参考)
Over&Out その後 | 【iOS7】AsyncImageView が arm64 でクラッシュする件Add Star

Landscapeでの起動画面の設定

横モードのみでiPhoneアプリを作るときにどうしてもiPhone5/6での起動画面が設定できなかったので調べてみた。
iPhone(iPhone6+以外)ではアプリが横でも起動画面は縦で用意する。
だけど、Asset Catalog(Images.xcassets)を使って起動画面を用意するとなぜか起動しても真っ黒。
どうしたらいいかと思って、xcassetsを使わずに以前のような命名規則に乗っ取った方法で設定したらうまくいった。

150410_default_setting

XCode6.3でまっさらなプロジェクトを作って試してもやはり真っ黒になるので、これはバグですよね…??
なので、横のみのアプリの際には起動画面はAsset Catalogを使わずに命名規則に沿った起動画面の画像を入れるのがよさそう。