Apple Watch开发的一些细节和总结

Apple Watch如何进行真机调试及问题汇总 在我们开发iOS或者AppleWatch应用中,不管我们代码写的怎么样,总有一个小小的愿望,就是能把程序运行到真机上,而不是模拟器。而随着Xcode7的发布,这一想法就变得更为简单了,就算你没买99刀的开发者账号,也没去越狱等各种非正常手段,现在你也可以通过官方的办法进行真机调试。但是想要在AppleWatch上真机运行,我也遇到了很多坑。下面我为大家慢慢解决这个问题。       首先我来罗列 阅读详情

这篇文章旨在总结一下最近Watch开发下碰到的问题和细节

1、关于Watch的真机调试问题

        一般的情况下,你为IOS主应用创建了一个extention,比如说Today Extension 。Xcode都会自动帮你生成该extention的appid,然后生成对应的Provisioning Profile。然后在Targets-->Build Settings-->Code Signing 里选择对应的Provisioning Profile,勾选对应的keychain就可以run了。

       如果你为你的项目创建了AppleWatch,那么就会在原项目中新增了 watchkit extension 和 watchkit app 两个target。那么你需要在苹果开发者中心为watchkit extension 和 watchkit app 分别创建正确的bundle identifier。而为watchkit这两个扩展新建的bundle identifier都是从主应用的bundle identifier进行扩展的,这样的命名规则必须遵守。假如你的主应用bundle identifier是com.jaybin.myapp。那么watchkit extension的bundle identifier就必须为com.jaybin.myapp.watchkitextension。watchkitapp的bundle identifier就必须为com.jaybin.myapp.watchkitapp。因为在 iOS 系统上,app 本体是核心。所有的运行实体都是依托在本体上的。

       到这里你就可以为watchkit这两个target对应的appid创建对应的Provisioning Profile。加上主应用的话,一共需要6个ProvisioningProfiles。3个 development Profiles,3 个 archiving/store Profiles。

       最后一步就是将证书部署到Xcode项目中运行或者打包。首先按照下面操作 Xcode >Preferences > Accounts > YOUR_ACCOUNT > View Details 。


可以看到该账号下的所有证书,随便选中其中的一个Profiles,选择在Finder打开,然后将该文件夹下的所有证书删除,这样可以清空原先的无效Profiles。然后点击视图左下角的刷新按钮,刷新证书,Xcode会将最新的证书download下来,包括刚才创建的新Profiles。最后确保项目中的target,主target和watchkit target都选择关联上了正确的team。然后选择对应正确的Provisioning Profiles(一般情况下Provisioning Profiles选择automaic就可以run了)。不过奇怪的是,我只对watchkit extention创建了对应的appid和profile 就可以run了。估计是Xcode 自动帮我们把Watchkit app 的Provisioning Profile设置好了。


       别忘了在运行之前先clean项目,因为Xcode有时候会缓存旧的profile和设置。

       最后提醒一下,AppleWatch的开发/真机调试和iphone是一样,也需要在开发者中心中的账号下添加开发测试设备。否则就会 “提示错误:应用验证失败”

       查看AppleWatch的UDID和查看iphone设备的一样,如果watch和iphone已经配对成功的话,在查看iphone的UDID页面下方就能查看到watch的UDID。在Xcode下的 Window > Deivces 就可以查看。

 


2、WatchKit app的特殊导航类型

   按照导航形式和风格分为两种

   1)分层风格(push/pop、Present和iphone上的导航风格一样)

   2)分页风格(presentControllerWithNames、becomeCurrentPage)

 

具体的视图切换、页面的跳转API

                                               

- (void)pushControllerWithName:(NSString *)name context:(id)context

- (void)popController;

- (void)popToRootController;

 

- (void)presentControllerWithName:(NSString *)name context:(id)context;

- (void)presentControllerWithNames:(NSArray *)names contexts:(NSArray *)contexts;

- (void)dismissController;

 

-  (void)becomeCurrentPage;

 

       需要注意的是使用以上这一组API进行视图切换与跳转时,Push和Present方法第一个参数是对应的在Storyboard中为WKInterfaceController设置的identifier字符串。

