2016-09-30 18 views
20

Cố gắng thiết lập thông báo đẩy cho iOS10. đã có nó làm việc trước đây cho các phiên bản dưới đây 10
đọc qua một số hướng dẫn cài đặt của tôi là như vậy:Gặp sự cố khi nhận thông báo đẩy trong iOS10 và iOS9

// Register for the defined notifications 

     if #available(iOS 10.0, *) { 

      let center = UNUserNotificationCenter.current() 
      center.delegate = UIApplication.shared.delegate as! AppDelegate 
      center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in 

       if error == nil { 
        UIApplication.shared.registerForRemoteNotifications() 
       } 
      } 

     } else { 

      // Fallback on earlier versions 

      let notificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: [autoCancelCategory]) 
      UIApplication.shared.registerUserNotificationSettings(notificationSettings) 
      UIApplication.shared.registerForRemoteNotifications() 

     } 

này được gọi trong lần đăng nhập^trong một trong các bộ điều khiển quan điểm của tôi.

Và bây giờ trong AppDelegate, nó phù hợp với UNUserNotificationCenterDelegate, tôi có những phương pháp:

@available(iOS 10.0, *) 
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 
    print("Got a push!") 
} 


@available(iOS 10.0, *) 
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) { 
    print("Got a push!") 
} 

Và tôi cũng có:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 

    let settings = UserDefaults.standard 
    settings.setValue(deviceToken, forKey: "deviceToken") 
} 

Thiết bị token được tải lên máy chủ như Data, và điều này đã làm việc tốt cho các phiên bản trước.
Tôi đã kiểm tra mã thông báo trên máy chủ khớp với mã trên điện thoại.
Tôi đã bật thông báo đẩy cho tất cả các mục tiêu trong Capabilities, tôi cũng đã đánh dấu Add the push Notifications entitlement to your entitlements file.
Không nhận được bất kỳ thứ gì cả khi đang đẩy.
Bất kỳ ý tưởng nào tôi có thể làm sai ở đây? Bất kỳ con trỏ nào cũng sẽ được đánh giá cao!

Cảm ơn!

EDIT: Tôi cũng nhận thấy rằng các thông báo đẩy không hoạt động trong iOS9.

+0

Có thể là sự cố hệ điều hành. Vui lòng thử bằng cách khởi động lại thiết bị. https://twitter.com/yogye7/status/781340933228945408 –

Trả lời

1

Sẽ trả lời câu hỏi này, có thể nó sẽ hữu ích cho người khác. Mã thông báo của tôi sai. Mã hóa đã thay đổi với các bản cập nhật gần đây. Tôi đã thực sự tìm kiếm trên tất cả các ngăn xếp tràn cho điều này và nó đã được sự hiểu biết của tôi rằng tôi đã phải chuyển đổi các Data đến một String bằng cách sử dụng base64string. Tuy nhiên tôi nhận thấy chuỗi này có một vài ký tự lẻ trong đó chẳng hạn như \.Tôi cuối cùng đã kết thúc thực hiện một phần mở rộng Data:

extension Data { 

    func hexString() -> String { 
     return self.reduce("") { string, byte in 
      string + String(format: "%02X", byte) 
     } 
    } 

} 

này chuyển đổi Data sang định dạng đúng. Vì vậy, nếu đây là cách bạn làm chuyển đổi của bạn, cộng với tất cả các quyền lợi được thiết lập, bạn nhớ để thêm phương pháp mới:

@available(iOS 10.0, *) 
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 
    print("Got a push!") 
} 


@available(iOS 10.0, *) 
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) { 
    print("Got a push!") 
} 

và thiết lập đối tượng delegate trong didFinishLaunchingWithOptions tất cả mọi thứ nên được tốt để đi.

2

Bạn đã kiểm tra xem Cài đặt xây dựng> Quyền ký tên mã có tham chiếu đến tệp quyền lợi không? [AppName].

Và đó các tập tin quyền lợi chứa các thông tin chính xác:

(key: APS Môi trường, giá trị: phát triển)

Ngoài ra, bạn có thể thử tái tạo chứng chỉ đẩy. Chúng tôi đã phải tạo chứng chỉ mới để làm cho nó hoạt động trong sản xuất sau khi nâng cấp IOS 10 (nhưng không phải trong môi trường sandbox).

+0

Kiểm tra cài đặt xây dựng> Quyền ký tên mã và dường như không có vấn đề gì ở đó. – Kex

+0

@Kex có cùng sự cố với số lượng ứng dụng tại công ty chúng tôi. Vui lòng kiểm tra Cài đặt xây dựng> Khả năng và đảm bảo "Thông báo" được BẬT. – ibnetariq

2

Chỉ cần lưu ý rằng bạn đang đăng ký đại biểu sau application(_:willFinishLaunchingWithOptions:) hoặc application(_:didFinishLaunchingWithOptions:) phương pháp được gọi.

Có lẽ đây là lý do tại sao các phương thức đại biểu của bạn không bị ảnh hưởng?

Xem docs:

quan trọng

Bạn phải gán đối tượng delegate của bạn đến đối tượng UNUserNotificationCenter chậm nhất trước khi ứng dụng của bạn kết thúc việc tung ra. Ví dụ: trong ứng dụng iOS, bạn phải chỉ định ứng dụng đó trong ứng dụng (: willFinishLaunchingWithOptions :) hoặc phương thức áp dụng (: didFinishLaunchingWithOptions :).

+0

Điểm đẹp! Tôi sẽ quay lại khi tôi về nhà và cho bạn biết kết quả. – Kex

+0

đã di chuyển 'let center = UNUserNotificationCenter.current(); center.delegate = self' để 'func application (_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool' và vẫn không có gì đến thông qua – Kex

+0

Tôi đã có của tôi là: ' if #available (iOS 10.0, *) { UNUserNotificationCenter.currentNotificationCenter(). delegate = self } ' – Mark

Các vấn đề liên quan