【アプリ】Todayee Silent 1.0.1 バージョンアップ

2016年7月29日金曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

Todayeeシリーズのカメラアプリ Todayee silent をアップデートしました。

変更の大きな点は、非マナーモードでシャッター音が鳴るところ。最初のバージョンでは完全無音で審査が通ったが2回目ではダメだった(PLA 3.3.8 というやつに引っかかった。これは被写体に撮影していることを知らせる条項)。単純にシャッター音を復活させるとこのアプリの存在意義が無くなってしまうため、少し悩んだあげく非マナーモードのみ 単純に AVAudioPlayerでシャッター音の .aif ファイルを再生するようにしてみた。その結果、無事に通過。実際にはもう一点指摘があって、スクリーンショットに入れていたテキストの「無音」を消すようにとの指導もあった。そこは別のテキストで置き換えた。そんなこんなで、ここ数日で3回ほど申請と却下を繰り返したあげくようやく今朝リリースできた。

ということで当初特徴としていた「無音」という文字は意図的に消している。一応、音量を絞るか、マナーモードにすれば音は鳴らなくなるので希望する方はそれを使って下さい。くれぐれも悪いことには使わないようお願いします(ちなみにカメラを上に向けると撮影できなくなってる)。

関連ブログ

【アプリ】Todayee Extension 1.0 をリリースしました(無料)

2016年7月28日木曜日 | Published in | 1 コメント

このエントリーをはてなブックマークに追加

Todayee シリーズ第4弾「Todayee Extension」をリリースしました。無料です。



iOSのシェア機能を利用してEvernoteへ投稿を行うアプリです。他のアプリで↑ボタンを押すと Todayeeアイコンが出てきます。


これをタップするとダイアログが表示され投稿することができます。


シェアボタン利用が中心なのでアプリ自体は設定画面のみ。


テキスト・URL・画像(1枚)が投稿可能です。カメラロールの写真はもちろん、SafariやRSSリーダー、メッセージなどで気になる情報があった時のURLの簡易クリップアプリとしても使えます。

投稿したテキストは左に線が表示される引用スタイルとなります。またURLは「リンク」という文字のリンクとなります。
以下、投稿例です。




Todayeeの特徴である複数アプリ・デバイスからの投稿を1つのノートへまとめる機能も、もちろん健在です。

他の Todayeeシリーズのアプリと一緒に使っていけます。


他の Todayeeアプリの記事

【アプリ】Todayee Text / Photo 1.0 をリリースしました
【アプリ】Todayee Silent 1.0 をリリースしました

開発メモ

ExetnsionからのEvernote投稿


初の Share Extension 開発は何箇所かでハマった。最初は Evernoteの投稿。Extensionを使う場面で認証させるわけにはいかないので、先に本体(Containing App)で認証した後にそれをExtension側で使うようにする必要がある。ただ本体アプリとExtensionは別々のアプリとして動作するのでそのままでは認証情報はもちろん、設定情報(NSUserDefaults)が両アプリ間で共有できない。幸い Evernoteの SDKには KeyChainグループを指定できるメソッド(ENSession.setSecurityApplicationGroupIdentifier)が用意されていたので、両アプリで共通のグループを設定することで認証情報を共有することができた。

Keychain Sharing


NSUserDefaults


NSUserDefaultsには NSUserDefaults(suiteName: name) というコンストラクタがあって、ここに両アプリで共通の文字列を入れておくと Containing App と Extension の間でデフォルト設定を共有することができるようになる。

なお前提として App Groups を1つ作っておいて、本体(Containing App)とExtension 両方で使えるようにしておく必要がある。



画像の NSExtensionItem


