Re:

のあんのブログ

タグ:xcode

※はじめに、ここで言うWEB技術ってのは単に webView を指します(・ω<)

今回の(とは、ポケットウォーズのこと)技術的な部分と言ったらバーコードスキャンなんだけれども、Mobile Safari でもう一点「音の同時再生ができない」という制約もある。

シングルトンなんだってさ。

プリロードも効かないから少しの遅延も起こる(これはテクニックで回避可能っちゃ可能(らしい)。まあ予めインスタンス化しておくとか、そんな感じ?)。


そのため、webView からスキームでネイティブのメソッドを実行させることで、BGMとSEの同時再生だったり、ボタン連打の連続した音だったり、バーコードスキャンを立ち上げたりといった連携技が可能だ。可能だ、というか、そのために側はネイティブで実装し AppStore から世に出す!


ちなみに、スキームの呼び出しは location.href だと連続でコケるので、iframe を作って消しての呼び出しにすれば解決する。


ネイティブ側での拾い方は、UIWebViewDelegate に自身クラスを設定して(self.webView.delegate = self とか。ヘッダでプロトコル追加も忘れずに <UIWebViewDelegate>)、リクエストがロードされるときに呼び出されるメソッド

相変わらずなげーなあああ

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

でフックすれば(・∀・)イイ!!ってばよ!

{

if ([request.URL.scheme isEqualToString:@"native"]) {
// native://scan?key1=value1 とか呼び出された時に処理する内容
return NO; // ロード中断

}

--

そんでもって、行ったからには戻ることもたまには必要ってことで、ネイティブ側からウェブ側も最後に操作する。

こんな関数がウェブのコードに書かれていたら

function fromNative(message)
{
alert(message);
}

ネイティブ側からは webView に対して JavaScript 文字列を渡せば良いだけだってよ!実に簡単である。

NSString *message = @"ネイティブのメッセージだよ!";

NSString *javascript = [NSString stringWithFormat:@"fromNative(%@)", message];

[self.webView stringByEvaluatingJavaScriptFromString:javascript];

ブラウザに返すのかサーバに返すのか引数で処理分けとかしておくのも良さそう。

クエリ(native://scan?key1=value1 の key1=value1 部分)は
request.URL.query で取り出せる。また、ホスト( scan の部分)は request.URL.host で取り出せる。


あとは、バーコードからのモンスター出現ロジックをどうしよう。

なんかエラーが出てしまう未来のわたくしへ…

Terminating app due to uncaught exception 'UIApplicationInvalidInterfaceOrientation', reason: 'Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES'


Xcode 4.6.1
cocos2d-iphone-2.1-rc1

10

Landscape Left, Right がデフォルトのcocos2dアプリなんて作らん!と、Portrait設定にしてビルド実行するとエラーが出てしまう場合があります。

それもこれも、iOS6からの画面の向きを監視するメソッドが変更されているせいで、シミュレータのバージョン6以上を使ってるとなう。


cocos2dプロジェクトを新規作成してAppDelegate.mを見れば一目瞭然の説明が記述されています。


これはiOS6だけ有効で、4/5では無効だからね

supportedInterfaceOrientations

これはiOS4/5だけ有効で、6では無効だからね
shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 



-(NSUInteger)supportedInterfaceOrientations {


    return UIInterfaceOrientationMaskPortrait;


}



上記のようにOrientationsで指定した縦画面をリターンするように修正するか、これまたiOS6からのメソッドshouldAutorotateでNOを返せばsupportedInterfaceOrientationsは呼ばれないので、向きが固定のアプリケーションならこれでいいんじゃないですかね?

// iOS 6+ only

- (BOOL)shouldAutorotate

{

    return NO;

}

Universalにデザイン・コーディングするのはもちろん理想だけど、俺は縦画面がいいw





追加したいときに。
JSONObjectWithData:options:error の意味
http://md.hatenablog.com/entry/2012/03/17/185959 

受け取ったデータを可変長のNSMutableArrayやNSMutableDictionaryで処理したい場合はオプションを指定するといいのね。

NSJSONSerialization は iOS 5 から使えるようになったんだって!

知らなかった。正しくは、知る由もなかった← 

コード書いてないもんネ(´・ω・`)

xib上のパーツからドラッグしてpropertyやactionをヘッダや実装できるのは便利なんだけど、これにかぎらず見慣れないエラーはパッと見では理解できないことが多いよね!

Cloud not insert new action connection: No @implementation found for class '***ViewController'

っていうね。

いやいや、ちゃんと実装部あるし!とか思ったりする訳。


非常に単純なことで、xibの変更後に保存していないことが原因だったりする。


ググってみると日本語のサイトがヒットしないので、まぁ簡単なことだけど簡単過ぎてつまづくと言うか、こんな些細な事で時間が過ぎないためにも情報共有(´・ω・`)



最近のネイティブゲームは本格的過ぎてついていけません。

Unityのおかげ。


↑このページのトップヘ