当然对于WatchKitApp,是可以在Storyboard里建立多个InterfaceController并像在iOS应用一样直观的画出视图转换连接的,可以通过视图控制器代码实现相应视图切换与跳转。直接在Storyboard中设置Triggered Segues。使用Segues时,Selection同样支持Push和Model两种跳转方式。关于分页导航,我们也可以在Storyboard里按住control从视图A拖到视图B选择next page可以建立此关系。

       关于WatchKitapp的导航最值得关注的就是分页导航(Page-based)与分层导航(Stack)模式的混用。因为在视图的切换与跳转中,为了方便与用户的交互我们常常需要多种导航方式混用。但是分页导航与分层导航是互斥的,因此必须使用模态方式(Present)进行切换。

       比如主控制器为分页视图时(页面导航用Page-based),要正确弹出一个分级视图栈可以用presentControllerWithName:conext:方法,而主控制器为分级视图时,要正确弹出单页视图,也用presentControllerWithName:conext:。

       如果想弹出多个页面组成的分页视图,我们可以present一组Controller, 这一组Controller将以page control的形式展示,这时需要改为用presentControllerWithNames:contexts:。不过这样有一个问题,如果我在一个分级视图中present一组Controller,即当前展现的视图以page control的形式展示。对于这组分页视图而言,所有视图的左上角都会默认自带一个返回的“cancel”按钮,点击后当前的这组视图将Dismiss掉,返回上一层视图。但是如果我在当前这组分页视图中再present出一个模态视图,然后返回,会发现原先这组分页视图左上角上面的返回“cancel”按钮消失了,也就无法返回到上一层了。貌似在这些视图中调用dismissController也不起作用。所以,对于presentControllerWithNames:contexts:,如果present出一组Controller后,在这组Controller视图中就不要再present出模态视图,否则这组分页视图将无法返回到上一级页面。

       不过关于分页视图,还有一个很好用的方法,reloadRootControllersWithNames:contexts:  当app启动时,如果想以分页界面的形式展现视图控制器,即用户可以左右滑动切换视图。那么我们就可以在初始界面控制器的init方法中调用reloadRootControllersWithNames:contexts:方法。这种情况,我们通常会在storyboard文件中配置一组初始的页面集合。当app启动时,WatchKit会实例化和初始化第一个展示的页面,即初始界面控制器(MainInterfaceController),然后是分页界面中的其他界面控制器。也就是说当系统加载WatchKit app界面时,它将一下子实例化和初始化组成界面的所有界面控制器。当用户从一个界面控制器切换至下一个时,它将调用当前界面控制器的didDeactivate方法,以及即将展示的界面控制器的willActivate方法。willActivate方法可确保界面中的信息是最新的。当然我们也可以在app运行时在willActivate方法中调用该方法。

 


3、关于Watch与Iphone主应用的数据通信

       如果在watchkit extension中进行数据的申请,比如网络调用。这样就会造成无法复用项目中已有的代码,会写出很多重复的代码,性能上优化的空间不大。    所以如果Apple Watch应用需要执行长时间运行在后台的任务,比如网络调用,这时应该让iPhone端的主应用来做这个工作。


1)使用WKInterfaceController中的openParentApplication:reply:方法在后台唤醒iPhone端主应用,由主应用去进行网络数据的处理,处理完成后再返回WatchKit扩展所需的数据。

watchkit extension发送请求唤醒主应用:

+(BOOL)openParentApplication:(NSDictionary *)userInfo reply:

(void(^)(NSDictionary*replyInfo, NSError *error)) reply;


watchkit extension中,具体Demo如下:

    
    //watchkit extension 向主应用发送请求,唤醒主应用
    NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
    [userInfo setObject:@"say something" forKey:@"openType"];
    [WKInterfaceController openParentApplication:userInfo reply:^(NSDictionary *replyInfo, NSError *error){
        
        //主应用处理完后的回调,返回extension所需的数据
        NSString *words = [replyInfo objectForKey:@"words"];
        NSLog(@"say: %@",words);
    }];
    
    


