在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. bootstrap无限级分类 jq拓展 之前的无限级分类的封装版~

    git地址:https://github.com/zhangjiahao93/jQ.select HTML部分 <!DOCTYPE html> <html> <head ...

  2. iOS适配 旧项目工程在iOS9下不能正常显示

    在iOS开发中,很多时候会用到旧项目,比如版本的升级.使用Demo等等, iOS SDK正在不断的升级,不断的升级给iOS开发带来了新的活力. 然而在iOS SDK新的版本出来之后,旧项目可能会出现新 ...

  3. SharePoint 2013 自定义扩展菜单

    在对SharePoint进行开发或者功能扩展的时候,经常需要对一些默认的菜单进行扩展,以使我们开发的东西更适合SharePoint本身的样式.SharePoint的各种功能菜单,像网站设置.Ribbo ...

  4. 常用API——Math对象型、Number型

    Math.abs(num) : 返回num的绝对值 Math.acos(num) : 返回num的反余弦值 Math.asin(num) : 返回num的反正弦值 Math.atan(num) : 返 ...

  5. 【转载】PHP性能优化干货

    PHP优化对于PHP的优化主要是对php.ini中的相关主要参数进行合理调整和设置,以下我们就来看看php.ini中的一些对性能影响较大的参数应该如何设置. # vi /etc/php.ini (1) ...

  6. 曲演杂坛--当ROW_NUMBER遇到TOP

    值班期间研发同事打来电话,说应用有超时,上服务器上检查发现有SQL大批量地执行,该SQL消耗IO资源较多,导致服务器存在IO瓶颈,细看SQL,发现自己都被整蒙了,不知道这SQL是要干啥,处理完问题赶紧 ...

  7. PostgreSQL-join多表连接查询和子查询

    一.多表连接查询 1.连接方式概览 [inner] join 内连接:表A和表B以元组为单位做一个笛卡尔积,记为表C,然后在C中挑选出满足符合on 语句后边的限制条件的内容. left [outer] ...

  8. spring中的定时调度实现TimerFactoryBean引起的隐患

    手中的一个老项目,其中使用的TimerFactoryBean实现的调度任务.一般都是spring quartz实现,这种的着实少见.正因为少见资料比较少,当初为了确认这个会不会2个调度任务同时并行执行 ...

  9. [django/mysql] 使用distinct在mysql中查询多条不重复记录值的解决办法

    前言:不废话.,直接进入正文 正文: 如何使用distinct在mysql中查询多条不重复记录值? 首先,我们必须知道在django中模型执行查询有两种方法: 第一种,使用django给出的api,例 ...

  10. 报表开发之批量导入导出excel

    在日常使用报表过程中,会有这样一种情况,你将Excel表分发给各个员工,员工填完后,统一整理成多个Excel,你需要将这些数据,用报表的填报功能,提交录入到数据库中,这样一来可避免到服务器机房录数据的 ...