- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
由于 GCM 不断更新,我搜索过的大部分资源似乎都已过时或不清楚。基本上,我对 token 和 ID 何时到期感到困惑。 (作为引用,我正在使用 Android。)
据我了解(如果我错了,请纠正我),我的服务器有一个 API key 和一个发件人 ID。使用发件人 ID,我可以让我的客户通过本地存储在我的客户端上的 InstanceID 请求 token 。我已经有点困惑了。 InstanceID 是在我的应用上线时分配的?它会改变吗?当应用程序升级或卸载并重新安装(或设备恢复)时怎么办?通过调用 InstanceID.getInstance,我将始终检索相同的 InstanceID,还是它最终会过期并给我一个新的?通过调用 getID() 存储您检索的字符串是否有任何值(value)?文档似乎表明您在调用 getID() 时实际上检索了一个新的 InstanceID,因此这使事情变得更加复杂。 (仅供引用,我指的是:https://developers.google.com/instance-id/)
使用 InstanceID,我的客户端可以从 GCM 服务器请求 token ,然后将其发送到我的应用服务器。我的应用服务器存储了这个 Token,并可以使用它向 GCM 服务器发送消息,然后 GCM 服务器将消息发送到设备。我相信,设备使用存储的 InstanceID 来实际接收这些消息。那么拥有一个扩展 GcmListenerService 的类将允许我使用 onMessageReceived 接收这些消息吗?我不需要做任何特别的事情(除了在 AndroidManifest 中定义它)?我不必实际告诉它使用 InstanceID?它只是神奇地知道?
这些 ID 和 token 什么时候到期?它们会过期吗?我将 token 作为字符串存储在服务器上,但如果其中任何一个过期,我怎么知道它们已经过期?我总是可以生成一个新的 InstanceID 和 Token,这看起来很容易,但是旧的是否保持 Activity 状态?如何从服务器上删除旧 token ?似乎有一种简单的方法可以在 iOS 端使用 APNS 执行此操作,您可以在其中检索所有过期 token 的列表,然后将它们从数据库中删除。
最佳答案
当我更新我的 GCM 实现时,我发现自己问了大部分这些问题。在搞砸了几天之后,这是我对您的问题的看法。
From what I understand (and please correct me if I'm wrong), my server has an API Key and a Sender ID. Using the Sender ID I can have my client request a Token via the InstanceID stored locally on my client.
这是正确的。
The InstanceID is assigned the moment my app goes online?
它似乎是在您的应用启动后立即分配的,即使设备无法访问互联网。
Does it ever change? What about when the app upgrades or is uninstalled and reinstalled (or the device is restored)? By calling InstanceID.getInstance will I always retrieve the same InstanceID, or will it eventually expire and give me a new one?
Instance ID is stable but may become invalid, if:
- App deletes Instance ID
- Device is factory reset
- User uninstalls the app
- User clears app data
If Instance ID has become invalid, the app can call getId() to request a new Instance ID.
我已经测试了卸载应用并清除数据,结果表明以上所有内容都是正确的。
Is there any value to storing the string you retrieve by calling getID()?
看起来 API 会为您将其存储在应用的本地存储中。
Using the InstanceID, my client can request a Token from the GCM servers, which it then sends to my app server. My app server stores this Token, and can use this to send messages to the GCM servers, which will then send the message to the device. The device uses the stored InstanceID to actually receive these messages, I believe. So having a class that extends GcmListenerService will allow me to receive these messages with onMessageReceived? I don't have to do anything special (other than defining it in the AndroidManifest)? I don't have to actually tell it to use the InstanceID? It just magically knows?
据我所知,在之前的实现中没有任何类型的 InstanceId,而且它看起来也没有在这个实现中明确使用。如果是,它会在 GcmReceiver 中被调用。或 GcmListenerService .
When do these ID's and Tokens expire? Do they expire?
我已经解决了 ID 的过期问题,我们可以在 Android InstanceID implementation guide 中找到有关 token 过期的信息。 :
The Instance ID service initiates callbacks periodically (for example, every 6 months), requesting that your app refreshes its tokens. It may also initiate callbacks when:
- There are security issues; for example, SSL or platform issues.
- Device information is no longer valid; for example, backup and restore.
- The Instance ID service is otherwise affected.
指南说子类InstanceIDListenerService并覆盖 onTokenRefresh()
来处理这些场景。
I store the Token as a string on the server, but if at any point one of these expires, how do I know they have expired?
guide for implementing GCM on your server表示 GCM 服务器将向您的服务器响应一些有关您用于尝试发送推送通知的 token 的信息。
I can always generate a new InstanceID and Token, that much seems easy, but then do the old ones stay active?
我的测试表明是的,确实如此。
How do I wipe the old tokens from the server? There seems to be an easy way to do this with APNS on the iOS side of things, where you can retrieve a list of all the expired tokens and just wipe them from your database.
我仍在研究这个问题,如果我能解决问题,我会更新。
关于android - GCM token 什么时候到期,InstanceID 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31061354/
我最近在/ drawable中添加了一些.gifs,以便可以将它们与按钮一起使用。这个工作正常(没有错误)。现在,当我重建/运行我的应用程序时,出现以下错误: Error: Gradle: Execu
Android 中有返回内部存储数据路径的方法吗? 我有 2 部 Android 智能手机(Samsung s2 和 s7 edge),我在其中安装了一个应用程序。我想使用位于这条路径中的 sqlit
这个问题在这里已经有了答案: What's the difference between "?android:" and "@android:" in an android layout xml f
我只想知道 android 开发手机、android 普通手机和 android root 手机之间的实际区别。 我们不能从实体店或除 android marketplace 以外的其他地方购买开发手
自Gradle更新以来,我正在努力使这个项目达到标准。这是一个团队项目,它使用的是android-apt插件。我已经进行了必要的语法更改(编译->实现和apt->注释处理器),但是编译器仍在告诉我存在
我是android和kotlin的新手,所以请原谅要解决的一个非常简单的问题! 我已经使用导航体系结构组件创建了一个基本应用程序,使用了底部的导航栏和三个导航选项。每个导航选项都指向一个专用片段,该片
我目前正在使用 Facebook official SDK for Android . 我现在正在使用高级示例应用程序,但我不知道如何让它获取应用程序墙/流/状态而不是登录的用户。 这可能吗?在那种情
我在下载文件时遇到问题, 我可以在模拟器中下载文件,但无法在手机上使用。我已经定义了上网和写入 SD 卡的权限。 我在服务器上有一个 doc 文件,如果用户单击下载。它下载文件。这在模拟器中工作正常但
这个问题在这里已经有了答案: What is the difference between gravity and layout_gravity in Android? (22 个答案) 关闭 9
任何人都可以告诉我什么是 android 缓存和应用程序缓存,因为当我们谈论缓存清理应用程序时,它的作用是,缓存清理概念是清理应用程序缓存还是像内存管理一样主存储、RAM、缓存是不同的并且据我所知,缓
假设应用程序 Foo 和 Eggs 在同一台 Android 设备上。任一应用程序都可以获取设备上所有应用程序的列表。一个应用程序是否有可能知道另一个应用程序是否已经运行以及运行了多长时间? 最佳答案
我有点困惑,我只看到了从 android 到 pc 或者从 android 到 pc 的例子。我需要制作一个从两部手机 (android) 连接的 android 应用程序进行视频聊天。我在想,我知道
用于使用 Android 以编程方式锁定屏幕。我从 Stackoverflow 之前关于此的问题中得到了一些好主意,并且我做得很好,但是当我运行该代码时,没有异常和错误。而且,屏幕没有锁定。请在这段代
文档说: android:layout_alignParentStart If true, makes the start edge of this view match the start edge
我不知道这两个属性和高度之间的区别。 以一个TextView为例,如果我将它的layout_width设置为wrap_content,并将它的width设置为50 dip,会发生什么情况? 最佳答案
这两个属性有什么关系?如果我有 android:noHistory="true",那么有 android:finishOnTaskLaunch="true" 有什么意义吗? 最佳答案 假设您的应用中有
我是新手,正在尝试理解以下 XML 代码: 查看 developer.android.com 上的文档,它说“starStyle”是 R.attr 中的常量, public static final
在下面的代码中,为什么当我设置时单选按钮的外观会发生变化 android:layout_width="fill_parent" 和 android:width="fill_parent" 我说的是
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
假设我有一个函数 fun myFunction(name:String, email:String){},当我调用这个函数时 myFunction('Ali', 'ali@test.com ') 如何
我是一名优秀的程序员,十分优秀!