在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提交异常处理的更多相关文章

  1. Windows phone 应用开发系列教程(更新中)

    Windows phone 应用开发[1]-Text To Speech        作为开篇章节.第一篇将在如下介绍一些Windows phone比较有意思的东西-Text To Speech[文 ...

  2. Windows phone应用开发[22]-再谈下拉刷新

    几周之前在博客更新一篇Windows phone应用开发[18]-下拉刷新 博文,有很多人在微博和博客评论中提到了很多问题.其实在实际项目中我基于这篇博文提出解决问题思路优化了这个解决方案.为了能够详 ...

  3. Windows phone应用开发[19]-RSA数据加密

    在这个系列的第十六章节中Windows phone应用开发[16]-数据加密 中曾详细讲解过windows phone 常用的MD5,HMAC_MD5,DES,TripleDES[3DES] 数据加密 ...

  4. 利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用

    Dixon 原文  用ArcGIS Engine.VS .NET和Windows控件开发GIS应用     此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署 ...

  5. windows phone 8 开发系列(三)程序清单说明与配置

    一 清单文件内容介绍 当我们先建了一个项目之后,我们可以看到vs自动会为我们创建了很多文件,正常人都会先一个个去翻看下每个文件都是干啥的,都主要写了些啥,在这些文件中,在Properies目录下面,我 ...

  6. Windows Phone 8 开发初体验

    Windows Phone 8 是当前除了Android.IPhone之外,第3大智能手机运行平台.作为微软技术的忠实fans,一直关注和跟进微软技术的最新进展.这里就给大家简单介绍一下,如何进行Wi ...

  7. C# Windows Phone App 开发,修改【锁定画面】,从【Assets】、【UI】、【网路图片】,并解决失灵问题。

    原文:C# Windows Phone App 开发,修改[锁定画面],从[Assets].[UI].[网路图片],并解决失灵问题. 一般我们在开发Windows Phone App,有时会希望透过应 ...

  8. C# Windows Phone App 开发,自制LockScreen 锁定画面类别(Class),从【网路图片】、【Assets资源】、【UI】修改锁定画面。

    原文:C# Windows Phone App 开发,自制LockScreen 锁定画面类别(Class),从[网路图片].[Assets资源].[UI]修改锁定画面. 一般我们在开发Windows ...

  9. XNA 4.0 环境搭建和 Hello World,Windows Phone 游戏开发

    XNA 4.0 环境搭建和 Hello World,Windows Phone 游戏开发 使用 Scene 类在 XNA 中创建不同的场景(八) 摘要: 平方已经开发了一些 Windows Phone ...

随机推荐

  1. 又到周末了,我们一起来研究【浏览器如何检测是否安装app】吧

    前言 扯淡 这个月比较倒霉,我送了女朋友一台笔记本电脑作为生日礼物,结果15天一过电脑就坏了,悲剧的我还把电脑盒子给扔了!淘宝不给换更不给退 于是被女朋友臭骂了一过星期后,今天本来在公司有任务的,但是 ...

  2. table tr foreach td 换行

    @{ ;} <table style=" class="sy_table"> <tr> @foreach (DataRow dr in (View ...

  3. SharePoint 2013 工作流之Visual Studio开发示例篇

    SharePoint 2013引用了WF4.0 Foundation,支持使用Designer和Visio进行设计,但是功能受限,而Visual Studio可以开发功能更加丰富的工作流,下面我们简单 ...

  4. 2016最新cocoapods安装流程,安装过程中遇到的问题及解决方法

    现在的cocoapods与之前比较.有很多不一样的地方.自己试了一试,终于搞定.现在大概纪录一下. 1.首先查看ruby是否是最新版的. ruby是通过rvm安装的所以需要先安装rvm后查看ruby是 ...

  5. OpenGL中glVertex、显示列表(glCallList)、顶点数组(Vertex array)、VBO及VAO区别

    OpenGL中glVertex.显示列表(glCallList).顶点数组(Vertex array).VBO及VAO区别 1.glVertex 最原始的设置顶点方法,在glBegin和glEnd之间 ...

  6. 多行图片hover加边框兼容IE7+

    问题: 遇到多行多列排列的图片时,hover上去加边框会把下面的图片挤到别处 ============================================================ ...

  7. Erlang 虚拟机内的内存管理(Lukas Larsson演讲听写稿)

    Erlang核心开发者Lukas Larsson在2014年3月份Erlang Factory上的一个演讲详细介绍了Erlang内存体系的原理以及调优案例: http://www.erlang-fac ...

  8. readonly

    readonly 关键字是可以在字段上使用的修饰符.  当字段声明包括 readonly 修饰符时,该声明引入的字段赋值只能作为声明的一部分出现,或者出现在同一类的构造函数中. 示例     在此示例 ...

  9. C#实现在图片上斜着写字

    最近公司要搞微信活动页面,要实现图片上可以写自己名字的功能,于是就查了一下怎么实现,下面贴一下代码备忘,希望大家也能用到: 我是在控制台应用程序里进行试验的. using (Image bitmap ...

  10. Linux SendMail服务启动慢总结

    在 CentOS release 6.6 上启动sendmail服务时发现服务启动过程非常慢,基本上要耗费3分多钟.有点纳闷:什么原因导致sendmail启动这么慢?搜索了这方面的一些资料,结合自己的 ...