最近项目中也在做推送的工作,也遇到了一些问题,在解决问题的过程中加深了对微软推送机制的了解。本文不会长篇累牍地介绍Window phone 8 推送的原理,只是摘取我觉得可能比较重要,容易混淆的地方。
1. ChannelUri是怎么产生的?
这里有个比较重要的概念叫推送客户端服务器(push client server), 通过字面意思不容易理解这个东西是干嘛用的,也不知道这是个什么东西。它其实是操作系统的一个服务,对于某一个应用来说,它是全局的。它的主要作用是:当App打开某个通道的时候,该服务会与微软推送服务器协商,产生ChannelUri
2. Windows phone 8 设备上大到底能不能开启超过30个的推送?
答案是,这是Windows phone 7 的旧约,在Windows phone 8 上已经没有这条限制了,MSDN没有相关资料,但是在Build大会的视频上,专门解释了这个数量是“无穷大”,而且我也在920T上测试过,超过30个应用程序开启推送,依然能接收到推送。
但是最近还是遇到了一个问题:920开发者工程机上,在打开通道的时候,会报“Channel is not exits, but could not been opened", 在网上了一下,有的说是Packaging里面的Author和Builder没有填会出现这种情况,或者已经打开了30个推送通道。但是在关闭一些推送之后,依然会出现相同的问题,不知道为什么。
3. 微软推送服务器的推送队列?
微软服务器会为每个设备维护一个推送队列,该队列最多能放30条推送消息,如果超过30条,后面的推送消息将会被丢弃。如果用户处于Temp Disconnected状态(比如断网,关闭了数据连接,锁屏,关机),微软服务器会将推送的消息缓存,如果超过24小时,用户未转为Connected状态(重新联网), 则进入Disconnected状态,30条消息被丢弃,如果未超过24小时,用户转为Connected状态,则发送这些消息到设备。
4. Push Client Server 与 MPNS 是否存在长链接?
IOS是这样的,设备上的某个部件会与MPNS建立长链接,WP我猜测应该也是这样,在某段时间里,MPNS同WP设备上的Push client Server通信,并且获取设备的状态(Connected, Temp Disconnected,Disconnected),用于生成Error Code。
5. 推送效率
不能保证,如果MPNS返回服务器200, 并不能保证该条推送消息已经被设备接收了。如果是412,说明用户现在可能断网了,服务器可能还要隔一段时间再去推一条消息到MPNS。
6. 如果在应用中打开一个通道失败的时候,检查一下你是否改动过channelName,因为一个应用不能有两个通道,最好的做法是:卸载应用,如果卸载应用没用,就卸载之后关机,再开机。
7. 是否可以在代码中将磁贴Pin在桌面?
二级磁贴可以,主磁贴不可以。
8. 如何自定义IconicTile颜色?
在WMAppManifest.xml中修改,如下所示
<TemplateIconic>
<SmallImageURI IsRelative="true" IsResource="false">Assets\Images\Tile\icon72x110.png</SmallImageURI>
<Count>0</Count>
<IconImageURI IsRelative="true" IsResource="false">Assets\Images\Tile\icon160x202.png</IconImageURI>
<Title>Camera360</Title>
<Message>
</Message>
<!--如果带透明度,颜色是主题颜色,并不是湖蓝色,如果要湖蓝色,去掉7f-->
<BackgroundColor>#7f00aba9</BackgroundColor>
<HasLarge>True</HasLarge>
<!--写在同一行-->
<LargeContent1>Test1</LargeContent1>
<LargeContent2>
</LargeContent2>
<LargeContent3>
</LargeContent3>
<DeviceLockImageURI IsRelative="true" IsResource="false">
</DeviceLockImageURI>
</TemplateIconic>
9. 如何在服务器代码中用C#推送IconicTile?
IconicTile似乎用的人比较少,代码不好找:
string tileMessage2 = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<wp:Notification xmlns:wp=\"WPNotification\" Version=\"2.0\">" +
"<wp:Tile Id=\"\" Template=\"IconicTile\">" +
"<wp:SmallIconImage></wp:SmallIconImage>" +
"<wp:IconImage></wp:IconImage>" +
"<wp:WideContent1>" + WideContent1.Text + "</wp:WideContent1>" +
"<wp:WideContent2>" + WideContent2.Text + "</wp:WideContent2>" +
"<wp:WideContent3>" + WideContent3.Text + "</wp:WideContent3>" +
"<wp:Count>" + CountTextBox.Text + "</wp:Count>" +
"<wp:Title>" + TextBoxTitle.Text + "</wp:Title>" +
"<wp:BackgroundColor>" + TextBoxBackgroundColor.Text + "</wp:BackgroundColor>" +
"</wp:Tile> " +
"</wp:Notification>";
东西暂时就这么多,自己写了一个PushService的库,不知道怎么传上来。之后会总结一下怎么使用认证的推送服务,即是用Https进行推送。
好用就点个赞!
9:00 Studio -- Windows Phone 8 平台专家