質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.35%

  • Swift

    5031questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • iOS

    2956questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Xcode

    2851questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

NotificationServiceExtensionを利用したプッシュ通知で、プッシュ通知に動画が表示されない

受付中

回答 0

投稿 2017/11/30 16:23 ・編集 2017/11/30 16:42

flag 質問者が6時間前に「まだ回答を求めています」と言っています。

  • 評価
  • クリップ 0
  • VIEW 36

carpbream

score 6

Notification Service Extensionを利用して動画つきプッシュを受信しようとしていますが、動画のついていないプッシュが受信されてしまっています。

静止画像(.jpg)やGIF画像(.gif)は想定通り画像付きプッシュの受信が行えるのですが、Payloadの内容のメディアのURLに動画(.mpg,.mpeg,.m2v,.avi)を指定すると動画が添付されず文字列のみのプッシュが受信されます。

このとき、メディアのURL以外は何も変更をしていません。
動画のサイズについては全て6MB以下、3秒ほどの動画でテストを行っています。
メディアは静止画・GIF画像・動画全てS3の同じバケットに存在するものをhttps通信で取得できるようにしています。

<環境・条件>
macOS Sierra(ver10.12.6)
Xcode9.1
DeploymentTarget: iOS10.3 ※テストアプリとExtensionは常に同じDeploymentTargetを指定
テスト端末:iPhone6(iOS11.0.3)、iPhone8(iOS11.1.2) ※両方同じ挙動

Payloadの内容

{
    "aps":{
        "alert": {
            "title": "This is title.",
            "subtitle": "This is subtitle.",
            "body": "This is body."
        },
        "sound": "default",
        "mutable-content": 1
    },
    "media": "(メディアのURL)"
}

Extensionの内容

class NotificationService: UNNotificationServiceExtension {
    let imageKey = "media"

    var contentHandler: ((UNNotificationContent) -> Void)?
    var bestAttemptContent: UNMutableNotificationContent?

    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

        if let imageUrlString = request.content.userInfo[imageKey] as? String {

            let imageUrl = URL(string: imageUrlString)!
            let session = URLSession(configuration: URLSessionConfiguration.default)
            let task = session.dataTask(with: imageUrl, completionHandler: {[weak self](data, response, error) in
                do {
                    if let writePath = NSURL(fileURLWithPath:NSTemporaryDirectory())
                        .appendingPathComponent(imageUrl.lastPathComponent) {
                        try data?.write(to: writePath)

                        let identifier = "push_identifier"
                        if let bestAttemptContent = self?.bestAttemptContent {
                            let attachment = try UNNotificationAttachment(identifier: identifier, url: writePath, options: nil)
                            bestAttemptContent.attachments = [attachment]
                            contentHandler(bestAttemptContent)
                        }
                    } else {
                        if let bestAttemptContent = self?.bestAttemptContent {
                            contentHandler(bestAttemptContent)
                        }
                    }
                } catch let error as NSError {
                    print(error.localizedDescription)

                    if let bestAttemptContent = self?.bestAttemptContent {
                        contentHandler(bestAttemptContent)
                    }
                }
            })
            task.resume()
        } else {
            if let bestAttemptContent = self.bestAttemptContent {
                contentHandler(bestAttemptContent)
            }
        }
    }

    override func serviceExtensionTimeWillExpire() {
        // Called just before the extension will be terminated by the system.
        // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
        if let contentHandler = contentHandler, let bestAttemptContent =  bestAttemptContent {
            contentHandler(bestAttemptContent)
        }
    }
}


以上よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.35%

関連した質問

同じタグがついた質問を見る

  • Swift

    5031questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • iOS

    2956questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Xcode

    2851questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。