UINavigationBarとUIScrollViewずれる!

iOS7にappを移行してみたら、NavigationBar分Viewが画面下にずれる現象が起こった。しかも、範囲強制している筈のScrollViewが全然効かなくなってしまった。

ひとつづつ確認してみるとView自体がNavigationBarに押し出されているわけではなく、ScrollView内のコンテンツがNavigationBar分スクロールしてしまっているようだ。たしかにscrollView.contentInsetが44pixel下がっている。むりやりこの値を0にしてみたが、アニメーション部分とあいまって妙な動きになってしまう。

どうしたもんかと更に調べてみるとありました。

UIViewControllerにautomaticallyAdjustsScrollViewInsets。これiOS7から追加された用ですが、ScrollViewのinsetを自動的にBar分調整してくれる便利(?)なもののようです。これをNOにすることで期待通りの動きに戻りました。

NavigationBarあたりは挙動が変わるものが結構あるので一個づつ潰して行くしかなさそうですね。

iOS7 FaceTime AudioとSkype

iOS7になってFaceTimeに音声のみで通話できる機能、「FaceTime オーディオ」が追加された。またこれまでWiFi下のみでしか使用できなかったFaceTimeがLTE/3G下でも通信可能になった。これで相手がiOS7を搭載したiPhoneであればキャリアを越えても実質通話料金を支払う必要はなくなったといえる。私のように毎月固定電話に何万円も支払っていた経験のある世代の人であれば「若い頃にあったらなー」と思ってしまうかもしれない。特に他の同系のものと違って、アプリケーションが起動している必要がないことと、それ用のIDを別途取得する必要がないというところで断然使い勝手が良い。

さて、無料通話といえば歴史のながい有名どころはSkypeだろう。今回FaceTimeオーディオの搭載されたことで、iPhoneのSkypeは不必要になったという声さえあるが、相手がMacだろうがWindowsだろうがスマホだろうが、無料で通話できてしまうこのアプリケーション、まだまだFaceTimeオーディオと共存して使わせてもらいたい。特にPCの前に座っているときにハンズフリーで使えるところがSkypeの便利なところ。もちろんFaceTimeだってMacを使っていれば同じように使えるのだが、なぜかMacのFaceTimeにはビデオのみをOFFにする機能がついていない。(ある? ないですよね?)自分の顔がモニタに映るとガッカリしてしまう私は通常は音声だけで十分というか音声だけが良い! 噂によるとこれはmavericksになっても変わっていないようだ。(そのうち変わるのでしょうが…)まあカメラに付箋でも貼ってしまえばいいのだけれど、無駄な通信とマシンパワーを使っているのでできるだけ軽快に行きたいのだ。

あれ? と思ったのはiOS7になってからSkypeの呼び出し音が鳴らなくなってしまった。通知はされているのでアプリケーションに問題はない模様。調べてみると、通知音がOFFになっていた。再インストール時に変わってしまったのかもしれない。下記で通知音(呼び出し音)が鳴るようになる。

設定 > 通知センター > Skype を選択後、サウンドのスイッチをONにする。

便利なSkypeさんFaceTimeオーディオさんとともにこれからもありがたく使わせて頂きます。

 

追記:OSX 10.9.2でFaceTimeオーディオがMacでも使えるようになりましたね。これで相手がiPhoneであればもうアプリのインストールなしで使えてしまいますね。ただWindowsやAndroidの相手ではまだまだSkypeのお世話になりそうです。

Apple Keyboard アルミで option 起動できない

古い Core Duo iMac を今でもウェブ閲覧で使用しているが、バンドルの白いApple Keyboardがずいぶん前に壊れてしまい、その後、それよりは新しいアルミ筐体の有線 Apple Keyboard を接続して使用していた。

しかし、この組み合わせはどうもOptionキー押下でのブートデバイス選択ができないようだ。今まであまり気にしていなかったが、システムの入れ替えをしていてどうしても起動できなくなってしまった。

