作成者別アーカイブ: Hiroshi Murata

【Parseメモ】BFTaskMultipleExceptionsExceptionリンクエラー

ParseSDKをver1.6.1からver1.6.4に更新したら以下のリンクエラーがでるようになった。


BFTaskMultipleExceptionsExceptionは、Bolts.frameworkの最新版(ver1.1.4)ではBFTask.hに

として定義されている。

しかし、現状の環境下で参照してるバージョンでは定義されていないらしい。

 

現状の環境は、

  • ParseSDK Ver1.6.4
  • FacebookSDK Ver3.20.0

Bolts.frameworkはFacebookSDKに含まれていて、このBolts.frameworkはver1.1.3であり、BFTask.hには上記の定数は定義されていない。

だからといって、Bolts.frameworkの最新版(ver1.1.4)を個別にリンクしようとすると、FacebookSDKが持つBolts.frameworkとduplicate symbols のリンクエラーを生じる。

FacebookSDKを最新版のver3.23.1にアップグレードしても、Bolts.frameworkのバージョンは同じくver1.1.3なので状況は変わらない。

FacebookSDKが参照しているBolts.frameworkを手動で最新版へ変更する手段が私には分からないので、ParseSDKのバージョンを元に戻して、FacebookSDK側の対応を待つことにする。

 

参考

Parse and facebook sdk -duplicate symbol


【Parseメモ】PFLogInViewControllerからTwitterログインしたアカウント情報を端末にも保存する

アカウントを端末へ保存

PFLogInViewControllerを使ってTwitterログインした際、アカウント情報を端末(設定アプリ)にも保存する方法を調べてみた。

発端

そもそもの発端は、Twitterにpostする画面としてSLComposeViewControllerを使おうとしたこと。そしてSLComposeViewControllerを使うには、端末に保存されたアカウントを必要とする。

前提

PFLogInViewControllerを使ってのTwitterログイン時、アカウントが端末に未登録の場合はWebViewベースの認証画面が表示され、アカウントを入力してログインする。

問題

この状態でSLComposeViewControllerを使おうとすると、端末へのアカウント登録を誘導するアラートが表示される。このアラートから設定アプリへ切り替えして登録することもできるが、ユーザーにとって登録が二度手間となるうえ、登録後に元のアプリへは自動で戻ってこれない。なのでユーザーが自分でアプリ切り替えをしないといけない。これらの動線は極力避けたかった。

アカウントの保存

ということで、PFLogInViewControllerでTwitterログインしたアカウント情報を使って端末にTwitterアカウントを保存する処理を調べて書いてみた。

 

まずはAccounts.frameworkをimportし、

 

Twitterログイン後に以下処理を行う。

 

これで端末上にアカウントが保存される。

 

ちなみに、同じ方法でFacebookアカウントも処理しようとしたが、

Error Domain=com.apple.accounts Code=7 “The application is not permitted to access Facebook accounts”

というエラーが発生して保存できない。
何かしらpermissionを与える方法があるのかどうか一通りネットでも調べてみたが、明確な情報はほとんどなく今のところお手上げ状態。

Facebookの基本的な認証システムを理解できていないのが要因かもしれない。


【Metaioメモ】Metaio製品を使ったモバイルARアプリ開発パターン

2015/6/1追記

Metaio社は2015年5月27日にホームページを更新。
その中で製品の提供中止についてアナウンスしている。

Product Support : metaio

日本国内でmetaio製品を販売・サポートしていたサイバネットシステム株式会社が運営するmetaio製品に関する日本語情報交換フォーラムでもアナウンスがあった。
こちらの方が本家よりも情報が細かく分かりやすい。
(中の人も今大変だろうな…)

Metaio社製品の販売中止について

Apple社がMetaio社を買収したという話もあるが、今のところ今後のサポート含め詳細は不明。

 

Metaio製品を使ったARアプリ開発

Metaio社が用意してくれているAR(Augmented Reality、拡張現実)開発環境がいろいろあって開発時の選択肢が分かりづらいので、適時少しずつまとめていく予定。

 

開発方法

