谷歌Android如何从云端推送消息到手机

谷歌Android如何从云端推送消息到手机,第1张

前不久 Chrome to Phone 已经正式发布,可以让 Android 用户在自家的 PC 和 手机上亲自使用该功能。而 Chrome to Phone 的作者 也发表了一篇技术文章,介绍了C2DM 服务的一些细节。Dave Burke翻译正文:Android Cloud to Device Messaging (C2DM) 作为 Android 22 的一部分已经发布了。C2DM 允许第三方开发者开发相关的应用来推送少量数据消息到用户的手机上。C2DM 创造了一个良好的机会,允许我们使用多种 Google 开发工具来创建一种简单但相当实用的应用类型。用户可以使用该类型的应用把各种各样的信息从他们的台机或者笔电直接 push 到自家的手机上。来自 Google 20% 工作时间的一个实验性项目 Chrome to Phone 演示了这种类型的应用。Chrome to Phone 包括了一个 Chrome Extension,一个 Android Application,和一个 Google AppEngine 服务器。所有的代码都是开源的,可供其它开发者参考如何使用 C2DM。Chrome to Phone 的消息流是一个很典型的推送服务:用户使用 Android App 在 C2DM 服务器上注册,获得一个设备注册 ID,这个 ID 跟用户的 Google 帐号绑定在一起,并且由 AppEngine server 来维护。 AppEngine server 在验证用户账号的合法性后记录下用户账号跟用户 C2DM 设备注册 ID 之间的映射关系。Chrome Extension 获得浏览器当前访问的网址和标题后,把它们发送到 AppEngine server。 AppEngine server 验证当前登录的 Google 用户账号后,通过该账号查找到对应的 C2DM 设备注册 ID。然后通过 >This problem can be said is unprecedented No latecomers, answer the Chinese civilization for five thousand years, every year have a explain yourself, then later overturned, re established, so repeatedly complex for thousands of years, you are so lucky, today, I can tell you a standard answers, at least 5000 years won't be overthrown, that card is the kingly way

在安卓系统上做推送的方法如下:
1通过SMS进行服务器端和客户端的交流通信。在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图,可以实现完全的实时 *** 作
2循环主动定时获取:这种方法需要客户端来做一个定时或者周期性的访问服务器端接口,以获得最新的消息。
3持久连接:这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。需要开一个服务来保持和服务器端的持久连接(苹果就和谷歌的C2DM是这种机制)。
推送消息应该找一家安全,稳定的平台。例如极光。极光稳定的自有数据与多源外部数据交叉验证与补充,确保数据指标的趋势准确与稳定。70+中国投资机构、100+海外投资机构以及200+中国知名互联网公司正在使用极光iAPP的付费数据服务辅助其投资和战略决策。

