首页
学习
活动
专区
圈层
工具
发布

GCM问题
EN

Stack Overflow用户
提问于 2015-10-23 06:59:31
回答 1查看 3K关注 0票数 6

我已经用了很长时间的GCM了。有一天它突然破了。问题是,我发送的第一个推送返回成功状态,但应用程序没有收到任何推送。我发送的第二个推送由于NotRegistered错误而失败。我重新安装了应用程序:成功(没有收到通知),失败(NotRegistered) ->循环。我不知道什么改变了。谷歌的支持是非常无助的,并花费大量时间回答简单的问题,无论是GCM问题,APN问题还是客户端问题。如果以前有这样的问题,请告诉我要找什么。这就是它的样子:

我怀疑这是在更新到iOS 9之后发生的,但我不确定。如果新的iOS中有一些东西可能会阻塞GCM,我会很感激有人指出的。

更新:

GCM push fails with NotRegistered

那家伙也有类似的问题。问题是一些清单文件。在Info.plist中,我需要为iOS 9添加一些条目来允许iOS 9吗?

更新:

每当应用程序发布时,onTokenRefresh都会被调用。不过,我要拿回同样的钱。因此,我怀疑GCM服务器上的令牌存在问题。

APPDELEGATE:GCM委托代码:

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-25 18:18:50

所以我解决了这个问题。我似乎没有使用正确的iOS开发配置文件。我使用的是一个通用的,而我需要使用一个特定的包名。之所以发生这种情况,是因为我在大约一周前重新安装了我的操作系统,因此另一个证书被删除了,直到我下载并手动添加到Xcode之后才起作用。我还需要从设备中删除团队配置文件。完全不是GCM或APN的错。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33296515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档