[开发] 关于Universal App开发二三事

楼主: hoyunxian (WildDagger)   2014-05-31 11:22:47
刚刚看到版上有人在问Universal App,这边就稍微讲一下自己开发的经验。
首先,是关于Universal App的架构,它会分成三个专案:
(专案名).Shared ←这是共用专案
(专案名).Windows ←这是Windows 8.1用的专案
(专案名).WindowsPhone ←这是Windows Phone 8.1用的专案
三者间的关系基本上是:
共用的东西(如程式库、页面与图片)放在Shared专案中
如果页面用到了只有某平台才合适的APP,或者是页面的设计只适合某个平台
又或者是某些图片是专门针对某个平台(例如APP的Logo等图案)
那就把这些档案放在该平台的专案
因此刚开一个Universal APP的时候,
你会看到Shared里面有App.xaml与App.xaml.cs
然后另外两个专案底下各一个
MainPage.xaml、MainPage.xaml.cs、Package.appxmanifest
虽然说是三个专案,但你要是开程式码出来,会发现三个专案用的namespace是一样的。
要测试的时候,只要更改启始专案就可以同时测试Win8.1/WP8.1的专案
(Visual Studio Express for Windows Update 2已经内建WP8.1模拟器,
再加上未来所有WP8手机都可以升级WP8.1的情况下,
真的建议各位可以准备把WP8 SDK移除掉,除非你放不下WP7使用者)
另外要特别注意的是,当你准备打包的时候一定要看清楚有没有选对起始专案,
因为选错的话可能会出状况(后述)
发挥Universal APP最大效用的方法,
就是把一些共用的东西通通摆到Shared里面
比方说,如果你已经确定App的背景要用纯色或者是图片
那么你就可以把App的背景笔刷设定成一个资源放进App.xaml里面
又或者,你使用资料系结的时候使用的范本、值转换器也可以全放到Shared专案里面
这样就不需要再去两边都开一个档去处理值转换了
(有去载我那个核能APP就会看到资料呈现上几乎一模一样,
那就是因为我把资料呈现范本也直接摆在Shared专案中了)
不过Shared专案有个十分严重的缺点,
就是Shared专案本身不支援NuGet与参考程式库这两个功能
因此如果要在Shared专案里面使用程式库的话,
Windows专案和Windows Phone专案都必须安装同样的程式库,
不然Shared里面就不能用那些程式库了
(估计是因为Shared参照的其实是设定为起始专案的那个专案的功能)
而另外一点必须注意的,是当你设定不同的起始专案时,系统变量会不一样
会造成部分API被注解起来,有可能会造成编译错误
比方说,你的起始专案设定成Windows,但是你却要编译Windows Phone的专案
那么可能会发生Windows Phone找不到Win8专用API(还不少,比方说设定窗格WP就没有)
于是会跳出“找不到API无法编译”的错误
所以记得起始专案与编译的专案要设成一样
(设定的方法是在专案上面按右键选择“设定为起始专案”,
或者是在启动测试的下拉选单中选择起始专案)
此外当你在Shared专案新增档案时,
会发现里面没有设定窗格、分享目标视窗、搜寻结果等Win8专用的页面
甚至连程式页面也只有空白页可以选
就是因为Shared专案是两个专案的交集,所以能新增的也必定是两者的交集
同样的,在写Code的时候,也要注意Win8.1能用的WP8.1不见得能用(反过来一样)
虽然你写的程式码是正确的,但是你的平台不支援,那一样会报错
要避免这个状况,就要善用系统变量“WINDOWS_PHONE_APP”
以及C#内建的语法“#if......#else......#endif”
简单来说,#if......#else......#endif的语法跟if/else相同
都是条件符合就执行,否则就执行另一个区块的语法
不同的是这个加上#号的程式码是给编译器看的
打开App.xaml.cs就马上可以看到一个#if WINDOWS_PHONE_APP的语法
这边是说“当WINDOWS_PHONE_APP系统变量设定为true的时候执行下列程式码”
而Windows专案默认该变量是false,WindowsPhone专案则是true
因此,设定窗格之类只有Win8.1才有的功能,
可以在其前后加上“#if !WINDOWS_PHONE_APP”与“#endif”的指令
这样子编译器碰到的时候,就会自动跳过去不编译区块内的程式码
也就不会因此发生找不到API的错误了
之前看微软的资料,未来Universal APP还会加上XBOX One等平台
到时应该会变得更多样化吧......
作者: Famicom (ファミコン)   2014-05-31 11:40:00
加上XBOne的话...正式的Youtube app有望了吗(误)
作者: hungys (hungys)   2014-05-31 11:52:00
楼上怎么会有这种错觉O_o
作者: felaray (傲娇鱼)   2014-05-31 12:06:00
推...说到前几天我要上传影片,手机版网页还真不知道怎么传原来要两个专案都Nuget以后Shared才能使用呀..呆会来试试
作者: Obama19 (^_^)   2014-05-31 12:32:00
不支援reference很正常阿 两个平台api又不是全互通
作者: BenShiuan (璇璇)   2014-05-31 12:44:00
为什么 VB.net 没有通用应用程式 =..=
作者: Kelunyang (可伦)   2014-05-31 13:08:00
一堆 nuget 都不支援,从头开发起Orz两个都 nuget 的替代方案也可以用 portable class library 啦
作者: abian5566 (ˊ.ω.ˋ)   2014-05-31 16:10:00
实用
作者: Severine (赛非茵)   2014-05-31 21:03:00
谢谢H大~整天下来总算有点概念>< 现在尝试改中枢范例让他读到我的Json...阿扁大大也是改用Universal来支援RT的吗?开始幻想在XB1也能支援MoPTT了~~~
作者: TsaoCCFGOGO (书唸累时,就算数学吧)   2014-05-31 22:34:00
脑袋还不太清楚,先推,有空再慢慢理解。
作者: Xp3310 (Nokia)   2014-06-09 15:39:00
大推阿阿阿

Links booklink

Contact Us: admin [ a t ] ucptt.com