你的iPhone收到推送信息后到底会发生什么呢?总共有三种可能性:
app在前台运行 接收到推送信息时屏幕上不会有任何显示,也不会有提示音,但你的app delegate会收到这个推送信息。你可以在这里加入代码来处理接收到的信息。
app不在前台运行。iPhone可能停留在主界面或者另一个app正在运行一个提示窗口会d出,可能伴随着提示音。用户可以点击Close按钮来关闭这个窗口或者点击View按钮来打开你的app。如果用户点击的时Close按钮,那你的app不会处理这个推送的信息。
iPhone在锁屏状态下 同样一个提示窗口d出,并伴随着提示音,但是这个窗口不会有Close和View按钮。屏幕解锁后会自动进入你的app。
因为app delegate是接收推送信息的地方,我们对app的最后改动都是在AppDelegatem文件中。我们需要修改两处:
application:didFinishLaunchingWithOptions:函数 如果推送信息到达时你的app不在前台运行,而用户在d出窗口点击了“View”按钮,你的app会重新运行然后这个信息会作为参数注入到application:didFinishLaunchingWithOptions:函数中。
application:didReceiveRemoteNotification:函数 如果信息到达时你的app正在前台运行,那这个函数就会被调用。在iOS40或更新的版本,如果你的app从暂停状态进入前台,这个函数也会被调用。你可以用UIApplication的applicationState属性来检查你的app是否是从暂停状态苏醒。
上述的两个函数都会有一个字典参数其中包含了JSON格式的推送信息内容。OS已经帮我们把JSON格式的信息转换成Objective-C字典了。将下面的代码加到didFinishLaunchingWithOptions:函数的return语句前: if (launchOptions != nil)
{
NSDictionary dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (dictionary != nil)
{
NSLog(@"Launched from push notification: %@", dictionary);
[self addMessageFromRemoteNotification:dictionary updateUI:NO];
}
}
我们先确保launchOptions参数不是nil以及launchOptions中包含了推送信息。然后调用addMessageFromRemoteNotification函数来处理这个信息。
把下面的函数加到AppDelegatem文件中:- (void)application:(UIApplication)application didReceiveRemoteNotification:(NSDictionary)userInfo
{
NSLog(@"Received notification: %@", userInfo);
[self addMessageFromRemoteNotification:userInfo updateUI:YES];
}
这个函数同样依靠addMessageFromRemoteNotification来完成处理信息的工作。
将下面这个函数复制粘贴到didFinishLaunchingWithOptions:函数上面:- (void)addMessageFromRemoteNotification:(NSDictionary)userInfo updateUI:(BOOL)updateUI
{
Message message = [[Message alloc] init];
messagedate = [NSDate date];
NSString alertValue = [[userInfo valueForKey:@"aps"] valueForKey:@"alert"];
NSMutableArray parts = [NSMutableArray arrayWithArray:[alertValue componentsSeparatedByString:@": "]];
messagesenderName = [parts objectAtIndex:0];
[parts removeObjectAtIndex:0];
messagetext = [parts componentsJoinedByString:@": "];
int index = [dataModel addMessage:message];
if (updateUI)
[selfchatViewController didSaveMessage:message atIndex:index];
[message release];
}
我保证这是最后一点代码了。然我们解释一下这段代码。Message message = [[Message alloc] init];
messagedate = [NSDate date];
首先我们创建一个Message对象。我们会把推送信息的内容提取出来,填入到这个对象中然后将这个对象加入到DataModel中。NSString alertValue = [[userInfo valueForKey:@"aps"] valueForKey:@"alert"];
上面的代码从推送信息中获取了信息的内容。推送信息的JSON的格式看起来是这样的:{
"aps":
{
"alert": "SENDER_NAME: MESSAGE_TEXT",
"sound": "default"
},
}
服务器把信息内容以及信息作者的昵称放到了“alert”栏中。我们对这个字典中的其他内容并不感兴趣。NSMutableArray parts = [NSMutableArray arrayWithArray:[alertValue componentsSeparatedByString:@": "]];
messagesenderName = [parts objectAtIndex:0];
[parts removeObjectAtIndex:0];
messagetext = [parts componentsJoinedByString:@": "];
上面的代码将发送者的昵称和信息内容分解出来放入到Message对象中。发送者昵称是分号和空格之前的字符串。int index = [dataModel addMessage:message];
现在我们可以把这个Message对象加入到DataModel中了。if (updateUI)
[selfchatViewController didSaveMessage:message atIndex:index];
最后,我们让ChatViewController加入这个新的信息。但是,如果推送信息是在didFinishLaunchingWithOptions函数中收到的,那我们就不能刷新这个视图,因为那时ChatViewController的表格还没有加载。视图加入这个信息会导致系统崩溃的。
就这些了。编译并运行现有的程序。用test_messagehtml中的表格来发送一些信息。你应该在app的聊天视图中看到这些信息气泡出现。自定义提示信息
你应该还记得我们之前在介绍推送信息时曾说过你可以自定义提示设置。比如你可以在有信息时播放一个自定义的提示音。我在app的resources文件夹中放了一个音频文件叫做beepcaf。
打开apiphp文件并在makePayload()函数中将下面这行代码:$payload = '{"aps":{"alert":"' $nameJson ': ' $textJson '","sound":"default"}}';
改为:$payload = '{"aps":{"alert":"' $nameJson ': ' $textJson '","sound":"beepcaf"}}';
你不需要改变app本身的任何代码,甚至不用重新编译。但你还是应该在设备上关闭打开了的app。因为如果我们的app正在前台运行,那提示音是不会响的。现在用test_messagehtml给app发一个信息。当提示窗口出现时,提示音是不是不同了?
你也可以实验修改其他的选项。比如提供自定义按钮,或者给app设定数量小图标。(如果你想实验数量小图标,别忘了让app注册接收数量图标。现在我们的app只会有提示音和提示窗口。)
x


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/13254655.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-27
下一篇 2023-06-27

发表评论

登录后才能评论

评论列表(0条)

保存