MailCore2を使ってiPhoneでメールを自動送信させる
iOSのデフォルトのメーラーライブラリではユーザに「送信」ボタンを押させるのが基本なためバックグラウンドで自動送信ができない。
そこで、SMTPクライアントのライブラリが必要になる。
探してみると skpsmtpmessage というライブラリが見つかるのだけど、非ARC時代のものなのでEXC_BAD_ACCESSが出まくって使いものにならない。
他にいいライブラリがないものかと探していた所 MailCore2 がよさげ。
いまのところ安定して動作している。
- POP, IMAP, and SMTP support
- RFC822 parser and generator
- UI widgets for rendering HTML messages
- Asynchronous APIs with Objective-C blocks
- iOS, Mac, Windows and Linux support
- Portable core engine in C++
使い方
基本的には以下のビデオで紹介されている通り。
MailCore setup example - YouTube
注意点
- 動画の設定はトッププロジェクトで設定する。(mailcore2.xcodeprojに設定してリンクエラーになってハマった)
- 動画中はlibstdc++を指定しているけど、デフォルトのlibc++でOK
サンプルコード
iPhoneバックグラウンド中にBLEからデータを取得し続ける
BLEデバイスからデータを受信しサーバーへデータをアップロードし続けるシステムを作る場合、
BLEに接続するアプリはバックグラウンドでも動作させるようにしたい。
そんな時は、以下の設定をすることでiPhoneアプリが別アプリのバックグラウンドもしくは画面がスリープ状態となっても
BLEデバイスからNoritificationを受け取ることができる。
Info.plistに以下を追加
・Required backgroud modes
・App communicates using CoreBluetooth
これで
CBCentralManagerDelegate
CBPeripheralDelegate
がバックグラウンド中でも動作するようになる。
動作環境
・Xcode 6.1
・iOS 8.1.2
参考URL:
Apple公式 CoreBluetooth プログラミングガイド
https://developer.apple.com/jp/devcenter/ios/library/documentation/CoreBluetoothPG.pdf
NSDataのバイト配列を覗く
NSData → uint8_t 配列へ変換
NSData → NSString へ変換
BLEのCharacteristic valueを見るときにつかえる。
Obj-cでメールを自動送信する
2015/01/23 追記
この記事で書いたSMTPLibraryは動作が不安定なため MailCore2 を使った方法の方が良い
MailCore2を使ってiPhoneでメールを自動送信させる - Geekleboard
参考URL先のmanni氏のソースコードを少々変更したもの
Xcode 6.1で一応はコンパイルが通りiPhone4Sで動作するけれども
- 1回の送信に50秒くらいかかる
- 送信失敗時のデリゲートに飛んでもメールがちゃんと送られている場合がある
というあやしい挙動をする。
使い方は以下
ちなみに検索ワード「obj-c メール」なんかで引っかかる情報で多いのが
AppleのMessageUIライブラリなのだけれども
それを使うとメーラーが立ち上がるため、勝手に自動送信というわけには行かない。
(ユーザが「送る」ボタンを押さないとメール送信できない)
いらなくなったiPhoneをBLEハブとして使って
定期的にメールでセンサデータをサーバへ上げたい場合に使える。
参考
Feb 5, 2012 の SMTPSender-ARC.zip が元ソース
jetseven/skpsmtpmessage · GitHub
jetseven氏のコードだとARC未対応のためビルドが通らない
木漏れ日の部屋へようこそ: iPhoneプログラミング(E-Mail自動送信にチャレンジ)
非ARCでもコンパイルオプション指定でビルドが通るらしい
obj-cではmallocを使わずNSMutableDataを使う
ARCの動いているobj-cではmallocを使わない方が良いらしい。
ということでNSMutableDataで代用する。
以下のエラーが出た時はそういうこと
malloc: *** error for object 0x00000000: incorrect checksum for freed object - object was probably modified after being freed
参考
Is it ok to use "classic" malloc()/free() in Objective-C/iPhone apps? - Stack Overflow
BLE nRF51822でFlashを使う
nRF51822でデータの永続化をしたくなった場合はpstorageを使うのが正解らしい。
pstorageはFlashアクセスのマネージメントをしてくれる仕組みの様子。
サンプルのソースコードはここ
How can i write 10kB of data to internal flash? - Nordic Developer Zone