もう一台あった白い方のキーボードであればOptionキーが効くのでやはりアルミの方との組み合わせに問題があるようだ。一応解決方法としては、これもバンドルのリモコン(Apple Remote)のメニューボタンを押しっぱなしで起動すると、デバイス選択が現れるので一応なんとかなるようだ。

もう引退させるべき機器なのでしょうけど。一応需要があったりで、もう少しだけ頑張って。

Google Map SDK for iOS URL Scheme

でるぞでるぞと言われていたGoogle製 Map アプリがリリースされました。これでやっとiOS6にバージョンアップできるぜー。という人も多いのでしょうね。

アプリ内での使用はどうなんでしょう? Google Developersを見ると早速、Google Maps SDK for iOS のページが作成されている。View内に取り込む方法と、Google Map アプリにURLを渡す方法の2種類があるようだ。前者はAPI Keyの取得が必要であるようなので少し時間がかかりそうだが、URLを渡す、URL Schemeは簡単にできそうだ。

今までの地図アプリでは、「maps://」から始まるURLを渡していた。これを「comgooglemaps://」にすると良いようだ。そしてパラメータに下記を指定する。

  • zoom: 地図のズームレベル
  • center: 地図の中心点(緯度/経度)
  • mapmode: 標準/ストリートビュー
  • views: 渋滞情報や路線図などの表示

では、早速表示

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"comgooglemaps://?center=35.658606,139.745474&zoom=16"]];

写真

GoogleMapアプリがインストールされてない場合もあるので、事前に canOpenURL で利用可能かをチェックするの良いようだ。

APIキーが取得できたらViewへの取り込みもチェックしたい。

Google Maps URL Schemeの詳細

Xcode4.5.1, iOS6

iOS6さん、もう一度たずねて!

iOS6になってプライバシーの設定が強化された。連絡先などのプライバシーに携わる箇所にアクセスすると、「連絡先へのアクセスを求めています」との許可が求められるようになった。以前から位置情報の利用などでも許可が求められていたのでおなじみである。
しかし、この許可を求められるは一度だけでその後はもう聞いてこない、デバッグ中にもう一度聞いて欲しくて、アプリを再インストールするなどしたが、もう二度と聞いてくれなかった。
設定を見回すと、ありました。設定アプリを起動して、「一般」>「リセット」>「位置情報とプライバシーをリセット」。これでもう一度たずねてくれました。

Passbookのhttp接続

なにかと話題のPassbookだが、プログラミングガイドには、開発時はアップデートなどでやりとりをする為のサーバーにhttpで平文によるテストができるとあるが、実機で試すとjson内のurlにhttp://を記述しただけで、Passbookアプリがpassを食ってくれない。デバイスのログを見るとsslの時は確かに通信をしにいっているようだが、認証でこけている。
iPhone側かな? と思って確かめるとありました。設定アプリの「デベロッパ」>「PassKit Testing」の「Allow HTTP Service」これをONにすると、httpと書いたpassも食ってくれて通信も始めました。ほんと設定っていろんな所にあったりかわったりで見つけるの大変。でも見つかった時は嬉しい。

APNs本番サーバーでPush通知できない!

APNs(Apple Push Notification Service)のテストをしたのだが、本番(Production)で動かすとPush通知が来ない現象がおこった。大まかな構成は...

  1. iOS用アプリ・・・APNsよりトークンの取得、APNsからのPush通知の受け取り
  2. プロバイダー(Webサーバー)・・・任意デバイスへのPush情報をAPNsに送信

尚、iOSアプリは「Ad Hoc」、プロバイダーは「ApnsPHP」を使用した。

APNsの仕組みや具体的な実装については、「iPhoneアプリで稼げるのか」さんが、ApnsPHPは、「PROGRAMMING NOTE」さんが、それぞれ詳しく解説されていてとてもありがたい。