大まかに分けて、ARアプリを開発するためには2種類の選択肢がある。
それぞれの詳細は後述。

 

トラッキング方法

現実環境を検出(トラッキング)する方法としては2種類に分けられる。

  • 光学トラッキング デバイスのカメラ映像を通してIDマーカーや写真・イメージ画像を認識、検出する。顔認識や3Dオブジェクトの検出もできるようになってきてる。
  • 非光学トラッキング デバイスのもつGPSやコンパスなどのセンサーを使って位置情報を取得する。

 

Junaioアプリの利用

概要

スマートフォン用ARブラウザアプリ。
iOS(App Store), Android(Google play)用にアプリが用意されている。
お手軽にAR体験ができる。

HTML + JavascriptベースのAREL (Augmented Reality Experience Language) を使ってUI作成もできる。

 

チャンネル

ARコンテンツの関連情報(コンテンツ名称や説明、コンテンツサーバURLなど)をJunaioサーバにチャンネルとして登録しておく。
metaio Developer Portal にアカウント登録することでチャンネル作成ができるようになる。

チャンネルは、IDマーカーやイメージ画像などを光学トラッキングする Image based (GLUE) channel と、位置情報に基いて非光学トラッキングする Location based channel の2種類がある。

JunaioアプリはARコンテンツを表示するために、まず該当のチャンネル情報を取得(検索やQRコードから読み込み)してコンテンツURLを特定し、そこからコンテンツをダウンロードする。

チャンネル情報の取得からコンテンツダウンロードまでは自動で行なわれるので、ユーザーはQRコードのスキャン操作するだけでAR体験できるようになる。

 

メリット

  • ARの基本機能(マーカー認識、コンテンツ描画)はアプリが行ってくれるので、コンテンツの作成に集中できる。
  • Metaio製品の中では一番お手軽かつ安価にARアプリを作れる。
  • Junaioアプリ自体は無料。
  • iPhone, Androidのクロスプラットフォームで開発できる。

 

デメリット

  • ARブラウザという性質上、他社のコンテンツも検索・表示できるため、自社コンテンツ専用アプリとしては使えない。
  • チャンネルデータを取得するためにUI周り(検索、QRコード読み込み)などはカスタマイズできない。
  • ARコンテンツを表示するために、まずチャンネルデータの読み込みを行う必要がある。そのためユーザー側からするとアプリを入手してすぐにARコンテンツを表示できないので、それらの工程を煩わしく感じる可能性がある。
  • オフラインで使用できない。

 

MetaioSDK の利用

概要

iOS, Android, Windows向けのARネイティブアプリを開発するためのキット

 

メリット

  • ARコンテンツデータをアプリ内に同梱できるので、オフラインで使用できるアプリを開発できる。
  • 要件に合わせたアプリを開発できる。
  • SDKを使って開発したアプリは無料で配信できる。
    ※ただしウォーターマーク、フラッシュスクリーンが表示される。
  • ARELを使って開発すれば、コンテンツ部分についてはプラットフォーム間で共通化できる。

 

デメリット

  • ARELを使って開発しない場合、要件上必要なプラットフォームごとにアプリを作らなければならない。
  • ウォーターマーク、フラッシュスクリーンを消すためにはSDKライセンスを購入する必要がある。
  • ネイティブアプリの開発、SDKライセンスの購入など、開発費が高額になりがち。

 

MetaioSDK + Cloud Plugin の利用

概要

MetaioSDKでネイティブアプリを開発し、コンテンツ配信はJunaioチャンネルを利用できる。

 

メリット

  • サーバ上に設置したARコンテンツを取得する部分はCloud Pluginにお任せできる。(Junaioと同じ挙動)
  • 無料で配信できる。
    ※ただしウォーターマークが表示される。

 

デメリット

  • ウォーターマークを消すためにはMetaio Cloud(月額)を契約する必要がある。
  • オンライン環境が必要。

 

参考

metaio Developer Portal

AR/VRソフトウェア(拡張現実・バーチャルリアリティソフトウェア):サイバネット


【Parseメモ】Crash Reporting

クラッシュログを収集。

