由于应用程序标识符权限,我无法安装watchOS 2 WatchKit应用程序.在"功能"选项卡中启用"应用程序组"后发生这种情况.
完整错误:
应用安装失败
此应用程序的应用程序标识符授权与已安装的应用程序的授权不匹配.这些值必须匹配才能允许升级.
这是在物理设备上以调试模式运行应用程序.只运行iOS应用程序工作正常.
我再次关闭App Groups并删除了添加的权利文件,但是同样的错误.
#available 在区分watchOS和iOS时似乎不起作用.
以下是iOS和watchOS之间共享的代码示例:
lazy var session: WCSession = {
let session = WCSession.defaultSession()
session.delegate = self
return session
}()
Run Code Online (Sandbox Code Playgroud)
...
if #available(iOS 9.0, *) {
guard session.paired else { throw WatchBridgeError.NotPaired } // paired is not available
guard session.watchAppInstalled else { throw WatchBridgeError.NoWatchApp } // watchAppInstalled is not available
}
guard session.reachable else { throw WatchBridgeError.NoConnection }
Run Code Online (Sandbox Code Playgroud)
似乎它只是默认为WatchOS,并且#available编译器不会考虑它.
我是否滥用此API或是否有其他方法可以区分iOS和WatchOS之间的代码?
更新:似乎我误用了BPCorp提到的API
使用Tali的上述代码解决方案:
#if os(iOS)
guard session.paired else { throw WatchBridgeError.NotPaired }
guard session.watchAppInstalled else { throw WatchBridgeError.NoWatchApp }
#endif …Run Code Online (Sandbox Code Playgroud) 在对并发症进行了几天的处理之后,我有信心对于以规定间隔发生的更新的更新过程进行以下说明:
requestedUpdateDidBegin()
reloadTimelineForComplication 如果您需要重置所有数据.extendTimelineForComplication 如果您只需要在并发症时间轴的末尾添加新项目.requestedUpdateBudgetExhausted()而不是requestedUpdateDidBegin()如果您在当天花费了太多的并发症时间预算.这就是这个问题的原因.reloadTimelineForComplication,系统将调用getCurrentTimelineEntryForComplication(以及获取阵列的未来和过去变体,具体取决于您的时间旅行设置)extendTimelineForComplication说只会getTimelineEntriesForComplication(... afterDate date: NSDate ...)被调用.getNextRequestedUpdateDateWithHandler以便您指定复杂性需要新更新的时间.Apple的文档非常明确,您不应该经常询问更新,或者在复杂化代码中进行太多处理,否则您将耗尽时间预算,并且您的并发症将停止更新.所以,我的问题是:你在何时何地进行更新?
对于上下文,我的方案是一个URL,其返回数据每小时最多更改两次.
放置URL获取代码最明显的地方是func requestedUpdateDidBegin()获取数据,存储它,如果没有变化,只需返回.如果有更改,则延长或重新加载时间线.
但是,URL提取可能会很昂贵.备择方案:
WCSession,但如果用户关闭该应用程序,则更新将不再发生.还有其他地方吗?我可以在手表应用程序中使用不属于复杂功能的周期性功能吗?获取并发症更新数据的正确位置在哪里?
我使用WatchKit 1.0创建了一个iOS/Apple Watch应用程序,它使用共享组容器和自定义框架来访问同一个Core Data存储.现在,在watchOS 2.0的过渡指南中,Apple说:
如果您现有的Watch应用程序和iOS应用程序使用共享组容器或iCloud交换数据,则必须更改watchOS 2中交换数据的方式.由于WatchKit扩展现在可在Apple Watch上运行,因此扩展必须与iOS交换数据app无线.您可以使用NSURLSession对象或使用Watch Connectivity框架来执行此操作,该框架支持iOS应用程序和WatchKit扩展之间的双向通信.
但是,这如何与Core Data一起使用?我是否需要维护两个单独的存储,一个位于手表上的Documents文件夹中,另一个位于手机上,并使用Watch Connectivity框架同步更改?我看到watchOS 2.0可以访问Core Data框架(它位于可用技术列表中)......但是我不确定当商店位于手机上时它会有多大帮助.任何帮助/指导表示赞赏!
对于iOS应用程序,UI更新是专门从主线程完成的 - 不会这样做从不推荐,并且可能导致意外行为.
在watchOS中,操作系统的结构是手表扩展和应用程序 - 作为不同的"容器".通常,从扩展程序调用UI更新,这些更新在应用程序的容器中更新.
相同的主线程逻辑是否适用于从watch扩展更新UI,还是可以从后台调用UI更新?
编辑 - 带来一些清晰度.从应用程序的容器中,UI更新可能应该发生在主线程上(如大多数系统/操作系统中所发生的那样,如下所述).问题是watchOS是否为我们处理,即是否在扩展的后台线程上调用UI更新将自动发布到应用程序容器的主线程中.
我刚刚安装了最新的Xcode测试版来试用Swift 2以及Apple Watch开发部分的改进.
我实际上很难搞清楚为什么这种NSUserDefaults在iOS和Watch OS2之间共享信息的基本方法无法正常工作.
我按照这个循序渐进的教程来检查我是否错过了这个过程中的某些内容,比如打开手机应用程序和扩展程序的同一组,但这就是我得到的:没有.
这是我在iPhone应用程序中为ViewController编写的内容:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var lb_testo: UITextField!
let shared_defaults:NSUserDefaults = NSUserDefaults(suiteName: "group.saracanducci.test")!
var name_data:NSString? = ""
override func viewDidLoad() {
super.viewDidLoad()
name_data = shared_defaults.stringForKey("shared")
lb_testo.text = name_data as? String
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func upgrade_name(sender: AnyObject) {
name_data = lb_testo.text
shared_defaults.setObject(name_data, forKey: "shared")
lb_testo.resignFirstResponder()
shared_defaults.synchronize()
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我在WatchKit的InterfaceController中所拥有的:
import WatchKit
import …Run Code Online (Sandbox Code Playgroud) 归档并将我的应用程序(使用Xcode 7.2.1)上传到iTunes Connect后,我收到来自iTunes Connect的电子邮件说:
无效斯威夫特支持 - 手表OS应用程序在两个/负载/今天的Menu.app/TodaysReactiveMenuWatch.app/TodaysReactiveMenuWatch Extension.appex /框架/和/负载/今天的Menu.app/TodaysReactiveMenuWatch.app/Frameworks/斯威夫特库.从其中一个位置删除所有Swift库,然后重新提交您的应用程序.
我的项目包含iOS应用程序和watchOS应用程序.所有目标都设置了"嵌入式内容包含Swift代码"标志,YES因为我的所有源文件都是用Swift编写的.
我的pod文件包含以下内容:
use_frameworks!
# ignore all warnings from all pods
inhibit_all_warnings!
def shared_pods
pod 'ReactiveCocoa', '4.0.1'
pod 'Alamofire', '~> 3.1.4'
pod 'Unbox', '~> 1.3'
end
target 'TodaysReactiveMenu' do
platform :ios, '9.0'
shared_pods
pod 'Fabric', '~> 1.6.0'
pod 'Crashlytics', '~> 3.4.0'
pod 'PureLayout', '~> 3.0.1'
end
target 'TodaysReactiveMenuTests' do
end
target 'TodaysReactiveMenuWatch Extension' do
platform :watchos, '2.0'
shared_pods
end
Run Code Online (Sandbox Code Playgroud)
我正在使用CocoaPods 1.0.0.beta.4.关于我如何解决这个问题的任何想法?
我一直在摆弄Xcode 7,我知道它只支持Swift 2,并且没有办法在Xcode 7中支持Swift 1.0或1.2.这很好.
现在来看看WatchOS,我可以在Xcode 7中分别为WatchOS1和WatchOS2分别设置两个目标,以便我可以同时支持吗?
我正在查看监视目标和iOS应用目标的构建设置中的部署目标设置,但我只能在列表中看到WatchOS2
我可以在Xcode 7中分别为WatchOS1和WatchOS2支持两个目标吗?如果是这样,我应该在某个地方安装WatchOS1 SDK?或者这完全不可能,如果不是为什么?
如果可以支持两个目标,那么我如何防止两个目标的源重复,因为两个操作系统在体系结构方面存在显着差异.
另外自从推出WatchConnectivity框架以来,iOS对应应用程序也会有一些变化,如何为两个目标维护呢?
我很困惑,我需要迅速做出决定,任何帮助表示赞赏.
我需要在watchOS 2中获取WatchKit App的用户当前位置.我该怎么办?
我一直在互联网上学习很多教程,学习如何设置复杂功能.我按照预期设置并发症没有问题.
直到初始时间表条目到期.12个小时后,我不知道如何更新它以保持并发症的生效.我将分享下面的所有内容,希望有人可以帮我填写.
在这里,我为要在复杂化中显示的数据创建变量.
struct data = {
var name: String
var startString: String
var startDate: NSDate
}
Run Code Online (Sandbox Code Playgroud)
以下数组是此数据的容器.
var dataArray = [data]
Run Code Online (Sandbox Code Playgroud)
这样可以在手表锁定时显示复杂功能.
func getPrivacyBehaviorForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationPrivacyBehavior) -> Void) {
handler(.ShowOnLockScreen)
}
Run Code Online (Sandbox Code Playgroud)
这允许在复杂化上前进时间旅行.
func getSupportedTimeTravelDirectionsForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTimeTravelDirections) -> Void) {
handler([.Forward])
}
Run Code Online (Sandbox Code Playgroud)
在这里,我将时间线的开始时间设置为等于现在.
func getTimelineStartDateForComplication(complication: CLKComplication, withHandler handler: (NSDate?) -> Void) {
handler(NSDate())
}
Run Code Online (Sandbox Code Playgroud)
在这里,我将时间线的结束时间设置为从现在开始等于12小时.
func getTimelineEndDateForComplication(complication: CLKComplication, withHandler handler: (NSDate?) -> Void) {
handler(NSDate(timeIntervalSinceNow: (60 * 60 * 12)))
}
Run Code Online (Sandbox Code Playgroud)
在这里,我创建了复杂的模板.这是为用户在浏览手表上的所有复杂情况时看到我的并发症时显示的样本数据.
func getPlaceholderTemplateForComplication(complication: CLKComplication, withHandler …Run Code Online (Sandbox Code Playgroud)