我开始使用FCM For Android写下一个简单的推送通知应用程序.但我在我的Android工作室日志中收到了这条消息.
signInWithCustomToken com.google.firebase.FirebaseException:发生内部错误.[伊朗不提供此服务.如果您认为原始国家/地区被错误识别,请通过https://support.google.com/websearch/contact/ip进行报告.]
当我使用VPN更改我的IP时,我的Android(客户端)应用程序正常工作[成功注册和登录和接收通知].
我的问题:除了强迫客户使用VPN之外,有没有办法在我的项目中使用FCM?如果没有为FCM提供免费和付费的其他替代方案,那么你可以为跨平台推送通知提供服务吗?[很明显,使用FCM/GCM服务作为第三方的公司,如Batch.com,Backendless,Pushwoosh不会做任何帮助]
免费,我的意思是少量用户(约1000 MAU)
编辑:正如AntoineGuénard所说,批量我的应用程序注册并获得令牌和认证没有任何问题,但只通过VPN接收测试通知.
android push-notification android-c2dm firebase google-cloud-messaging
我在Android云到设备消息传递框架的解释中读到了.我们的应用程序成功注册到C2DM服务器后,我们收到一个注册ID.注册ID会持续到应用程序明确取消注册,或者直到Google刷新应用程序的注册ID.什么时候谷歌刷新你的应用程序的注册ID?我们如何知道它,以便我们再次注册并将新的注册ID发送到我们的服务器.
谢谢.
我刚刚将C2DM功能添加到我的Android应用程序中.
如果在我的应用程序中启动C2DM,则会发生以下情况.
从intent中检索设备令牌并将其发送到我的服务器
从那一刻起,一切都很好.客户端收到推送通知等.如果以下情况发生,则会出现问题:
用户在不禁用推送的情况下卸载应用程序.(完全删除它不仅更新)
如果在步骤5之后发送推送通知,我的应用仍会收到此通知.似乎从先前安装中检索到的令牌仍处于活动状态,并重新连接到我的应用程序的新实例.
这导致了以下问题:
这是C2DM系统中的错误还是我的设置有问题?
更新
我遵循了Berdons的建议并做了以下事情:
出于测试目的,每次我的应用程序启动时,只启动取消注册Intent.发送取消注册后,我的服务器的推送通知不会发送到我的应用程序.这似乎可以解决问题,但如果我现在进入C2DM设置屏幕并打开我的应用程序的推送通知,所有旧令牌再次激活,我会收到我在我的应用程序的当前安装中未注册的信息.
下一次更新
看来我不是唯一有这个问题的人:
我希望谷歌能够管理这些令牌,使得同一设备的旧令牌在发布新令牌后被禁用.我还希望在我向该应用程序发送取消注册Intent所有令牌后,该设备被标记为无效或从Google服务器中永久删除.如果这是某种形式的谷歌设计决定的特殊用例我不明白请赐教.
我在我的Android应用程序中实现了推送通知,并且我正在尝试构建服务器端以使其更具可伸缩性.查看有关如何构造POST以发送推送的文档,似乎我需要为每个用户发送一个POST.因此,如果我有1000个用户,即使推送有效负载相同,我也需要发送1000个POST.
由于我要将此信息发送给Google并且他们正在处理它,我认为希望我可以发送一个POST并让Google解析客户端令牌并发送每个令牌的推送是不合理的.我没有看到在单个POST中包含多个令牌的方法.如果我错了,请纠正我,但我需要继续我今天所做的事情,为每个用户发送推送......对吗?
提前致谢.
我在eclipse中在Android + Google App Engine中创建了一个微笑应用程序.我正在尝试在Google App Engine上部署该应用,但它会显示错误消息
Log Cat:
无法更新:com.google.appengine.tools.admin.HttpIoException:错误发布到网址:https://appengine.google.com/api/appversion/getresourcelimits?app_id = AppEngineTest2&version = 1& 400错误请求
客户端错误(400)由于未指定的原因,请求无效.
at com.google.appengine.tools.admin.AbstractServerConnection.send1(AbstractServerConnection.java:282)
at com.google.appengine.tools.admin.AbstractServerConnection.send(AbstractServerConnection.java:235)
at com.google.appengine.tools.admin.AbstractServerConnection.post(AbstractServerConnection.java:214)
at com.google.appengine.tools.admin.ResourceLimits.remoteRequest(ResourceLimits.java:160)
at com.google.appengine.tools.admin.ResourceLimits.request(ResourceLimits.java:127)
at com.google.appengine.tools.admin.AppAdminImpl.doUpdate(AppAdminImpl.java:323)
at com.google.appengine.tools.admin.AppAdminImpl.update(AppAdminImpl.java:52)
at com.google.appengine.eclipse.core.proxy.AppEngineBridgeImpl.deploy(AppEngineBridgeImpl.java:400)
at com.google.appengine.eclipse.core.deploy.DeployProjectJob.runInWorkspace(DeployProjectJob.java:148)
at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:38)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
Run Code Online (Sandbox Code Playgroud)
任何人都有Android + Google App Engine(c2dm)的简单示例(含源代码)请分享..
我正在尝试从C2DM迁移到GCM,它大部分工作正常.C2DM用于通过在用户卸载应用程序时发送NotRegistered错误来很好地处理应用程序的卸载.据说GCM也会这样做(尽管不能保证).但是,它似乎没有起作用.在向已卸载应用程序的手机发送多个GCM通知后,它仍然会以正常的"id = ..."响应继续响应.
还有其他人遇到过这个问题吗?如果是这样,你是如何解决的?
我正在尝试发布APK,而我正在尝试生成签名APK我得到此错误
Error:Error: Permission name C2D_MESSAGE is not unique (appears in both com.company.myApp.permission.C2D_MESSAGE and com.company.myApp2.permission.C2D_MESSAGE) [UniquePermission]
Run Code Online (Sandbox Code Playgroud)
这是我的清单文件:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.company.myApp">
<permission
android:name="com.company.myApp.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<supports-screens android:smallScreens="true" />
<supports-screens android:normalScreens="true" />
<supports-screens android:largeScreens="true" />
<supports-screens android:xlargeScreens="true" />
<supports-screens android:anyDensity="true" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SECURE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--<uses-permission android:name="android.permission.INTERNET" />-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.GET_TASKS" …Run Code Online (Sandbox Code Playgroud) 我正在尝试测试C2DM框架.我几天前收到了确认电子邮件,然后尝试创建一个可以注册的客户端.为此,我按照本教程中描述的步骤创建了一个简单的客户端:http://code.google.com/intl/es-419/android/c2dm/index.html.
Android清单文件包含以下代码:
<permission android:name="com.bilthon.ufrj.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.bilthon.ufrj.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.INTERNET"/>
<receiver android:name=".C2DMReceiver" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.bilthon.ufrj" />
</intent-filter>
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.bilthon.ufrj" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
然后,程序启动时启动的主要活动具有以下代码:
Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate
registrationIntent.putExtra("sender","mytestemail@gmail.com");
Log.d("WelcomeScreen","mytestemail@gmail.com");
startService(registrationIntent);
Run Code Online (Sandbox Code Playgroud)
我还在运行我的客户端的AVD上注册了一个谷歌帐户,因为他们说这是必需的.但问题是我不能让广播接收器"醒来".我不知道会出现什么问题.通过分析日志,我可以看到注册意图已经创建并且显然正确使用,但是接收器代码从未被执行过,可能出错了什么?
在此先感谢尼尔森
我正在尝试做的是在收到c2dm消息时,启动一个服务,询问位置"x"的时间,然后将该位置移交给我们的服务器.c2dm消息正确启动服务,GPS位置打开,但它永远不会更新.它只是坐在那里我指定的时间长度(当前为12秒)并没有做任何事情.我在我的应用程序中使用完全相同的代码(不是作为服务)并且它完美地工作.我究竟做错了什么?
这会在收到c2dm消息时启动服务.
context.startService(new Intent(context, ServicePingLocation.class));
Run Code Online (Sandbox Code Playgroud)
这是服务本身的代码.所有被称为"onCreate"和"onStart"的东西.
public class ServicePingLocation extends Service implements LocationListener {
private final String DEBUG_TAG = "[GPS Ping]";
private boolean xmlSuccessful = false;
private boolean locationTimeExpired = false;
private LocationManager lm;
private double latitude;
private double longitude;
private double accuracy;
@Override
public void onLocationChanged(Location location) {
Log.d(DEBUG_TAG, "onLocationChanged");
latitude = location.getLatitude();
longitude = location.getLongitude();
accuracy = location.getAccuracy();
}
@Override
public void onProviderDisabled(String provider) {
Log.d(DEBUG_TAG, "onProviderDisabled");
Toast.makeText(
getApplicationContext(),
"Attempted to ping your location, and GPS was disabled.", …Run Code Online (Sandbox Code Playgroud) 我正在使用C2DM,我的BroadcastReceivers将C2DM事件传播到本地服务.该服务通过将id发送到我的webserver来完成注册,它负责让设备知道新消息,但是如果应用程序(其中一个活动)已启动,我们希望用新数据向该活动发送意图,它可以更新,如果不是NotificationManager用于通知用户.
问题是,如何知道活动正在运行?Application对象不是一个选项,因为Service是应用程序的一部分,它显然会出现.在每个应用程序的onDesroy中取消注册也不是一个选项,因为它可能会在方向更改中发生...
完成任何标准方法吗?