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ってそういうことでいいのかな?)

続きを読む

Mac OSでも楽チン Facebook編 その1 NSSharingService

前回タイトルを楽チン ツイートにしてしまったので、フェイスブックにかえるとなんだけヘンテコなタイトルになってしまった。

OS X 10.8.2 になって Facebook連携にも対応した。10.8で既にTwitter連携は搭載済だったが、Facebookも同様に楽チンに連携できるのか試してみた。
もちろん、FBアカウントは取得済みで、アカウントを「システム環境設定:メール/連絡先/カレンダー」に登録しておく必要がある。(ちなみにFBのテストアカウントは登録できなかった。)
まずはTwitter同様にNSSharingServiceから。同様にNSSharingServiceDelegateプロトコルを追加して、

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{
	NSSharingService *service = [NSSharingService sharingServiceNamed:NSSharingServiceNamePostOnFacebook];
	service.delegate = self;
	[service performWithItems:[NSArray arrayWithObject:@"hello"]];
}

すると、

ダイアログが表示された。左上で公開範囲を指定できる。
一つ分からないのだが、FBでは本文中のURLにプレビューがつくようなのだが、これを実現する方法がわからない。Safariの共有から投稿するとそのページのプレビューが一緒に投稿できるが、performWithItemsにNSURLを突っ込んでもNSStringで文中にhttp://から始まる文書をいれても同じようにならない。さてどうするのかな?

return top