2017-07-14 157 views
2

我的設備沒有收到後臺推送通知。我很有智慧,我嘗試了每個可以通過Stack Overflow找到並搜索到的教程。iOS沒有收到使用apn nodejs的後臺推送通知

  • 設備和APN設置爲調試/開發
  • 我可以成功註冊設備令牌
  • 我有推送通知服務
  • APN積極.p8鍵說,推送消息發送成功
  • didReceiveRemoteNotification不火
  • 嘗試使用AWS在後臺應用和前景
  • :入站 - 端口22,出結合 - 所有端口

這是響應:

{ 「發送」:[{ 「設備」: 「cc7ec9a821cf232f9510193ca3ffe7d13dd756351794df3f3e44f9112c037c2a」}], 「失敗」:[]}

這裏是我的代碼:

AppDelegate.swift

import UIKit 
import UserNotifications 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     if #available(iOS 10, *) { 
      let center = UNUserNotificationCenter.current() 
      center.delegate = self 
      center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in 
       if error == nil { 
        UIApplication.shared.registerForRemoteNotifications() 
       } 
      } 
     } 
    } 

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {    
     var deviceTokenString: String = "" 
     for i in 0..<deviceToken.count { 
      deviceTokenString += String(format: "%02.2hhx", deviceToken[i] as CVarArg) 
     } 
     UserDefaults.standard.set(deviceTokenString, forKey: "push_token") 
    } 


    @available(iOS 10.0, *) 
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (_ options: UNNotificationPresentationOptions) -> Void) { 
     print("Handle push from foreground") 
     print("\(notification.request.content.userInfo)") 
     completionHandler([.alert, .badge, .sound]) 
    } 

    @available(iOS 10.0, *) 
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) { 
     print("Handle push from background or closed") 
     // if you set a member variable in didReceiveRemoteNotification, you will know if this is from closed or background 
     print("\(response.notification.request.content.userInfo)") 
     completionHandler() 
    } 
} 

的XCode:

enter image description here enter image description here

Node.js的

.p8關鍵是從開發者控制檯:鍵>所有

var apn = require('apn'); 

var apnProvider = new apn.Provider({ 
    token: { 
     key: "/path/to/AuthKey_1234ABCD.p8", 
     keyId: "1234ABCD", 
     teamId: "1234ABCD" 
    }, 
    production: false 
}); 

var note = new apn.Notification(); 
note.topic = "com.company.app"; 
note.payload = { 
    aps: { 
     "content-available" : 1 
    }, 
    custom_field: {} 
}; 

apnProvider.send(note, push_token).then(result => { 
      console.log('result: ', result); 
      console.log("sent:", result.sent.length); 
      console.log("failed:", result.failed.length); 
}); 
+0

我已經發送的iOS使用'cert.pem'和'key.pem'推送消息。我不知道這個例子會有幫助。我可以發佈它,但只是想確認這是否可能在你的情況下 –

+0

@KukicVladimir你用什麼node.js庫發送推送通知? – Andrew

+0

我正在使用'apn',和你一樣 –

回答

0

我不知道,如果是這樣的話因爲您的服務器正在使用此APN節點模塊,並且我從未使用它,但是我使用Firebase,並且每次嘗試使用content_available : 1時都無法使用。什麼工作是content_available : true

希望這對你有用。

0

您寫了這對你的AppDelegate

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { 
     print("Silent push notification received: \(userInfo)")  
    } 

但後來你還寫道:

center.delegate = notificationDelegate 

,這意味着你的AppDelegate 不是的通知中心的委託。

要麼改變,要

center.delegate = self 

或者只是刪除功能是採用它即班級的UYLNotificationDelegate

你似乎擁有一切權利。雖然我不知道如何讀取node.js,所以您可能已經配置了不正確的負載。有時候,如果服務器沒有正確管理多個設備令牌,您可能不會收到任何安全通知,或者我們與後端發生的另一個問題是,在我們測試通知時他們將通知服務器重定向到本地計算機,顯然他們沒有進來!

Apple樣本有效載荷應該是這樣的:

{ 
    "aps" : { 
     "content-available" : 1 
    }, 
    "acme1" : "bar", 
    "acme2" : 42 
} 

。您確定要產生有效載荷具有類似的格式?

  • 我錯誤地建議,你應該改變center.delegate = notificationDelegatecenter.delegate = self,但如果我是絕望的我給一個嘗試:d。

  • 確保background App Refresh啓用(雖然仍然沒有這使你應該得到的前景

  • 如果這不起作用,然後嘗試與警報/徽章發送它,並看到 是否可行。可能的它不會工作:/

  • 刪除應用程序,然後安裝 再次有時候授權不,如果你 重裝剛剛工作正確
  • 乾淨得出的數據,乾淨的構建,重新啓動的Xcode

在您編輯後:

你不應該刪除的didReceive 遠程通知< - 這是用於檢索具有content-available : 1任何推送通知。

  • willPresent是回調如果應用程序在FOREGROUND中該怎麼做。僅當有效載荷在有效載荷中具有警報或徽章或聲音時才適用
  • didReceiveNotificationResponse不是你認爲的那樣。它用於處理管理用戶從通知中選擇的操作,例如您的通知有兩個動作(貪睡,刪除),點擊如下圖所示: enter image description here

您處理響應使用此回調通知。

所以從技術上講,如果你只是有一個安靜的通知,你只會得到第三個回調,而不是前兩個。

如果你有一個應用程序在前臺,有效載荷有:content-available :1也有動作,用戶點擊動作,那麼你會首先得到第三個回調,然後第一個回調,然後第二個回調。

+0

我真的很感激你的迴應,我已經清理了我的AppDelegate,使得更容易看到發生了什麼 – Andrew

+0

@Andrew看到我的編輯 – Honey

0

我很感謝大家的意見,我想清楚了這個問題。

'aps'不屬於有效負載字段,而應該在Notification構造函數中。

的Node.js:

var note = new apn.Notification({ 
    aps: { 
     "content-available" : 1 
    } 
}); 

note.payload = { 
    custom_field_1: {}, 
    custom_field_2: '' 
};