Windows phone应用开发[17]-xap提交异常处理
在windows phone 应用提交操作上早在2011年时就写过一篇Windows phone 应用开发[4]-应用发布,那时wp应用提交官方市场的流程繁杂[超过了5步].因为上传和填写应用信息页面采用silverlight技术做的.加载速度有些慢再加上操作用户体验不好.导致很多开发者都在提交过程非常痛苦.在wp 7.8 更新发布后. ms官方也逐渐为了使提交应用更简单.在应用提交流程上做了很大的简化.其中最关键当属完全去掉silverlight页面.只在上传xap包时保留了. 流程精简为两步[应用信息和xap包提交]. 另外还增加每个步骤单独保存操作.这样即使因为中间网络或是其他原因失败.也可以保存应用信息 无需重复输入.
而最近从朋友那拿到一个windows phone 开发者账号.所以做了一个简单的测试语音的应用.在提交时碰到从未碰到的异常.注明现在新版应用提交过程会验证xap应用信息. 如果存在验证异常则无法提交应用 异常信息超过45条如下:
2011: The background agent can’t use Microsoft.Phone.Shell.ShellTile::Create, which assembly TileAgent.dll is trying to use. Update your file and then try again.
2011: The background agent can’t use Coding4Fun.Toolkit.Controls, which assemblyCoding4Fun.Toolkit.Controls.dll is trying to use. Update your file and then try again.
2011: The background agent can’t use System.Windows.Controls.MediaElement::Stop, which assembly Microsoft.Phone.dll is trying to use. Update your file and then try again.
2011: The background agent can’t use System.Windows.Controls.MediaElement::Play, which assembly Microsoft.Phone.dll is trying to use. Update your file and then try again.
2011: The background agent can’t use System.Windows.Controls.MediaElement::set_Position, which assembly Microsoft.Phone.dll is trying to use. Update your file and then try again.
2011: The background agent can’t use System.Windows.Controls.MediaElement::set_AutoPlay, which assembly Microsoft.Phone.dll is trying to use. Update your file and then try again.
2011: The background agent can’t use System.Windows.Controls.MediaElement, which assembly Microsoft.Phone.dll is trying to use. Update your file and then try again.
2011: The background agent can’t use System.Windows.Controls.MediaElement::SetSource, which assembly Microsoft.Phone.dll is trying to use. Update your file and then try again.
2011: The background agent can’t use System.Windows.Media.VideoBrush, which assembly Microsoft.Phone.dll is trying to use. Update your file and then try again.
2011: The background agent can’t use System.Windows.Controls.MediaElement::.ctor, which assembly Microsoft.Phone.dll is trying to use. Update your file and then try again.
可以看到主要因为后台任务background agent 中调用不收支持的API导致的.在windows phone 后台任务ms官方规定所有可能涉及UI的操作api都是禁止调用的.官方在windows phone后台代理概述中提到后台任务中限制的api列表windows phone 后台代理不支持的api.可见System.Windows.Controls命名空间下MediaElement也是不支持的.而官方对这个错误表示代码2011 可以在了解应用提交错误中找到对应的说明:
2011
后台代理无法使用程序集 [assembly name] 正尝试使用的 [resource]。请更新文件,然后重试。
知道大概原因再来看看具体的实际代码.首先看看解决方案项目结构.:
项目结构说明,VoiceControl使用启动项目.设计UI. Common则用来封装一些通用的操作或第三方可复用的类库.TaskAgent就是后台任务用来定时请求云端语音识别资源然后更新控制播放并更新livetitle. 整个项目结构很简单.项目间引用关系如下:
VoiceControl作为UI项目分别引用了Common类库和后台任务TaskAgent. 而后台任务TaskAgent项目则引用Common类库.既然异常提示说我们后台任务TaskAgent项目使用限制的APi.后来我review分析后台任务中操作的代码.后台代码中根本没有使用任何涉及UI操作的api.后台任务其实就是做了两件事:
A:请求云端语音识别数据并更新Lock Screen识别出来的内容.
B:更新首屏live titles磁铁
在来看看TaskAgent引用:
引用第三方分别Json.net序列化操作的. RestSharp则用来封装windows phone 所有后台数据请求. 都没有涉及任何UI操作.所以这两个第三方引用库被排除.问题唯一可能出在及时Common类库中.在来看看Common类库的引用关系:
在Common中采用第三方类库Coding4Fun中ToastPrompt控件实现类似Toast顶部通知提示效果.而这部分是涉及UI的操作的.放在Common类库中目的是为了保证这部分代码随着项目迁移可以复用.但我的后台任务并没有调用该代码.却很奇怪的提示Coding4Fun.Tookit.Control尝试去使用.这是为何?
见过一番测试发现.当在Common类库中除掉Coding4Fun.Tookit.Control应用所有关于后台引用异常提示都消失了.好吧换一种说法就明白了:
当Common类库中引用涉及UI操作的第三方库Coding4Fun.Toolkit.Controls.同时后台任务引用Common类库.即使后台TaskAgent没有调用Common涉及UI操作的代码.只要TaskAgent引用了Common类库.如果Common类库中包含涉及任何可能UI操作封装的代码或是第三方可能会操作UI的引用关系. 那么TaskAgent就会认为你可能会在后台操作UI.导致提交代码时提示如上异常.这种做法的目的是从引用关系上就直接杜绝使用可能在后台操作UI操作的可能.
知道具体的原因.ok.fix it up.
你突然发现很多Common类库代码已经VoiceControl中被大量引用了.如果要删除Common操作UI的代码.导致很多UI项目VoiceControl引用都需要手工替换.都快要上线了.这样大幅的修改.难免会出现一些不可预测的Bug.好吧对于这样手工活我向来都是抵制的.所以尝试从引用关系上解决这个问题 .
在使用后台项目中.我们在选择封装时.最好的选择是把类库和涉及UI的操作各自独立成一个项目.而至于刚才多出引用替换. 我们可以不修改类和方法的命名.重新建立一个Components项目.把所有涉及UI操作的封装都放到该项目.然后再VoiceControl UI 项目上只需要添加一个引用.而无需修改实际代码. 这样减少可能出现Bug可能.这样一来项目结构和引用关系又发生变化:
这时在提交Xap安装包.所有涉及Coding4Fun和MediaElement异常就全部消失了.唯独剩下一个:
2011: The background agent can’t use Microsoft.Phone.Shell.ShellTile::Create, which assembly TileAgent.dll is trying to use. Update your file and then try again.
well.可见在后台任务TaskAgent创建磁贴的操作也是不允许的.其实同样我的后台任务只是负责更新磁贴而并未创建.原因还是一样我们引用的Common类库中设计磁贴Create操作.从而导致后台任何可能try to use. 官方对于这点说明很明确:
ShellTile 类的 Update(ShellTileData) 方法
ShellTile 类的 Delete()()()() 方法
ShellTile 类的 ActiveTiles 属性
这些方法可以用于修改正在运行的后台代理中的 shell 磁贴。请注意,不能在后台代理中创建[Create方法] shell 磁贴
找到Common类库设计封装live Title的类可见创建Title方法如下:
1: public void CreateFilpLiveTitle(string navigationUrl,string title,string backTitle,string backContent,string wideBackContent,
2: string smallBackgroundImage,string backgroundImage,string wideBackgroundImage, string backBackgroundImage,
3: string wideBackBackgroundImage)
4: {
5: if (!CheckLiveTitleExistByUrl(navigationUrl))
6: {
7: Uri titleUri = new Uri(navigationUrl, UriKind.RelativeOrAbsolute);
8: ShellTileData titleData = CreateFilpTitleData(title, backTitle, backContent, wideBackContent, smallBackgroundImage, backgroundImage,
9: wideBackgroundImage, backBackgroundImage, wideBackBackgroundImage);
10: ShellTile.Create(titleUri, titleData, true);
11: }
12: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
在一开始修改这个异常时,我把这部分代码注释掉后用来测试.发现依然无法通过.xap包在上传过程中会分析代码.同样把这部分代码的操作放到Components项目中进行统一.然后再VoiceControl项目只需添加引用即可而无需修改实际的代码.
在上传Xap安装包发现验证通过.没有提示任何异常.
可见在涉及后台任务的项目中.类库和UI操作可复用封装都需要各自独立成单独的项目. 而问题是所有这些提示后台可能try to use 操作UI的API在实际开发和调试过程都不会有任何提示.所以要保证后台任务引用足够的Clean并可复用.在发包上线时尽量不要手动修改实际代码.可以尝试从引用关系解决关系依赖.代码就不贴了.
Contact me[@chenkaihome]
参考与引用:
windows phone background agent microsoft.phone.dll submission issue
why i got the background agent can’t use scheduledactionService::Add while sumitting my app?
Error 2011 the backgoud agent can’t use microsoft.phone.shell.applicationbarStateChangedEventArgs
Windows phone应用开发[17]-xap提交异常处理的更多相关文章
- Windows phone 应用开发系列教程(更新中)
Windows phone 应用开发[1]-Text To Speech 作为开篇章节.第一篇将在如下介绍一些Windows phone比较有意思的东西-Text To Speech[文 ...
- Windows phone应用开发[22]-再谈下拉刷新
几周之前在博客更新一篇Windows phone应用开发[18]-下拉刷新 博文,有很多人在微博和博客评论中提到了很多问题.其实在实际项目中我基于这篇博文提出解决问题思路优化了这个解决方案.为了能够详 ...
- Windows phone应用开发[19]-RSA数据加密
在这个系列的第十六章节中Windows phone应用开发[16]-数据加密 中曾详细讲解过windows phone 常用的MD5,HMAC_MD5,DES,TripleDES[3DES] 数据加密 ...
- 利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用
Dixon 原文 用ArcGIS Engine.VS .NET和Windows控件开发GIS应用 此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署 ...
- windows phone 8 开发系列(三)程序清单说明与配置
一 清单文件内容介绍 当我们先建了一个项目之后,我们可以看到vs自动会为我们创建了很多文件,正常人都会先一个个去翻看下每个文件都是干啥的,都主要写了些啥,在这些文件中,在Properies目录下面,我 ...
- Windows Phone 8 开发初体验
Windows Phone 8 是当前除了Android.IPhone之外,第3大智能手机运行平台.作为微软技术的忠实fans,一直关注和跟进微软技术的最新进展.这里就给大家简单介绍一下,如何进行Wi ...
- C# Windows Phone App 开发,修改【锁定画面】,从【Assets】、【UI】、【网路图片】,并解决失灵问题。
原文:C# Windows Phone App 开发,修改[锁定画面],从[Assets].[UI].[网路图片],并解决失灵问题. 一般我们在开发Windows Phone App,有时会希望透过应 ...
- C# Windows Phone App 开发,自制LockScreen 锁定画面类别(Class),从【网路图片】、【Assets资源】、【UI】修改锁定画面。
原文:C# Windows Phone App 开发,自制LockScreen 锁定画面类别(Class),从[网路图片].[Assets资源].[UI]修改锁定画面. 一般我们在开发Windows ...
- XNA 4.0 环境搭建和 Hello World,Windows Phone 游戏开发
XNA 4.0 环境搭建和 Hello World,Windows Phone 游戏开发 使用 Scene 类在 XNA 中创建不同的场景(八) 摘要: 平方已经开发了一些 Windows Phone ...
随机推荐
- 本地部署arcgis by eclipse
首次来博客园发帖,从本地部署arcgis api开始吧: 首先还是下载arcgis的api包开始,在中国区官网下载arcgis包: 1.http://support.esrichina.com.cn/ ...
- 纯CSS3魔方的制作
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- VS2012 单元测试之泛型类(Generics Unit Test)
关于单元测试,如果不会用可以参照我的上篇博文————在Visual Studio 2012使用单元测试 首先分享一篇博文,[Visual Studio] 开启Visual Studio 2012通过右 ...
- iOS UIActivityIndicatorView
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle ...
- Android触摸事件流程剖析
Android中的触摸事件流程就是指MotionEvent如何传递,主要包括两个阶段: onInterceptTouchEvent触摸事件拦截方法传递,从外到里传递 onTouchEvent触摸事件处 ...
- JAVA实现图片裁剪
/** * 裁剪图片 * @param src 源图片 * @param dest 裁剪后的图片 * @param x 裁剪范围的X坐标 * @param y 裁剪范围的Y坐标 * @param w ...
- 归档—监控ORACLE数据库告警日志
ORACLE的告警日志里面包含许多有用的信息,尤其是一些ORACLE的ORA错误信息,所以有必要及时归档.监控数据库告警日志的ORA错误,及时提醒数据库管理员DBA处理这些错误信息,那么我们首先来看看 ...
- 小心SQL SERVER 2014新特性——基数评估引起一些性能问题
在前阵子写的一篇博文"SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享"里介绍了数据库从SQL SERVER 2005升级到 SQL SERVER ...
- MySQL InnoDB表--BTree基本数据结构
MySQL InnoDB表是索引组织表这一点应该是每一个学习MySQL的人都会首先学到的知识,这代表这表中的数据是按照主键顺序存储,也就是说BTree的叶子节点存储了所有该行的数据. 我最开始是搞Or ...
- 看 nova-scheduler 如何选择计算节点 - 每天5分钟玩转 OpenStack(27)
本节重点介绍 nova-scheduler 的调度机制和实现方法:即解决如何选择在哪个计算节点上启动 instance 的问题. 创建 Instance 时,用户会提出资源需求,例如 CPU.内存.磁 ...