他のアプリ(Host App)から渡されるデータは NSExtensionContext を経由して取得することができる。面倒なのはデータの渡し方が元アプリによってまちまちなこと。例えば確認できているだけで画像の渡し方は3通りあった。
NSExtensionItem の実体:
・UIImage
・NSURL(file://で始まる画像の置き場所)
・NSData
これらはすべてデータのタイプが kUTTypeImageなので、実行時に NSExtensionItem の型を判定してそれぞれ処理してやる必要がある。アプリによっては UIImageを渡し、さらに kUTTypeURL で別に file://なNSURLを渡してくるものもあった(これはどうかと思うが)。


Extension で UIAlertController / ViewController


Extensionでは実行中に普通にUIAlertControllerが使える。Todayee Exntesionではエラーや注意メッセージを出すのに使っている。注意点はメインスレッドで呼び出すところ。
                    dispatch_async(dispatch_get_main_queue(), {
                        let controller = UIAlertController(title: ...
                        controller.addAction(UIAlertAction(title: ...

                        self.presentViewController(controller, animated: true, completion: nil)
                    })

同様に必要なら ViewControllerを作り画面を覆うような UIも作れる(同じくメインスレッドで)。Evernote投稿中に少し時間がかかりその間画面が固まってしまうので、このアプリでは ActivityIndicatorを表示するのに使っている。


起動後に説明画面


ネット上の情報で Extensionメインのアプリの場合、本体に操作方法の説明が無いとリジェクトされるとのことだったので、起動直後にヘルプのページを表示するようにした。


ビルドエラー


Extension にはいくつか制約があって、その中の一つに UIApplication の使用禁止がある。これが困るのは Extension でサードパーティのライブラリを使っていて、かつそれが UIApplicationを使っているケース。こんなエラーが出る。


このエラーを回避する為には、使っているライブラリのビルド設定で " Require Only App-Extension-Safe API" を YES → NO に変えてやれば大丈夫。


アップロードエラー


最後にハマったのが AppStoreへのアップロード。Xcodeのオーガナイザでいつものようにアップロードするとエラー。

リトライということなので、数日時間を開けてなんども実行。が、同じエラー。これはおかしいと思い調べたところ App Uploaderを使うと良いとの情報があったので使ってみた。ちなみに App Uploaderは Xcode7のメニューから呼び出す(知らんかった)。

App Loaderを使うともう少しマシなメッセージが出てきた。

調べると Extensionや Frameworkで CocoaPodsを使う時の既知の問題らしく、対処としては Extensionフォルダ内にできる Frameworksフォルダをビルドの最後に削除すること。※最後のWARNINGは Containing App と Extensionの Build番号(BundleVersion)が一致しない為のメッセージ。

そこで下記をExtension側の Build Phase の Run Scriptへ追記して実行したところ確かにエラーが減った。

が、まだ最後の1つが消えない。

スクリプトに ls > /tmp/ls.txt など追加して状況を調べるがディレクトリはあっていて Frameworksは存在する(ので、rm -frで削除されるはず)。原因は結局わからず時間ももったいないので、今回は自分で消すことにした。オーガナイザから作成した Archiveビルドをファインダで表示し、Extension配下の Frameworksを手で削除した。それをアップロードしたところ無事に完了。うまくいったので、まあこれでいいや。


あとがき



申請まで持っていくのに結構苦労させられたアプリだったが、申請自体は一発で通った。これはちょっとうれしい。今回もTodayeeプラットフォームがベースにあったのと、アプリの機能自体は少なかったので短期間で開発できたと思う。自分自身SafariやRSSリーダのURLを投稿するのに結構重宝している。

今後検討中のアプリ
・Place
・Pics
・Map
・Voice
・Viewer



アプリの入手は下記からどうぞ。無料です。





【アプリ】Todayee Silent 1.0 をリリースしました

2016年7月22日金曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

Todayee シリーズ第3弾「Todayee Silent」をリリースしました。


写真を撮影して送信するだけのシンプルなアプリです。特徴はシャッター音がしないこと。

防犯上の理由からカメラを上にした状態(iPhoneの液晶面を下にした状態)では撮影ができないようになっています。またiPhoneの場合、撮影時にバイブレーションが動作します(これは停められません)。

Todayeeの特徴である複数アプリ・デバイスからの投稿を1つのノートへまとめる機能も健在です。他の Text と Photo と一緒に使っていけます。

画質は同シリーズの Photoと比べると劣ります(例 iPhone6の場合、最大 750 x 1000)。このあたりは用途に合わせて Photoと使い分けてもらえればと思っています。

開発メモ



無音カメラの実装はビデオキャプチャの原理で、これはネットを探すとたくさん情報があるので苦労はしなかった。開発で時間が取られたのはその周辺。
・裏返しの判定(ここ
・AVCaptureVideoPreviewLayerの回転対応

また申請では1度リジェクトされた。この時は2点指摘があった。

・位置情報確認のダイアログに説明を入れなさい
 今まで Info.plistのNSLocationWhenInUseUsageDescriptionは空文字列のまま放置していたのだが、今回はそれが指摘されたので利用目的を入れるようにした。なお Todayeeはたくさんのアプリを1つのプロジェクトで扱っていることから SIlent_Info.plistなどとしている。この場合の多言語化は通常どおり InfoPlist.stringsだった。

・クラッシュする(IPv6に対応しなさい)
結果からすると IPv6は関係なかったが、EvernoteのSDKが IPv6未対応かと当初思って少々焦った。ただApple推奨の IPv6検証環境(これ)で問題ないことと、Crash Logの解析から別の箇所が問題とわかった。状況からすると審査担当がアプリ起動時にカメラの利用を不許可にし、それが原因で AVCapture* 周りの初期化に失敗してクラッシュしていた可能性が高い。そこで AVCaptureDevice.authorizationStatusForMediaType() でカメラの利用可能状態をきちんとチェックすることで対処し、無事に審査を通過できた。


あとがき


Todayee Platform のおかげで開発開始から審査通過までなんと 20日、と自分自身の過去最短のリリースとなった。前回のTextとPhotoが5ヶ月近くかかったのとはえらい違い。ベースがあるとこんなに楽かとしみじみ。今後も Todayee Platformで動くアプリを量産して毎月リリースを行うつもり。しばらくは Todayee開発が続く。

今後検討中のアプリ
・Extension
・Pics
・Map
・Voice
・Viewer
  :


アプリの入手は下記からどうぞ。





液晶面が上を向いているか地面を向いているかの判定に CoreMotionの gravityがよさげ

2016年7月12日火曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

motionManager.deviceMotionUpdateInterval = 0.2
        motionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue()) { (motion, error) in
            if motion?.gravity.z < 0.75 {
                print("up side")
            } else {
                print("down side)
            }
        }


gravity.z の値は、液晶面が上(天)を向いている時は -1.0近辺
Optional(-0.99992328882217407)
Optional(-0.99992173910140991)
Optional(-0.99992197751998901)
 :


液晶面が下(地面)を向いている時は +1.0近辺
Optional(0.99968743324279785)
Optional(0.99974864721298218)
Optional(0.99976813793182373)
 :

垂直に立っている時は 0近辺
Optional(-0.039904400706291199)
Optional(-0.038459554314613342)
Optional(-0.035526838153600693)
 :


人気の投稿(過去 30日間)