機能を有効にするには、Parse app keys を initialize する前に以下のコードを入れる。

一度有効にしておくと、クラッシュレポートは再起動時にParse側に送信され、analytics dashboard上で確認することができようになる。

 

symbolicate

クラッシュログの中のシンボルを読める状態にしてクラッシュログを分析しやすくする。そのためににsymbolファイルをParseへ送信しておく。

送信方法は2つ

1.手動で送信

$ parse symbols <dSYM/xcarchive/DWARF path>

→pathの指定の仕方が良く分からない。dSYMファイルを探さないといけないっぽい。

2.自動的に送信(Parse推奨)

Xcodeがビルド時にsymbolファイルを自動的にParseへ送信してくれる。便利。

手順としては、
1.Parse Cloud Code directoryを作成。
2.Build Phases で Run Script 設定

Run Scriptの設定については参考サイトの動画が分かりやすい。

Parse Quick Start Install the SDK

 

Analytics dashboard Crashes

テスト的に AppDelegate の application:didFinishLaunchingWithOptions:の中でNSExceptionを発生させてみた。

リスト

screenshot

 

詳細:symbolなし

screenshot

symbolなしだとどこで例外が発生したのか分かりにくい。
symbolicateさせるためにdSYMファイルを送信することを促すメッセージが表示されている。

 

詳細:symbolあり

screenshot

symbolありだと、AppDelegateのメソッド内で何かが起きたことがなんとなく分かる。

 

参考

Parse Developer Guide | Crash Reporting

Parse Quick Start Install the SDK


【Parseメモ】PFUserオブジェクトへの他ユーザーからの書込権限は追加できない

PFUserのACLに、Roleによる編集権限を追加しようとしたらエラー発生。

 

 

エラー

error: user objects cannot allow writes from other users

ユーザーオブジェクトには、他のユーザーから編集できるようになる権限を付与できないので、ユーザーオブジェクトを編集するような処理は Cloud Code で master key 使ってやれということのようだ。

 

参考

iOS; Allow admin user write access to another user


【Parseメモ】PFConfig

key/value型の設定値をParse Config Dashboard上で設定しておき、アプリ側ではPFConfigオブジェクトを使ってその値を取得できる。

アプリに埋め込まずサーバ側で設定を保持しておきたい値がある場合に便利。

ただし、

  • 現状、登録できる値は100個まで
  • 設定値全体のサイズは128KBまで

という制限がある。

 

設定画面

スクリーンショット-2015-01-19-16.31.50

スクリーンショット-2015-01-19-16.34.27

スクリーンショット-2015-01-19-16.34.43

 

 

取得方法

 

参照

PFConfig Class Reference

Parse Developer Guide Config


【Parseメモ】PFQuery 同一キーへの複数制約の追加

Array型のカラムに対して以下のように複数の制約を追加した場合、期待するのは、友達A(friendA)と友達B(friendB)との両者とも友達である(friendsに含まれる)ユーザーのリストが得られること。


だが、結果は友達B(friendB)のみが友達であるユーザーのリストとなる。
これは後から設定した制約が前のを上書きしてしまうことが原因。

こういう場合は、

とする。

ただし、PFRelation型の場合は使えない。(なぜ?)

参照

PFQuery with multiple constraints on one key

PFQuery Class Reference


サンプルプログラムを作成

iPhoneアプリを作る会

iPhoneアプリ作りたい人達が集まって、アプリを作る会みたいなのを月1で開催してるのですが、年明け1回目はせっかくなのでお正月にちなんだアプリをみんなで作ろうということになりました。

そこで題材は「福笑い」
(ちなみに昨年はおみくじアプリ)

福笑い

福笑いのルールとしては、面の輪郭の上に散らばってる目や口、鼻などの部品を、目隠しをした人が適当な位置に置いていき、滅茶苦茶な顔が出来上がっていくのを周りで見てる人たちは楽しむって感じですよね。

iOSらしい操作が必要になりそうで、開発の勉強にもなってちょうど良さそうというのもポイントでした。

ノンプログラマ向け

