阅读更多
Apple Watch已经上市一段时间,在探究其防盗、防水等众多功能的同时,Apple Watch版应用开发也在不断的摸索前进中。在本文中,来自国外的知名iOS开发大牛就Watch版应用开发过程中遇到的问题以及犯下的错误进行了分享。

Natasha Murashev——Capital One iOS工程师、Natasha The Robot博主

我犯过的最大错误就是认为在Apple Watch上发送信息就可以打开iOS App。WatchKit有一个支持直接发送信息到iOS应用的API,能够有效地触发后台进程。想要启动时只需调用一个WKInterfaceController类函数即可:
// WKInterfaceController
class func openParentApplication(userInfo: [NSObject: AnyObject],
                                    reply: (([NSObject: AnyObject]!, NSError!) -> Void)?) -> Bool

// launches containing iOS application on the phone
// userInfo must be non-nil

但是,WatchKit却并没有实现帮助用户打开iOS应用。当我在模拟器中进行测试时,它是能够打开iOS应用的,但在真机环境下却只能在后台运行。尽管如此,它依然能快速传递信息并执行重要任务。

除上述之外,我还学会了另一个非常有用的事情:如何同时调试iOS和Watch版应用。在iOS应用指令中有一个可以接收WatchKit扩展信息的函数:
// AppDelegate
func application(application: UIApplication, handleWatchKitExtensionRequest
                    userInfo: [NSObject: AnyObject]?, 
                       reply: (([NSObject: AnyObject]!) -> Void)!)

当我第一次使用这个方法时并不奏效,而我也不知道该如何调试它。每次只能完成WatchKit或iOS端部署,而且还都是以iOS应用弹出警告结束,并且系统会尝试调试代码。后来我发现,有一个方法可以同时调试iOS和WatchKit App:
  • 运行WatchKit App;
  • 在你的模拟器中打开iOS版App;
  • 返回Xcode;
  • 选择Debug> Attach to Process > (YOUR iOS App)
Brian Gilham——The Working Group高级移动开发者、Five Minute WatchKit博主

我犯过的最大错误就是在iOS模拟器中单独运行应用时很容易忘记其很多功能都是依赖于BTLE连接的。模拟器会尝试通过延迟请求来解决这个问题,但有时它需要的回应时间实在太长。

因此,在对应用程序的设计和开发进行改进时,开发者可以问自己三个问题以自省:
  • 如果这个视图或操作需要长时响应该怎么办?
  • 如果根本得不到任何响应,应用程序会作何反应?
  • 我有什么办法可以解决这些问题?

对于这些问题,不同的应用会有不同的解决办法,但有些事情非常值得考虑:

1.如果使用API响应或图像超过一次的机会渺茫,就要尽可能地缓存。如果一个信息流无法做到每15分钟更新一次,那就不要在每次启动应用时运行API。
2.在用户需要某些数据之前,就要利用任何机会去下载它,可以后台获取,并将其与缓存数据和已存在的数据相结合。
3.如果你不得不让你的用户等待应用启动,可以考虑在这段加载的时间内播放些有趣的动画,让用户觉得应用卡顿实属大忌。同样地,应该确保及时更新UI,让用户能了解到他的请求是否已经失败。
Conrad Kramer——Workflow创始人

早前我们使用图像选取器去处理问题,但它给人的感觉是,似乎要永远加载下去,而且,内存的使用量会让WatchKit扩展崩溃。在经过多次试验和失败后,我得出了以下几点关于发送图像到Apple Watch上的技巧:
  • 图片的缩略图应适合屏幕的大小;
  • 将图片压缩成JPEG或PNG格式;
  • 调用-[WKInterfaceImage setImageData:],比使用UIImage对象更快,而且可以提高内存使用率。

如果需要使用动态图片,可以使用+[UIImage animatedImageWithImages:duration:]。另外,Apple Watch不支持持续duration属性,如需要,可使用-[WKInterfaceImage startAnimatingWithImagesInRange:duration:repeatCount:]。

James Robert——Media Predict CTO

我在开发Apple Watch应用时犯的第一个错误是尝试把iPhone应用中的图形元素直接搬运到Apple Watch上。最终,我不得不重新考虑设计以让应用在这个有限的环境中更完善。