2)主应用处理WatchKit请求的方法,UIApplicationDelegate方法:

-(void)application:(UIApplication*)application

handleWatchKitExtensionRequest:(NSDictionary*)userInfo reply:(void (^)(NSDictionary *))reply;

需要注意的是主应用每次执行UIApplicationDelegate方法,处理完成WatchKit的请求后都要回调reply(replyInfo);否则这个方法会响应失败。


主应用中,具体Demo如下:

//主应用处理来自watchkit extension的请求
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply{
    
    if(userInfo){
        NSString *openValue = [userInfo objectForKey:@"openType"];
        if(openValue && [@"say something" isEqualToString:openValue]){
            NSMutableDictionary *replyInfo = [NSMutableDictionary dictionary];
            [replyInfo setObject:@"Hello World!" forKey:@"words"];
            
            //主应用处理完成后,回调来自watchkit extension的 reply(replyInfo),否则方法响应失败
            reply(replyInfo);
        }
    }
    
    
}


这样就完成了一次 watchkit extension 与主应用之间的数据通信了。watchkit extension中的输出打印是:

say: Hello World!

即 watchkit extension 通过请求获得主应用传送过来的数据了。

 

另外一种通信方法就是我们熟知的IOS应用中,主应用与extension通过App Group来进行数据共享通信。

 





Apple watch 真机调试包 5.1 & 5.2 (16T5181e) Appke watch 真机调试包 5.1 & 5.2 (16T5181e) From Xcode_10.2_Beta 立即下载

相关推荐

vue引入使用腾讯地图

// 引入鹅厂地图 initMap(lat = 0.0000000, lng = 0.0000000) { // 定义地图中心点坐标- var center = new TMap.LatLng(lat, lng) // 定义map变量,调用 TMap.Map() 构造函数创建地图 map = new TMap.Map(document.getElementById('txMapBox'), { center: center, // 设.

LiangRZ 4536

apple watch真机开发第一步连接xcode详细教程,开启watch开发者模式真的很坑啊啊啊啊啊

1.首先先确保你的 Apple Watch 跟 你的 iPhone 已经配对完成2.用数据线连接你的 iPhone 到电脑,等待一会,然后打开xcode,找到这个iphone,如果有警告提示,就需要打开开发者模式:Previous preparation error: Developer Mode disabled. To use iPhone for development, enable Developer Mode in Settings → Privacy & Security:到iphone设置中

8633

新手必看!Unity中Tag和Layer的7个实际应用场景(含MOBA案例)

本文深入探讨Unity中Tag和Layer的7个实际应用场景,特别以MOBA游戏开发为例,详细解析如何利用LayerMask进行高效场景管理和碰撞检测优化。从双相机方案到射线检测的精准控制,帮助开发者掌握这些基础功能的进阶用法,提升游戏性能和开发效率。

weixin_28723171的博客 313

Xcode 16 beta3 真机调试找不到 Apple Watch 的尝试解决

在本篇博文中,我们讨论了在 Xcode 中真机调试找不到 Apple Watch 的尝试解决方法,希望能解大家燃眉之急!

享受开发,颠倒银河 3881

USRP X410 MPM版本与主机UHD版本不匹配问题记录与解决

至此大功告成!之前安装软件的坑算是填起来了,再次记录一下,希望能帮到有同样问题的小伙伴~

yanzuwu233的博客 1436

双轮差动机器人SLAM实战:轮速里程计从建模到精度验证(附Matlab代码)

本文详细介绍了双轮差动机器人SLAM系统中轮速里程计的实现全流程,包括核心原理、建模方法、Matlab代码实现及精度验证。通过轮速仪数据建模和连续积分算法,提升定位精度,并附有完整的误差分析和工程优化技巧,为开发者提供实用参考。

weixin_29050271的博客 224

Apple Watch如何进行真机调试及问题汇总 (二)

当我们在Apple Watch运行程序时,或多或少都会出现问题,现在我把这些问题再罗列一下,并贴出解决方案,供大家分享: (1)error:WatchKit apps must have a deployment target equal to iOS8.2(was 9.0) 当你在以前旧的项目中通过加入一个target来增加一个watchkit app的话,很可能出现这样的问题,这是由于版本

