Apple Watch Xcode开发的坑

Apple Watch Xcode开发的坑

  • 坑1-代码放哪里
    • 坑1.1-这么多文件不代表它可以装下你的所有代码
  • 坑2-代码访问控件
  • 坑3-刷新。。。
  • 坑4-具体遇到的坑
    • 坑4.1-WKInterfaceTable
    • 坑4.2-WCSessionDelegate
    • 坑4.3-WCSession.default.transferFile
    • 坑4.4-接收WCSession传过来的文件
    • 坑4.5-FileManager.default.copyItems
    • 坑4.6- 0-based index
    • 坑4.7-真机调试

从python程序员转行Xcode可真不是什么简单的事情,特别是当你一本书都没看的时候。
好在swift跟python很接近啊~~~~
但是由于iOS的优(复)化(杂)性,为iOS编写程序不像在VB、Python里面那样简单。

坑1-代码放哪里

iOS为了程序与系统配合得更好,有一些特殊的框架。比如说,你必须定义一个子程序(或者说函数,方法,func什么的)来作为程序向用户显示的动作。这就是InterfaceController.willActive()。还有很多这样子的框架有待我去学习。
这就造成了有这许多文件。。。心塞
不过也许是我写多了python,像VB也有很多事件,只是Apple摆出来了,VB没有而已。
Apple Watch Xcode开发的坑_第1张图片
介绍一下:
demoapp是iPhone端app的文件夹
义结面澜是我自己加的附件。
appdelegate我并不是很清楚,但是从内容上看应该是app遭遇各种情形时的处理。
viewcontroller就是视图控制器了。在这里你可以定义在视图被载入、被显示和被取消激活时的动作。
main.storyboard就是一个视图编辑器,像VB里的拖控件的界面一样。:以前控件显示在右下方,现在是个浮动窗口,在右上方一排按钮的一个主屏幕按钮一样的按钮点一下出来。
assets.xcassets不清楚,听说是放各种图标啊,资料啊什么的。
launchscreen.storyboard就是app启动时的界面,跟main.storyboard是一个东西。但是launchscreen一开始就会显示,main在运行完interfacecontroller.activate()后才显示出来。
info.plist定义各种东西,以及向系统申请权限,像位置权限什么的。
demoapptests 完全不清楚(-)
demoapp watchkit app就是Apple Watch端app的。。。界面。。。内容。我也不知道为什么iPhone可以把代码和界面放在一个文件夹里而Apple Watch要分开,不过cook就是这样了。
interface.storyboard就是Apple Watch的main.storyboard
你可能好奇为什么Apple Watch没有launch.storyboard,不知道你注意过没有,在Apple Watch上运行任何应用都是后面有一个时间,中间是图标,旁边有点点在转,没得启动图片。如果你真想干,也许可以在willactive里新建一个后台进程,显示图片,再让后台进程改变视图,反正我没试过。
extensiondelegate.swift就像iPhone的appdelegate一样,反正我不清楚(-)
pushnotificationpayload.apns不清楚,大概是定义通知格式的
rowcontroller.swift和locationdelegate.swift(不知对不对)是我创建的两个。这里涉及到坑2.

坑1.1-这么多文件不代表它可以装下你的所有代码

苹果官方的帮助文档很好,但是有两个缺点:1、它例子的版本更新不够快,如果你抄例程,Xcode很可能告诉你它改名了(-)
抄例程……
然而它已经改名了2、它从不告诉你代码放在哪里,也不会告诉你别的地方要加什么代码。
比如我的截图,session.delegete=self这一行,如果你直接在interfacecontroller里输会报错,说self不是一个wcsessiondelegate。确实啊,那新建一个类作为delegate?不,你要在interfacecontroller的父类里面加一个wcsessiondelegate。坑爹吧。
还有,当你在Apple Watch使用wkinterfacetable时,你需要设置一个控制器,这是你就需要新建一个cocoa class文件来放那个类的定义了。

坑2-代码访问控件

如果你用过VB,易语言或者类似的编程语言,那你一定很习惯即放即用。但是Xcode不是这样的。你得在右上角点一下两个圆圈叠在一起的按钮来打开分屏浏览,左边放storyboard,右边放对应的controller。比如Apple Watch就是左边interface.storyboard右边interfacecontroller.swift。然后按住键盘上的Ctrl,再用鼠标左键(或者按住触控板,一个意思)将要用代码访问的控件拖动到右边的代码里。注意要拖动到class里而不是func里,不然连不上的。
Apple Watch Xcode开发的坑_第2张图片
这个在某些文献中被称为“拖拉关联”
Apple Watch Xcode开发的坑_第3张图片
Apple Watch Xcode开发的坑_第4张图片