正如前面Conrad所言,在开发Watch应用时需要更小心谨慎地使用图像。用JPEG压缩的NSData可以获取到合适的图像。但我只是将图像分组进行替换,并对背景颜色和边框进行设置。Watch的屏幕的太小,为了留出足够的空间给文本必须要做出各种努力。

Curtis Herbert——独立开发者&设计师

我在开发Watch版Slopes时犯了一个很大的错误,就是不能对视图进行智能化更新。我会想能不能像iOS版那样随时更新屏幕,但事实却无法让人舒心,这些功能只能在蓝牙开启的情况下才能正常运转。

在运行应用时,如果你注意到控制台日志,就会发现WatchKit在试图删除那些它所认为的重复更新,而一些调用didDeactivate后的更新也会被忽视。苹果十分积极地将更新发送至蓝牙,并且耗能极小,但却没有为WKInterfaceController或WKView提供任何工具去追踪这个状况对用户的影响。

Neil Kimmett——M&S Digital Labs开发者

我们在开发WatchKit App时犯的最大错误就是关于各种文本元素周围的边距。在开发PC和手机端应用时,我们在屏幕边缘和文本之间设置了一个非常漂亮并足够大的间距,但在Watch上,如果使用黑色背景,那手表边框就自然地和文本框之间产生了距离,所以从文本到屏幕边缘的距离就是多余的了。

不设置间距,这在模拟器上看会有些奇怪,但在设备上就显得非常自然。它还有一个额外的好处就是在有限的屏幕资源上可以有你更多的空余地方进行其他操作。

Kristina Thai——Intuit iOS软件工程师

我犯的最大错误之一是尝试在reply dictionary中通过handleWatchKitExtensionRequest自定义类对象来向WatchKit扩展发送信息。当自定义对象输入replyInfo dictionary时还是正常的,但它不能被plist文件序列化,所以会出现错误。如果你尝试发送自定义对象,你将在最后看到这样一条提示错误的信息:
引用
Error Domain=com.apple.watchkit.errors Code=2 "The UIApplicationDelegate in the iPhone App never called reply() in -[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]" UserInfo=0x61000006f640 {NSLocalizedDescription=The UIApplicationDelegate in the iPhone App never called reply() in -[UIApplicationDelegate application:handleWatchKitExtensionRequest:reply:]}

因此,自定义对象不能通过plist文件序列化,也可以说iPhone上的应用在handleWatchKitExpensionRequest中调用reply(),即使你尝试这样做。在此,我列出一些可以在iPhone和Watch应用之间进行数据共享的方法:

1.你仍然可以使用reply dictionary去传输一些简单的数据。最初,为了可以在Apple Watch上显示,我的自定义对象需要的是一段字符串,而这些通过应用是很容易传递的,状态代码和快速信息同样如此。你也可以将稍微复杂一些的数据在App中用数组和字典等方式传递。
2.如果你需要自定义对象的所有属性,首先设置App Groups,然后根据需求使用NSUserDefaults或NSFileManager。
3.以上两条有一个非常有趣的共性就是使用NSKeyedArchiver将自定义对象存档后,可以通过reply dictionary来进行传输。示例如下:
  • 在手机端创建reply dictionary

NSMutableDictionary *reply = [NSMutableDictionary new];
MyCustomObject *myObject = <something you need to send>;
reply[@"myKey"] = [NSKeyedArchiver archivedDataWithRootObject: myObject];
NSAttributedString *myString = <some attributed string>;
reply[@"otherKey"] = [NSKeyedArchiver archivedDataWithRootObject: myString];

  • 解压到Apple Watch端

NSData *objectData = replyInfo[@"myKey"];
MyCustomObject *myObject = [NSKeyedUnarchiver unarchiveObjectWithData: objectData];
NSData *stringData = replyInfo[@"otherKey"];
NSAttributedString *myString = [NSKeyedUnarchiver unarchiveObjectWithData: stringData];