参加者にはノンプログラマな人たちも多く、当日ゼロから作ってたら終わらないだろうということで、私が事前にサンプルプログラムを用意しておくことになりました。
これをベースに各自で自由にカスタマイズしてもらえれば良いかなと。

ありがたいことに顔パーツ画像は他の参加者の中でデザイナの方が用意してくれることになりました。

 

ちょっと工夫しておいたところ

基本的にサンプルコードなので細かいところは各自で頑張ってもらおうと思いつつ、当日手間取る人がでるだろうなーと予想されるいくつかの箇所については少しこだわって作っておきました。

回転処理

まずは顔部品の回転処理にはUIRotationGestureRecognizerを使ってます。

が、単純にそのrecognizerを回転させたい顔部品ViewにaddGestureRecognizer:した場合、回転ジェスチャーを検知するには指2本がそのView上に乗っかってないといけないですよね。

でも福笑いなので目隠ししてやることになるだろうから、そもそも小さい顔部品の上にピンポイントで2本の指を乗せることは難しそう。だからどちらか1本でも乗っかってたらそのViewを回転対象として認識して操作できるようにしました。

顔部品の選択

内部的に操作対象のViewを決定していますが、2本の指がたまたま別々のパーツに乗っかった場合、最初の指が乗っかった方の部品を選択状態とするため、touchesBegan:withEvent:メソッドも併用しています。

UIGestureRecognizer系だけではタッチ時(touch down)のイベントを扱いにくかったからです。

効果音

もうひとつ、現実の福笑いと違って、部品を手で触った感触で目なのか鼻なのか、どこの部品かを判断することができないので、部品をタッチしたときに効果音を出すようにしてみました。

当初は、効果音の音源ファイルをAVAudioPlayer使って再生しようかと考えてましたが、音源を用意するのも面倒だなーと思いつつちょっと調べてみたら、いつの間にかテキストの音声読み上げできるようになってるんですね。

それを紹介してくれてるサイトを見つけたので参考にさせてもらいました。

iOS 7で追加された音声読み上げ機能(AVSpeech Synthesizer)でiPhoneにお喋りさせる

これで、「右まゆげ」とか「鼻」とかのテキストを音声読み上げできるようになりました。これ使ってみたら面白い。便利。

顔部品のシャッフル

画面の遷移を省いた分、顔部品の位置をシャッフルするタイミングがなく、ボタンを配置するのも邪魔なので、motionBegan:withEvent:メソッドを使い、デバイスを振ると顔部品がそれぞれランダムに移動されるようにしました。

 

ちょっと手抜いたところ

あえてiPhoneのみ対応

福笑い的には画面は大きいほうがいいだろうけど、普段、参加者の中でiPadを開発機として使ってる人は少ないのでiPhone限定に。

Universalにしたいなら、そこは各自でカスタマイズしてもらおうという意図です。(レイアウトが面倒だったし)

Autolayout

Autolayoutがonだと、顔パーツを指でぐりぐり移動させたいと思ったときに意図した挙動を出しにくかったのでoffに。

この辺は後日きっちり調べたいところ。

 

サンプルプログラム

以下、私が作ったサンプルプログラムがこちら。

福笑いiPhoneアプリサンプルプログラム Objective-C版

2015/03/27追加
福笑いiPhoneアプリサンプルプログラム Swift版

サンプル、ということで細かい怪しい挙動には目を瞑ってください。

大したコードではないですが、自由に使ってもらって結構です。

怪しいところや、もっとこうした方が効率的とか、
このサンプルをベースにこういうアプリを作ってみました!!とか、
いろいろご意見いただければ嬉しいなー。


開発系ブログ開始

今まで散々他の開発系ブログにお世話になりながら、自分は何も発信出来ていない状況を申し訳なく感じ、少しでもお返しできればと今さらながらブログ始めることにしました。 しばらくはiOSメインで。metaioSDKやjunaioサービスを使ったAR(拡張現実、Augmented Reality)系はいくつかお手伝いさせてもらったので継続して追いかけてるテーマです。 UnrealEngineやopenFrameworksも弄りたいなあと思いつつずるずると後回しになってますが、そろそろやる。必ずやる。