乞力马扎罗的雪CYF的博客 5898

DISM错误87详解:RestoreHealth选项无法识别的修复方法

DISM(部署映像服务和管理工具)是Windows系统维护与修复的核心命令行工具,常与SFC(系统文件检查器)配合使用,用于扫描和修复组件存储损坏、系统文件缺失等问题。在执行系统健康检查时,用户常会遭遇错误87,提示“未在此上下文中识别出restorehealth选项”。该错误的本质并非工具损坏,而是命令参数结构不符合DISM的语法解析规则,或当前系统环境(如Windows 7、WinRE/PE、32位环境)不支持该参数。理解DISM的命令层级、参数挂载关系以及运行上下文,是精准排除故障的前提。通过核对标准

weixin_34116482的博客 481

如何在 Apple Watch 真机中测试项目,如何安装项目到 Apple Watch

如何在 Apple Watch 真机中测试项目,如何安装项目到 Apple Watch 情况 在开发 Apple Watch 单独应用的时候,而非 iPhone 与 Apple Watch 合并的应用。 默认情况下我们是可能通过在模拟器中运行大部分应用的 有些情况需要在真机上测试,如 电池电量等信息,在模拟器中永远是 .unknow 状态 安装目标的列表中,没有显示没有你手上戴的 Apple...

学习笔记 3041

QCC51XX---人机接口设备协议( HID)

QCC51XX---人机接口设备协议( HID)

weixin_42162924的博客 819

Modis数据处理工具:MRT百度网盘下载和手把手图文安装教程

如下图所示为MODIS Reprojection Tool(MRT)的软界面,看似简单,却是Modis遥感影像必不可少的处理工具,如投影变换等。本文以图文并茂的形式,详细讲解MRT软件在Windows10平台上的安装过程,并附MRT软件百度网盘下载地址。 Modis Tool主界面: 一、安装过程 1、安装Java运行环境 双击Java.exe,安装运行环境。默认的安装路径为C:\Program Files (x86)\Java\jre6\bin,后面需要用到这个路径。 等待...

智慧空间实验室 2623

Apple Watch开发了一些细节和总结

本文旨在总结最近Watch在发展中遇到的问题和细节 1、左右Watch真机调试问题 一般的情况下,你为IOS主应用创建了一个extention,比方说Today Extension 。Xcode都会自己主动帮你生成该extention的appid,然后生成相应的Provisioning Profile。然后在Targets-->Build Set...

aofan9566的博客 239

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Apple Watch 开发者套件 WatchKit 发布后,你需要知道这些

