2017-04-25 6 views
3

が付属しています私がやること。 "response.notification.request.content.categoryIdentifier"は、期待される値で正しく来るが、request.actionIdentifierは決して正しく来ない(以下の例では "mycustomactionidentifier")。誰かが何かを見逃しているか知っていますか?ユーザ通知要求は常に私がUNUserNotificationCenterDelegate(>イオス10)を使用していると私は通知からの応答を確認することができますデリゲートメソッドのいずれかを問わず、常にactionIdentifier等しい「com.apple.UNNotificationDefaultActionIdentifier」を持っていないデフォルトのアクション識別子

extension NotificationManager: UNUserNotificationCenterDelegate { 


    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Swift.Void) { 

     completionHandler([.alert,.sound]) 
    } 

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Swift.Void) { 

     if response.notification.request.content.categoryIdentifier == "TEST" { 
      if response.actionIdentifier == "mycustomactionidentifier" { 
       NSLog("it finally works dude!") 
      } 
     } 

     completionHandler() 
    } 
} 

私は通知センターにアクションとカテゴリを追加しました:

let uploadAction = UNNotificationAction(identifier: "mycustomactionidentifier", title: "Uploaded", options: []) 
    let category = UNNotificationCategory(identifier: "TEST", actions: [uploadAction], intentIdentifiers: []) 
    center.setNotificationCategories([category]) 

と正しい識別子入れてリクエスト送信しています:まず

let uploadContent = UNMutableNotificationContent() 
    uploadContent.title = String(number) + " asset(s) added" 
    uploadContent.body = "Check your inventory to manage your assets!" 
    uploadContent.categoryIdentifier = "TEST" 

    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 6, repeats: false) 

    let uploadRequestIdentifier = "mycustomactionidentifier" 
    let uploadRequest = UNNotificationRequest(identifier: uploadRequestIdentifier, content: uploadContent, trigger: trigger) 
    UNUserNotificationCenter.current().add(uploadRequest, withCompletionHandler: nil) 
+0

あなたの画面に通知が来るとどうなりますか?スクリーンショットを追加できますか?あなたはどんな行動をしますか? – Honey

+0

あなたは間違った比較をしています。あなたのアクション識別子は "mycustomactidentifier"ですが、あなたは "mycustomidentifier"としてチェックしています。したがって、コンパイラは単にアクション識別子を無視しました。 – Mannopson

+0

こんにちは@ハニー、それは私が選んだように、タイトルと本文で、定期的な通知として来る。通知をクリックすると正しいcategoryIdentifierが返されますが、間違ったactionIdentifierが返されます。 – user2116499

答えて

3

を:あなたのカスタムアクションを登録します。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    // Override point for customization after application launch. 

    UNUserNotificationCenter.current().delegate = self 
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound]) { (granted, error) in 
     if granted { 
     // Access granted 
     } else { 
     // Access denied 
     } 
    } 

    self.registerNotificationAction() 

    return true 
} 

func registerNotificationAction() { 

    let first = UNNotificationAction.init(identifier: "first", title: "Action", options: []) 
    let category = UNNotificationCategory.init(identifier: "categoryIdentifier", actions: [first], intentIdentifiers: [], options: []) 
    UNUserNotificationCenter.current().setNotificationCategories([category]) 
} 

とユニークな識別子を持つコンテンツ作成:最後に

func scheduleNotification() { 

    // Create a content 
    let content = UNMutableNotificationContent.init() 
    content.title = NSString.localizedUserNotificationString(forKey: "Some title", arguments: nil) 
    content.body = NSString.localizedUserNotificationString(forKey: "Body of notification", arguments: nil) 
    content.sound = UNNotificationSound.default() 
    content.categoryIdentifier = "categoryIdentifier" 

    // Create an unique identifier for each notification 
    let identifier = UUID.init().uuidString 

    // Notification trigger 
    let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 5, repeats: false) 

    // Notification request 
    let request = UNNotificationRequest.init(identifier: identifier, content: content, trigger: trigger) 

    // Add request 
    UNUserNotificationCenter.current().add(request, withCompletionHandler: nil) 

} 

を:デフォルトおよびカスタムアクションで通知を処理します。

extension AppDelegate: UNUserNotificationCenterDelegate { 

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) { 

     if response.notification.request.content.categoryIdentifier == "categoryIdentifier" { 

      switch response.actionIdentifier { 
      case UNNotificationDefaultActionIdentifier: 
       print(response.actionIdentifier) 
       completionHandler() 
      case "first": 
       print(response.actionIdentifier) 
       completionHandler() 
      default: 
       break; 
      } 
     } 
    } 

    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 

     completionHandler([.alert, .sound]) 
    } 
} 

希望します。

Second Editionの

ここでの結果です:これは私たちUNNotificationDefaultActionIdentifierになるだろう:

UNNotificationDefaultActionIdentifier

そして、この1は、通知のバージョンを展開している、我々は両方のアクションを扱うことができる:

Expanded notification

+0

こんにちはMannopson、私はまさにあなたが言ったようにしましたが、アクション識別子「X」の通知を送信すると、通知をクリックすると「com.apple」が表示されます。 – user2116499

+0

@ user2116499通知がユーザーに配信されるたびに、ユーザーがそれをタップすると、UNNotificationDefaultActionIdentifierが呼び出されます。これは既定のアクションであり、ユーザーが提供するものです。システムが私の提案は完全に動作しています – Mannopson

+0

こんにちは@Mannopson、あなたは識別子= "first"のアクションを作成しました。通知をクリックすると、アクション識別子= "first"ありがとう! – user2116499

1

Mannopson氏によると、デフォルトのアクション識別子を登録することができます。 私に何が必要のに別のものですが:

response.notification.request.identifier

Apple's actionIdentifier descriptionから、このパラメータは、あなたのUNNotificationActionオブジェクトの1の1つの識別子を含んでいてもよく、あるいは、それはシステムを含んでいてもよいです定義済みの識別子。それはあなたが1つを登録する必要があることを意味します、私は正しいと思います(私は素早くするための初心者です)

関連する問題