Development用に実装した場合は若干手間取るものの、デバイスに通知がされることを確認できた。(プロバイダーで使用したファイルは、sample_push.phpとsample_feedback.php)

ただ、Production用にアーカイブを作成して実機テストをしてみると、うんともすんとも言わない...

一旦、Provisioning Portal で該当するApp IDのPush SSL CertificateをProduction用だけにして再作成し、Distribution Provisioning Profileも再作成した。また、.pemファイルも再作成してみたが、改善しなかった。(これらについては結果的に効果があったかどうかは不明)

さて困ったと、いろいろ調べて行くと下記の部分が問題であることが分かった。

■デバイス識別トークンは開発用と本番用は違うものが発行される。
早速実機上で再度トークンを取得してみると確かに開発用と違うものが返された。

■そもそもAPNsサーバーは開発用と本番用は違う。
これは完全に見落としていた。sample_push.phpとsample_feedback.phpの定数「ENVIRONMENT_SANDBOX」を「ENVIRONMENT_PRODUCTION」に変更した。

これで通知されるようになりました。また、開発用では、フィードバックが取得できていなかったのだが、本番用では取得できた。
あー、すっきりした。
Xcode4.5.1, OS X10.7.5, iOS5.1, Apns-PHPr100

ファイルメーカー上で配置した画像の品質が低い

印刷を目的としたファイルメーカーのドキュメントで、配置した画像がプリント(PDFへの書き出しも含む)をした時に72dpiの品質になってしまい困っていた。
ファイルメーカーのバージョンは7でとっても古いんだけど年賀状や請求書にしか使用していないので特に不自由は感じていない。
300dpi程度で画像を作成し、TIFFで保存、この画像をファイルメーカーのレイアウト上にピクチャ配置すると、この現象になってしまう。(最新版では問題ないかもですが。)
解決策は画像をTIFFではなくPDFで保存してそれを、ピクチャ配置する。こうするとプリントしても、PDFに書き出しても画像が高解像度で出力された。
実はこれ私も教えてもらったのだけど(ありがとうございます。)... きっと忘れるので。

—–
Snow Leopard, ファイルメーカー7

アプリケーションで使用しているフレームワークを調べる

確かOS Xには、アプリケーションで使用しているフレームワークが調べられるターミナルコマンドがあった筈。ずいぶん前のことなので完全に忘れていたけど、やっとたどり着いた。

otool -L アプリケーション名

忘れないようにメモ。

Mac OSでも楽チン Facebook編 その2 Social.framework

まずは下準備。FBにアプリケーション登録をする。登録画面には、iOSはあるもののOS X用のアプリケーションを登録する場所がない。とりあえず「ネイティブiOSアプリ」を選択しておいて問題ないようだ。次にBundle IDを作成するアプリケーションと同じにしておく。次に詳細設定でApp Typeを「Native/Desktop」にApp Secret in Clientを「いいえ」にする。これで終了。

今まで一度もFBのアプリは作ったことがないのでイマイチ手順が分からないが、とりあえず何かをリクエストしてみる。

	ACAccountStore *accountStore = [[ACAccountStore alloc]init];
	ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
	NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:@"取得したAppID",ACFacebookAppIdKey,
					[NSArray arrayWithObjects:@"publish_stream",@"publish_actions",nil],ACFacebookPermissionsKey,nil];
	[accountStore requestAccessToAccountsWithType:accountType options:options completion:^(BOOL granted, NSError *error) {
		if(granted){
			NSArray *accounts = [accountStore accountsWithAccountType:accountType];
			ACAccount *anAccount = [accounts lastObject];
			NSLog(anAccount: %@,[anAccount description]);
		}else{
			NSLog(@"error: %@",[error description]);
		}
	}];

結果は、
The Facebook server could not fulfill this access request: The app must ask for a basic read permission at install time.”

インストールした直後はまず、基本情報のパーミッションをリクエストしないといけないようだ。(install timeってそういうことでいいのかな?)

続きを読む

return top