GCM IOS NotRegistered проблема

Я давно уже пользуюсь GCM. Однажды это внезапно сломалось. Проблема в том, что при первом отправленном мной сообщении я получаю статус успеха, но приложение вообще не получает никакого нажатия. Второй отправляемый мною запрос завершается с ошибкой NotRegistered. Я переустанавливаю приложение: успех (уведомление не получено), сбой (NotRegistered) -> Loop. Я не знаю, что изменилось. Поддержка Google очень бесполезна и занимает много времени, отвечая на простой вопрос, является ли это проблемой GCM, APNs или клиентской проблемой. Если у кого-то была такая проблема, пожалуйста, дайте мне знать, что искать. Вот как это выглядит:

Я подозреваю, что это произошло после обновления до iOS 9. Хотя я не уверен. Если в новой iOS есть вещи, которые могут блокировать GCM, я был бы признателен, если бы кто-то на это указал.

ОБНОВИТЬ:

GCM не работает с NotRegistered

у того парня была похожая проблема. Проблема была с некоторым файлом манифеста. Могут ли быть какие-то записи в Info.plist, которые мне нужно добавить для iOS 9, чтобы разрешить GCM?

ОБНОВИТЬ:

onTokenRefresh вызывается при каждом запуске приложения. Но я получаю тот же токен обратно. Я подозреваю, что существует проблема с токеном на сервере GCM.

КОД ДЕЛЕГАТА GCM В APPDELEGATE:

var connectedToGCM = false


private var deviceToken: NSData?

var gcmSenderID: String!
let authorizedEntity = "my GCM Sender_ID"


public func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    var configureError:NSError?
    GGLContext.sharedInstance().configureWithError(&configureError)
    assert(configureError == nil, "Error configuring Google services: \(configureError)")
    gcmSenderID = GGLContext.sharedInstance().configuration.gcmSenderID
    // [END_EXCLUDE]
    // Register for remote notifications
    if #available(iOS 8.0, *) {
        let settings: UIUserNotificationSettings =
        UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
        application.registerUserNotificationSettings(settings)
        application.registerForRemoteNotifications()
    } else {
        // Fallback
        let types: UIRemoteNotificationType = [.Alert, .Badge, .Sound]
        application.registerForRemoteNotificationTypes(types)
    }

    // [END register_for_remote_notifications]
    // [START start_gcm_service]
    let gcmConfig = GCMConfig.defaultConfig()
    GCMService.sharedInstance().startWithConfig(gcmConfig)

    return true
}

public func onTokenRefresh() {
    print("Token needs to be refreshed!")
    let options = [
        kGGLInstanceIDRegisterAPNSOption : deviceToken!,
        kGGLInstanceIDAPNSServerTypeSandboxOption : true
    ]
           GGLInstanceID.sharedInstance().tokenWithAuthorizedEntity(authorizedEntity, scope: kGGLInstanceIDScopeGCM, options: options) { (token, error) -> Void in
        if error != nil {
            print("Error: \(error.localizedDescription)")
        } else {
            print("Token: \(token)")
        }
    }
}


public func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}

public func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    let instanceIDConfig = GGLInstanceIDConfig.defaultConfig()
    instanceIDConfig.delegate = self
    // Start the GGLInstanceID shared instance with that config and request a registration
    // token to enable reception of notifications
    GGLInstanceID.sharedInstance().startWithConfig(instanceIDConfig)
    self.deviceToken = deviceToken
}

public func applicationDidEnterBackground(application: UIApplication) {
    GCMService.sharedInstance().disconnect()
    connectedToGCM = false
}

public func applicationDidBecomeActive( application: UIApplication) {
    print("App became active")
    UIApplication.sharedApplication().applicationIconBadgeNumber = 0
    // Connect to the GCM server to receive non-APNS notifications
    GCMService.sharedInstance().connectWithHandler({
        (NSError error) -> Void in
        if error != nil {
            print("Could not connect to GCM: \(error.localizedDescription)")
        } else {
            self.connectedToGCM = true
            print("Connected to GCM")
            // ...
        }
    })
}

public func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
    print("Notification received: \(userInfo)")
    GCMService.sharedInstance().appDidReceiveMessage(userInfo)
}

public func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
    print("Error registering")
}

public func application( application: UIApplication,
    didReceiveRemoteNotification userInfo: [NSObject : AnyObject],
    fetchCompletionHandler handler: (UIBackgroundFetchResult) -> Void) {

        print("Notification received(background): \(userInfo)")

        NotificationManager.sharedInsteance().parseNotification(userInfo)

        // This works only if the app started the GCM service
        GCMService.sharedInstance().appDidReceiveMessage(userInfo);

        // Handle the received message
        // Invoke the completion handler passing the appropriate UIBackgroundFetchResult value
        // [START_EXCLUDE]
        handler(UIBackgroundFetchResult.NewData);
        // [END_EXCLUDE]
}

ОБНОВИТЬ

Хорошо, так что я думаю, что перепутал местоположение .plist (по какой-то причине его не было в корне). Я перешел в корень и теперь получаю это предупреждение / ошибку при запуске GCM:

UPD. Ладно, это на самом деле произошло только один раз и остановилось. Так что я не думаю, что проблема здесь.

После того, как я переместил .plist в корневой каталог, вызовы onTokenRefresh () прекратились, но я все еще получаю NotRegistered.

Ответы на вопрос(1)

Ваш ответ на вопрос