anz blog

画像つきプッシュ通知でちょいハマった話

2018-06-27 #Swift

いまTODOアプリみたいなのつくってて...
それのプッシュ通知に画像をつけようとしてちょいハマったのでそこらの話。

UNNotificationAttachment って画像移動させるんだね

です。

結論先に書いちゃってるので、「そだね〜」っていう人は回れ右!(笑)

環境

  • Xcode 9.4

やりたかったこと

カメラで撮影した画像をアプリ内に保存したのだけれど、その画像をローカルプッシュ通知に載せたいな〜
というもの。
なので、UNNotificationAttachmentで画像を保存した URL を指定したら良いのでしょうと思ってやってみたのです。

guard let picPath = FileManager.default.urls(
    for: .documentDirectory, 
    in: .userDomainMask
).first?.appendingPathComponent("pic.jpg") else {
    return
}

do {
    let content = UNMutableNotificationContent()
    content.title = "通知だよ〜"
    let attachment = try UNNotificationAttachment(
        indentifier: "pic",
        url: picPath,
        options: nil
    )
    contennt.attachments = [attachment]
}

全部ではないけれど、こういう感じ。
これで一応通知にはちゃんと画像が表示されたのだけれど、、
アプリ内で保存してあった画像が表示されなくなった...

picPath からファイルパスを出させてみてみると、確かに無い。
でも、通知には表示される...いったいどこから画像参照してるの??っていう話なのだけれど...。

ドキュメントに理由が書かれてました...。

attached files are moved into the attachment data store

attachment data store なるものが具体的にどこなのかはしらないけれど..つまりそういうこと。
アプリ内に保存してあったファイルはそこに移動されてしまったので、アプリからは参照できなくなったと。。

対策

アプリ内で使ってるファイルを直接指定しちゃ駄目っていうことです。
いったん別場所にコピーしましょうね(移動されても問題ないように)...と。

let tempPath = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("temp.jpg")
try FileManager.default.copyItem(
    at: picPath, 
    to: tempPath
)
// で、コピったものを指定する
let attachment = try UNNotificationAttachment(
    indentifier: "pic",
    url: tempPath,
    options: nil
)

こういう感じ。