Apple Watch Xcode开发的坑_第5张图片

有时关联像按钮这样的东西可以关联action(点击时间)或outlet(控制外观)

坑3-刷新。。。

自动刷新这种东西,苹果早在九十年代就开始宣传了。
https://www.bilibili.com/video/av40329388?t=156
然而作为开发者工具的Xcode则支持不好
比如说当你要真机调试的时候,你明明连上了手机,Xcode却告诉你没有设备连接到mac。
然后此时你必须重启Xcode并重新拔插一遍手机。(Xcode点窗口左上角红色叉叉即可,不必从dock右键退出)
而且有的时候上一次模拟器的报错会保留在这一次的模拟里,有可能。
所以说,当你遇到问题时,别忘了多重启一下Xcode。

坑4-具体遇到的坑

坑4.1-WKInterfaceTable

1、你需要新建一个文件,在里面创建一个类,再将其设为NSObject和WKInterfaceTableDelegate的子类,再拖拉关联一下每一行里面的控件。这样才能创建一个Table的控制器。
2、WKInterfaceTable是一个container,就是它里面放别的控件。所以说自由度相对较高,你可以往一行里添加标签、按钮、图片等等。
但是你不说鬼知道啊!还要我去搜例程。。。

坑4.2-WCSessionDelegate

根据(尚未更新方法名的)例程,你需要给wcsession设置delegate。例程中赋值为“self”。
但是如果你直接在interfacecontroller里面指定为self,会告诉你interfacecontroller并不是一个wcsessiondelegate。
所以说我要新建一个类作为代理咯?
后来我决定停止瞎蒙,搜例程
原来是将interfacecontroller的父类里面添加一个wcsessiondelegate。。。
好吧,没毛病,让他是delegate就行了。。。

坑4.3-WCSession.default.transferFile

这个不算大坑,但是有必要说一下。如果你在transfer后面加一行代码print一下transfer完成了什么的,那你就错了。根据官方文档,wcsession会在后台传输文件(因为那蓝牙奇慢无比),所以说你这里的finish其实只是开始传了,并不是什么传完了。

坑4.4-接收WCSession传过来的文件

官方并没有告诉你WCSession.default.transferFile会将文件传到哪里,只说了传到counter part(对应的部分,废话)。我一开始以为就是传到对应的文件夹,比如iPhone的/Documents里面的文件应该会被放到Apple Watch的/Documents里面,然而并不是。
原来要在接收端的wcsessiondelegate(就是interfacecontroller)添加一个子程序(函数,方法,whatever)名为session,(Xcode会自动联想的,前提是你设置了wcsessiondelegate的父类)然后参数里面选有didReceiveFile的。这个didReceiveFile的对象类型是WCSessionFile(好像是这么叫的),并不是什么file,坑爹了。这时你需要访问它的fileurl属性进一步操作该文件。

坑4.5-FileManager.default.copyItems

这个文件复制跟cmd,terminal里面都不一样——目标路径必须是一个文件。比如你指定目标为NSHomeDirectory()+“/Documents/”是不行的,他会告诉你文件已存在(documents文件夹确实存在)。你只能指定为NSHomeDirectory()+“/Documents/你想要的文件名.想要的后缀”这样。

坑4.6- 0-based index

其实这个主要怪我,没仔细看官方文档(_)
swift里的index都是从0开始的。

坑4.7-真机调试

无论我们写的是什么程序,我们都会有一个小小的愿望——真机调试。
然而Apple Watch的真机调试并不容易。
先不说Apple Watch的。iPhone的真机调试不要勾选connect via network,这样会用网络调试,后果就是安装app的时候奇慢无比。一定要连线!
然后调试的时候,你选择的是什么,它捕捉的就是谁的输出。
Apple Watch Xcode开发的坑_第6张图片
像上图,我左上角选择的是watchkit app,下方就只捕捉Apple Watch的print。不会搞混,但也没法同时捕捉。不过app会在两端都更新。
然后是Apple Watch调试。
根据我的试验,将Apple Watch用数据线连接到mac没有任何效果!正确做法是佩戴Apple Watch,iPhone连线,选择watchkitapp调试,然后理论上就会安装上了。
但是很多时候经常容易装不上,这时可参考识别不了已连接的iPhone的方法。
但是这也经常不管用,所以还是用模拟器吧。如果你需要将设备连接到电脑,进行文件共享的,可参考以下方法:
1、让你要访问文件的app在运行时print一下nshomedirectory
2、copy下来,在terminal中打开
3、ls、cd一下,并将文件cp进去
4、将文件拖动到terminal里面会自动加入此文件路径。

你可能感兴趣的:(入门,初来乍到)