2015-05-03 17 views
11

Tôi bằng cách nào đó không thể nhận được mã thông báo thiết bị khi đăng ký các thông báo từ xa. Tôi nhận được các phương thức nói "Bạn có muốn cho phép App X có thể gửi cho bạn notificaitons", nhưng khi tôi chấp nhận nó, các didRegisterForRemoteNotifications chức năng không được gọi.Mã thông báo thiết bị không nhận được khi đăng ký các thông báo từ xa trong Swift

Khi tôi đăng ký thông báo từ xa trong iOS 8/Swift sử dụng mã này:

UIApplication.sharedApplication().registerForRemoteNotifications() 
    let settings = UIUserNotificationSettings(forTypes: UIUserNotificationType.Badge | UIUserNotificationType.Alert | UIUserNotificationType.Sound, categories: nil) 
    UIApplication.sharedApplication().registerUserNotificationSettings(settings) 
    UIApplication.sharedApplication().registerForRemoteNotifications() 

Các chức năng này không được kích hoạt ở tất cả:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData!) 

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError!) 

tuy nhiên khi tôi đăng nhập

này 210
println("current settings \(UIApplication.sharedApplication().currentUserNotificationSettings()) and \(UIApplication.sharedApplication().isRegisteredForRemoteNotifications())") 

tôi nhận

"current settings <UIUserNotificationSettings: 0x170437120; types: (UIUserNotificationTypeAlert UIUserNotificationTypeBadge UIUserNotificationTypeSound);> and true" 

hồ sơ provisioning tôi và giấy chứng nhận ar tất cả theo thứ tự.

Có ai khác đã gặp sự cố này không?

+0

Tại sao bạn gọi 'registerForRemoteNotifications()' hai lần? – ricardopereira

+0

1) tạo thông báo đẩy và đính kèm với hồ sơ của bạn 2) về khả năng đẩy thông báo 3) Gửi mã thông báo thiết bị xem thêm câu trả lời của tôi là có –

Trả lời

22

Bạn có thể thử

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

     var types: UIUserNotificationType = UIUserNotificationType.Badge | 
      UIUserNotificationType.Alert | 
      UIUserNotificationType.Sound 

     var settings: UIUserNotificationSettings = UIUserNotificationSettings(forTypes: types, categories: nil) 

     application.registerUserNotificationSettings(settings) 
     application.registerForRemoteNotifications() 

     return true 
    } 

    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { 

     var characterSet: NSCharacterSet = NSCharacterSet(charactersInString: "<>") 

     var deviceTokenString: String = (deviceToken.description as NSString) 
      .stringByTrimmingCharactersInSet(characterSet) 
      .stringByReplacingOccurrencesOfString(" ", withString: "") as String 

     println(deviceTokenString) 

    } 

EDIT này: Cập nhật cho 2.x Swift

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


     let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil) 

     application.registerUserNotificationSettings(settings) 
     application.registerForRemoteNotifications() 

     return true 
    } 

EDIT: Cập nhật cho 3.x Swift

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

    let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil) 

    application.registerUserNotificationSettings(settings) 
    application.registerForRemoteNotifications() 

    return true 
} 


func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { 
let characterSet = CharacterSet(charactersIn: "<>") 
    let deviceTokenString = deviceToken.description.trimmingCharacters(in: characterSet).replacingOccurrences(of: " ", with: ""); 
    print(deviceTokenString) 
} 
+1

Vẫn không hoạt động! Nó có thể có gì để làm với một giấy chứng nhận? –

+0

có, những gì bạn cần làm, tạo lại từ đầu. –

+0

vui lòng upvote :) –

0

Nếu bạn nhận được thông báo này, thì bạn đã đăng ký và phương thức sẽ chỉ được gọi khi ứng dụng được khởi chạy hoặc mã thông báo được thay đổi. Có rất ít khả năng mã thông báo sẽ được cập nhật.

Có thể, bạn có thể thử xóa ứng dụng khỏi thiết bị thử và cố gắng xóa nó khỏi Xcode. Và làm lại lần nữa.

+0

Cảm ơn bạn đã trả lời, nhưng tôi đã thử và thử nhiều lần thiết bị. –

1

Đỗ điều này:

UIApplication.sharedApplication().registerForRemoteNotifications() 
1

Hãy đảm bảo giấy chứng nhận của bạn hợp lệ và ứng dụng được đăng ký thành công, Làm một số Googling và u chắc chắn sẽ tìm đúng cách. Mã này đã hoạt động cho tôi.

(trong AppDelegate.swift phương pháp didFinishLaunchingWithOptions)

var notify : UIUserNotificationSettings = UIUserNotificationSettings(forTypes:UIUserNotificationType.Alert|UIUserNotificationType.Sound, categories: nil) 
    UIApplication.sharedApplication().registerUserNotificationSettings(notify) 
    UIApplication.sharedApplication().registerForRemoteNotifications() 

// Thêm phương pháp Đại biểu UIApplication

func application(application: UIApplication,didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData){ 
//send this device token to server 

    println("\(deviceToken)") 
} 

// Được gọi là nếu không thể đăng ký cho APNS.

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) { 

    println(error) 

} 
4

Đối với Swift 3.0 bạn có thể sử dụng:

let deviceTokenString = message.reduce("", {$0 + String(format: "%02X", $1)}) 
Các vấn đề liên quan