Geekleboard

Geekな奴がハード開発に関する情報を発信中

MailCore2を使ってiPhoneでメールを自動送信させる

iOSのデフォルトのメーラーライブラリではユーザに「送信」ボタンを押させるのが基本なためバックグラウンドで自動送信ができない。

そこで、SMTPクライアントのライブラリが必要になる。

探してみると skpsmtpmessage というライブラリが見つかるのだけど、非ARC時代のものなのでEXC_BAD_ACCESSが出まくって使いものにならない。

他にいいライブラリがないものかと探していた所 MailCore2 がよさげ。

いまのところ安定して動作している。

 

MailCore

使い方

基本的には以下のビデオで紹介されている通り。


MailCore setup example - YouTube

注意点

  1. 動画の設定はトッププロジェクトで設定する。(mailcore2.xcodeprojに設定してリンクエラーになってハマった)
  2. 動画中はlibstdc++を指定しているけど、デフォルトのlibc++でOK

サンプルコード 

 

iPhoneバックグラウンド中にBLEからデータを取得し続ける

BLEデバイスからデータを受信しサーバーへデータをアップロードし続けるシステムを作る場合、

BLEに接続するアプリはバックグラウンドでも動作させるようにしたい。

 

そんな時は、以下の設定をすることでiPhoneアプリが別アプリのバックグラウンドもしくは画面がスリープ状態となっても

BLEデバイスからNoritificationを受け取ることができる。

 

Info.plistに以下を追加

f:id:ksksue:20141223093918p:plain

・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

Obj-cでメールを自動送信する

2015/01/23 追記

この記事で書いたSMTPLibraryは動作が不安定なため MailCore2 を使った方法の方が良い


MailCore2を使ってiPhoneでメールを自動送信させる - Geekleboard

 

参考URL先のmanni氏のソースコードを少々変更したもの

Dropbox - SMTPLibrary-ARC.zip

Xcode 6.1で一応はコンパイルが通りiPhone4Sで動作するけれども

  • 1回の送信に50秒くらいかかる
  • 送信失敗時のデリゲートに飛んでもメールがちゃんと送られている場合がある

というあやしい挙動をする。

 

使い方は以下

 

ちなみに検索ワード「obj-c メール」なんかで引っかかる情報で多いのが

AppleのMessageUIライブラリなのだけれども

それを使うとメーラーが立ち上がるため、勝手に自動送信というわけには行かない。

(ユーザが「送る」ボタンを押さないとメール送信できない)

 

いらなくなったiPhoneをBLEハブとして使って

定期的にメールでセンサデータをサーバへ上げたい場合に使える。

 

参考

Issue 56 - skpsmtpmessage - ARC compatibility and Invalid Email Address crash - Quick SMTP client code for the iPhone - Google Project Hosting

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

 

なぜpstorageを使うのか?

続きを読む