文章来源:Realm
来自: CSDN
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Oracle Sql语句转换成Mysql Sql语句

    Oracle Sql语句转换成Mysql Sql语句java 源码,非常简单,只要给定源oracle sql语句地址,和生成目标文件地址运行即可。

  • SQL server 查询语句

    select * from test.dbo.users -- 普通条件查询 where id=1; 模糊查询 select * from test.dbo.users where username like '%li%'; ... select * from test.dbo.users -- id在1~3之间的数据 ... select * from test....

  • MyBatis-Plus 自定义sql语句

    一、引言 Good Good Study,Day Day Up,童鞋点个关注,不迷路,么么哒~~~

  • SQL常用语句大全

    SQL常用语句大全

  • 使用SQL语句创建数据库与创建表

    目录 前言 一、通过sql语句实现 1.1 创建数据库 1.2 查看、验证创建的数据库。 1.3 修改数据库的属性 1.4 数据库的分离与附加。 1.5 创建数据表 二、用通过SQL Sever Management Studio 2.1 创建数据库 2.2 查看、...

  • SQL语句基础教程

    SQL语句基础教程

  • python执行mysql多个sql语句_mysql -- 一次执行多条sql语句

    最近要做一个软件升级,其中涉及到数据库表字段的变动(新增或删除或修改),所有的关于数据库的变动的sql语句都是存放在Sqlupdate.sql文件中,每次升级的时候都需要执行一次Sqlupdate.sql里的所有sql语句,这就涉及到...

  • SQL语句一对多查询

    效果如下 2个表 spr_course sys_user 表中我们可以发现一个科目会有多个老师教,如果我们直接进行表连接的话...sql语句一对多(spr_course和sys_user表) SELECT spr_course.*,GROUP_CONCAT(sys_user.`username`) AS...

  • ORACLE分页查询SQL语句(最有效的分页)

    一、效率高的写法 ** 1.无ORDER BY排序的写法。(效率最高) (经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!) SELECT * FROM (SELECT ROWNUM AS rowno, t.* ...

  • SQL语句创建数据库

    用sql语句创建一个名为“SM”的数据库,初始大小为10MB,最大为50MB,数据库自动增长,增长方式按10%;日志文件初始大小为2MB,最大大小不受限制,按1MB增长。

  • SQL语句之表的创建和使用

    SQL语句之表的创建和使用

  • 关于sql和MySQL的语句执行顺序(必看)

    今天遇到一个问题就是mysql中insert into 和update以及delete语句中能使用as别名吗?目前还在查看,但是在查阅资料时发现了一些有益的知识,给大家分享一下,就是关于sql以及MySQL语句执行顺序: sql和mysql执行...

  • 一条SQL语句在MySQL中执行过程全解析

    本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的。

  • mysql 删除一条数据sql语句_sql删除语句

    sql 删除语句一般简单的删除数据记录用delete就行了,但是如何要删除复杂的外键就不是一条delete删除来实例的,我们本文章先讲一下delete删除,然后再告诉你利用触发器删除多条记录多个表。删除数据库中的数据sql ...

  • java批量执行查询sql语句_如何从Java执行多个SQL语句

    批处理允许您将相关的SQL语句分组为一个批处理,并通过一次调用将其提交给数据库。参考当您一次将多个SQL语句发送到数据库时,可以减少通信开销,从而提高性能。不需要JDBC驱动程序即可支持此功能。您应该使用该...

  • SQL删除语句

    SQL中的三种删除语句的基本语法

  • plsql执行大量SQL语句导致卡死问题

    打开命令窗口 输入@ 你的sql文件地址就可以 (@ D:\xxx.sql) enter 就可以了

  • 如何用sql语句创建一个表(简单基础)

    使用CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中...创建一个actor表,包含如下列信息 列表 类型 是否为NULL 含义 actor_id smallint(5) not null 主键id first_name varchar(45)

  • 通过Navicat 写SQL语句

    具体步骤: 1、首先打开要写SQL语句的数据库连接 2、然后点击菜单中的查询(query) 3、然后点击新建查询 4、然后输入SQL语句,点击运行,查询到的数据在底部

  • 多种典型T-SQL语句、备份、优化、常见问题处理集合包

    首先说明这个是收集与csdn 多年来的精华帖 有很多经典问题的处理方法,集多为大牛的心血为一体 包括备份还原,导入导出、行列转换、动态sql基本语法、游标、复制 等等,可以说是丰富多彩、包罗万象。 这里不多在阐述...

Global site tag (gtag.js) - Google Analytics