Apple 上线了供 Apple Watch 开发者使用的开发工具 WatchKit。从这款工具和相关文档中,The Verge 发现了一些重要细节。 Apple Watch 几乎无法独立使用 根据开发者文档的描述,开发者需要在现有的 iOS 应用基础上开发 Apple Watch 应用。此外文档表明,Apple Watch 应用应该是 iOS 应用的补充而不是替代品。“如果你预估 iOS(i

lishichao706的专栏 1686

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

AppleWatch开发入门五——菜单控件的使用

AppleWatch开发入门五——菜单控件的使用 一、简介 菜单也是WatchOS中一个重要的交互方式,限于Watch的屏幕尺寸,若将所有用户交互控件都紧密的排列进展示的UI中,那样难免会使用户操作困难,也会影响界面布局的简洁美观。因此,WatchOS的菜单机制是一层覆盖在屏幕上的交互界面,有如下的特点: 1、菜单是内置于Interf...

weixin_33670713的博客 549

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

WatchKit FAQ

原文地址:http://www.cocoachina.com/ios/20150323/11396.html 本文由CocoaChina翻译组成员YueWang翻译自raywenderlich,敬请指正。 原文:WatchKit FAQ,作者:Soheil Azarpour Ray友情提示:这篇关于WatchKit的文章是作为 Spring Swift F

zspirtmoonyy的专栏 1012

苹果最新WatchKit App优化和提交指南

优化WatchKit App 将Xcode更新至最新的Xcode 6版本,其中包含支持WatchKit的iOS 8.2 SDK,并使用这些指南和最佳实践来优化你的WatchKit app。 设计 了解WatchKit app设计细节和相关资源,并遵守Apple Watch Human Interface Guidelines的要求。 Apple Watch Design R

vickyjfr的专栏 459

Apple Watch 开发详解

Apple Watch 开发详解 Apple Watch 开发详解 Apple Watch现在对于第三方开发者来说更多的还是一块额外的屏幕。暂时WatchKit没有能给出足够的接口。现在Watch App的主要运算逻辑需要依赖iPhone,Apple也承诺会有原生的手表App,可能要等到Apple Watch和WatchKit的完全版面世的时候。 1、两种屏幕分辨率...

a359798678的博客 225

Apple watch 开发指南(3) 开发apple watch

苹果公司提供给用户明显的和不明显的途径来访问他们的数据。和从口袋里拿出iphone相比,用户可以憋一眼apple watch来更快的获取重要信息。为apple watch编写的程序以最直接了当的方式来提供最相关的信息来支持最简要的交互。apple watch 需...

chifange3549的博客 297

WatchSpringboard-Prototype源码探秘:Apple Watch交互细节的完美复刻

WatchSpringboard-Prototype是一个专注于复刻Apple Watch交互细节的开源项目,它能够帮助开发者轻松实现类似Apple Watch的图标布局视图。通过深入研究该项目的源码,我们可以学习到如何打造流畅、直观的智能手表用户界面。 ## 项目核心功能:复刻Apple Watch交互体验 🕒 该项目的核心在于实现了一个类似Apple Watch的主屏幕布局视图,让用户能

gitblog_00320的博客 424

Apple-Watch-Poketch 项目使用教程

Apple-Watch-Poketch 项目使用教程 1、项目介绍 Apple-Watch-Poketch 是一个开源项目,旨在使用 SwiftUI 和 WatchOS 8 在 Apple Watch 上重新创建《口袋妖怪 钻石与珍珠》中的 Poketch。Poketch 是游戏中的一个多功能手表,提供多种实用工具和小游戏。该项目由 IdreesInc 开发,并在 GitHub 上公开发布。 项目...

gitblog_00067的博客 764

Apple Watch 用户指南 DIY 版

Apple Watch 用户指南 DIY 版 项目介绍 该项目https://github.com/KrauseFx/watch.user.git(注:此链接为模拟示例,实际可能不存在)是一个专注于帮助开发者和普通用户深入了解及自定义Apple Watch功能的开源资源库。它不仅提供了详尽的指南以辅助开发者集成和定制Apple Watch应用程序,还面向普通用户分享如何最大化利用Apple Wa...

gitblog_00166的博客 676

终极对比:Apple Watch版quake_watch与原版《雷神之锤1》有何不同?

quake_watch是将经典第一人称射击游戏《雷神之锤1》(Quake 1)移植到Apple Watch平台的创新项目。本文将从游戏体验、操作方式、技术实现等多个维度,全面对比这款Apple Watch版quake_watch与原版《雷神之锤1》的差异,带您了解如何在手腕上体验这一经典游戏。 ## 一、核心玩法保留,适配手表屏幕的视觉体验 虽然从PC平台移植到Apple Watch这一微型设

gitblog_00352的博客 942

引领未来游戏体验:Apple Watch上的《Watch_Quake》探索之旅

引领未来游戏体验:Apple Watch上的《Watch_Quake》探索之旅 在数字时代的大潮中,科技的极限总是在被不断挑战和超越。今天,我们将带您走进一个全新的游戏领域——《Watch_Quake》,一款专为Apple Watch量身打造的经典Quake 1移植版,它重新定义了腕上游戏的可能。 项目介绍 想象一下,在手腕之间跃动的不仅仅是时间,还有那1996年经典射击游戏的魅力。《Watch...

gitblog_00720的博客 779
上一篇: ios下 KeyChain 的研究
下一篇: 利用Associative机制为UIAlertView添加一个Block属性,将AlertView与button的响应事件关联
jaybinhe
博客等级 码龄15年 18粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值