カテゴリー ‘ MacOS/iOS Dev.

OS X LocalhostのApache PHP からプロバイダのSMTPサーバーでメール送信

OS X のLocalhost内のApache + PHPのmb_sendmailからプロバイダのSMTPサーバを指定してメール送信すると「Domain of sender address _www@hoge.local does not exist」送信元ドメインが存在しないので、失敗します。

php.iniやpostfixをいじるなどのいろいろな情報があったのですが、最終的に下記で解決しました。
ざっくりいうと、送信用のアカウント・パスワードとドメインをpostfix上で指定するという設定作業です。

お約束ですが、作業はすべて自己責任で行ってください。

————–
例)
OS Xローカルサーバー:hoge.local
プロバイダ:foo.ne.jp
送信ポート:587

すべてターミナル上での作業です。

  1. postfixの起動
    # sudo postfix start
  2. main.cfの編集(編集にはもっぱらpicoを使っています。)
    # sudo pico /etc/postfix/main.cf

    relayhost = [smtp.foo.ne.jp]:587
    smtp_sasl_auth_enable = yes
    smtp_sasl_password_maps = hash:/etc/postfix/authinfo
    smtp_sasl_security_options = noanonymous
    smtp_sasl_mechanism_filter = CRAM-MD5 PLAIN
    smtp_generic_maps = hash:/etc/postfix/sender_canonical
    ※認証方法はプロバイダによって違います。こちらに詳しく記載されています。

  3. 認証ファイルの作成
    # sudo pico /etc/postfix/authinfo

    [smtp.foo.ne.jp]:587 bar@foo.ne.jp:password

    # sudo postmap /etc/postfix/authinfo

  4. sender_canonicalファイルの作成 こちらに詳しく記載されています。
    # sudo pico /etc/postfix/sender_canonical

    @hoge.local bar@foo.ne.jp

    # sudo hash:/etc/postfix/sender_canonical

  5. postfixのリロード

    # sudo postfix reload

以上でPHPからmb_sendmailでメールの送信に成功しました。

参考にさせていただいた2つのサイトの方に感謝します。

 

OS X 10.10.5, PHP 5.5.29

plistのバイナリ変換はplutil

今更なのだろうけど、plistのフォーマット変換はコマンドラインのplutilで出来るんですね。

[テキスト形式]plutil -convert xml1 info.plist
[バイナリ形式]plutil -convert binary1 info.plist

他にも豊富な機能があるみたい。以前はplistエディタでこのあたりできたと思うんですが...

OS X 10.10.5

undefined symbols for architecture arm64 ビルドできない

Xcodeのバージョンアップのタイミングで、「undefined symbols for architecture arm64」エラーがでてビルドできなくなった。

メニューの「Clean」を実行して再ビルドするなど、試行錯誤するもエラーは消えず全く前に進まない。そういえば幾つか前のXcodeだかProjectBuilder時代には「全てをクリーン」などというメニューがあったなぁと思い、Prefereceのキーバインドを見るとメニューアイテムにはないものの「Clean build folder…」というのがありました。

shift + command + option + k

これで無事ビルドできた。何時間掛かってるんだか。

NSUserDefaults設定ファイルの場所

環境設定パネル等を作る時に、NSUserDefaultsとCocoa Bindingsの組み合わせはとても便利で使いやすい。

それぞれの設定値は、.plist形式で~/Library/Preferenceに保存される。ところがMacApp Centerで配布するアプリケーションを開発中は、サンドボックスを使用する関係上、保存場所が違う。

~/Library/Containers/com.yoursite.appname/Data/Library/Preference

ここに保存されている。いつもすっかり忘れてしばらく探しまくっている。

Xcode5

UINavigationBarとUIScrollViewずれる!

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

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

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

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

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

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

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

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

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

忘れないようにメモ。

return top