Ole*_*rov 6 objective-c push-notification ios google-cloud-messaging swift
我已经使用GCM很长一段时间了.有一天它突然破了.问题是我发送的第一个推送我获得了成功状态,但应用程序没有得到任何推送.我发送的第二个推送因NotRegistered错误而失败.我重新安装了应用程序:成功(未收到通知),失败(未注册) - >循环.我不知道发生了什么变化.谷歌的支持非常无益,并且花了很多时间回答简单的问题,无论是GCM问题,APN问题还是客户端问题.如果有人以前有这样的问题,请告诉我要找什么.这就是它的样子:
我怀疑它是在更新到iOS 9后发生的.我不确定.如果新iOS中有可能阻止GCM的事情,我会很感激,如果有人指出的话.
更新:
那家伙有类似的问题.问题出在一些清单文件中.Info.plist中是否有一些我需要为iOS 9添加以允许GCM的条目?
更新:
每次应用程序启动时都会调用onTokenRefresh.不过,我得到的回报相同.因此,我怀疑GCM服务器上的令牌存在问题.
GCM DELEGATE CODE in 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]
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
好的,所以我相信我搞砸了.plist位置(由于某种原因,它不在根目录中).我移动到root,现在我在启动GCM时收到此警告/错误:
UPD.好吧,它实际上只发生过一次而且停了下来.所以我认为问题不在这里.
我将.plist移动到根目录onTokenRefresh()之后调用已停止,但我仍然收到NotRegistered.
所以我解决了这个问题.看来我没有使用正确的iOS开发配置文件.我使用的是通用的,而我需要使用特定的一个作为我的包名.之所以发生这种情况,是因为我在一周前左右重新安装了我的操作系统,因此在我下载并手动将其添加到Xcode之前,其他证书已被删除并且无效.我还需要从设备中删除团队配置文件.完全不是GCM或APN的错误.
| 归档时间: |
|
| 查看次数: |
2672 次 |
| 最近记录: |