読者です 読者をやめる 読者になる 読者になる

Swift,Objective-Cプログラミング ~ iOS ~

Objective-C,Swift,Apple Watchなどのプログラミング

【iOS Swift入門 #293】iOS10 画像添付したローカル通知を送信・受信する

Swift Swift3.0 iOS プログラミング

f:id:fjswkun:20161202204331p:plain

はじめに

画像添付したローカル通知を送信・受信する処理を確認します。

これ以降のサンプルは下記記事のサンプルの続きです。
そもそも、iOS10のローカル通知について初めてという場合は↓参照。 swift.swift-studying.com

実装

UNMutableNotificationContentオブジェクトの
attachmentsプロパティに画像のパスを追加してあげればよい。

ローカル通知に画像を添付

コメント「contentsに追加」で

  • 画像のダウンロード
  • 通知内容への画像の添付

を行っています。

アプリ起動し、ボタンタップ
f:id:fjswkun:20161202195045p:plain

ホーム画面で待つと通知
f:id:fjswkun:20161202203548p:plain

3D Touchをすると詳細表示
f:id:fjswkun:20161202211451p:plain

import UIKit
import UserNotifications

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let button = UIButton(type: .system)
        button.setTitle("通知追加", for: .normal)
        button.sizeToFit()
        button.center = view.center
        button.addTarget(self, action: #selector(addNotification), for: .touchUpInside)
        view.addSubview(button)
        
        // 通知許可の取得
        requestPermission()
    }
    
    func addNotification(){
        // コンテンツの作成
        let content = UNMutableNotificationContent()
        content.title = "This is title."
        content.subtitle = "This is subtitle."
        content.body = "This is body. \nHello world!"
        
        // 通知の登録
        func registNotification(with content:UNMutableNotificationContent){
            // トリガーの作成(5秒後に通知実行)
            let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 10.0, repeats: false)
            
            // リクエストの作成
            let identifier = NSUUID().uuidString
            let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
            
            // リクエスト実行
            UNUserNotificationCenter.current().add(request){
                error in print(error?.localizedDescription)
            }
        }
        
        // contentsに追加
        download(url: "http://cdn-ak.f.st-hatena.com/images/fotolife/f/fjswkun/20151005/20151005235737.png",
                 success: { url in
                    do{
                        let attachment = try UNNotificationAttachment(identifier: UUID().uuidString, url: url, options: nil)
                        content.attachments.append(attachment)
                    }catch{}
                    
                    defer{
                        registNotification(with: content)
                    }
        },
                 failure: { error in
                    print(error)
                    registNotification(with: content)
        })
    }
    
    // ダウンロード処理
    private func download(url:String, success:((_ url:URL) -> Void)?, failure:((_ error:Error) -> Void)?){
        
        guard let url = URL(string: url) else{
            failure?(NotificationServiceError.invalidURLError)
            return
        }
        
        let session = URLSession(configuration: .default)
        session.downloadTask(with: url){
            url, response, error in
            
            if let error = error{
                failure?(error)
                return
            }
            
            guard let url = url else{
                failure?(NotificationServiceError.notExistsContent)
                return
            }
            
            let copyURL = URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!).appendingPathComponent("image.png")
            do{
                try FileManager.default.copyItem(at: url, to: copyURL)
            }
            catch(let error){
                failure?(error)
            }
            success?(copyURL)
            }.resume()
    }
    
    private enum NotificationServiceError:Error {
        case invalidURLError
        case notExistsContent
    }

    private func requestPermission(){
        UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .sound]){
            granted, errror in
            
            if granted{
                print("notification permission granted")
            }else{
                print("notification permission denied")
            }
        }
    }
}

サンプルのダウンロード

こちらからダウンロード。
SampleLocalNotification.zip - Google ドライブ

参考情報

Swift

iOSアプリ開発未経験の人向け
・Swift初心者の人に評判が良いようですね


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift

詳解 Swift 改訂版

詳解 Swift 改訂版