我将我的应用更新为最新的swift 2.0语法.这样做,我的Watchkit应用程序已经破产.问题是watchkit app引用了一个引用框架AVFoundation的类.WatchOS2显然现在不再支持一些标准框架:
对基于网络的操作的支持包括以下技术:
WatchKit扩展可以通过NSURLSession对象直接访问网络.WatchKit扩展可以完全访问NSURLSession功能,包括在后台下载文件的功能.有关如何使用此类的信息,请参阅URL加载系统编程指南.Watch Connectivity框架支持Watch应用程序和iOS应用程序之间的双向通信.使用此框架来协调两个应用程序之间的活动.请参阅与您的Companion iOS应用程序通信.
所以现在我无法编译监视工具包代码,因为"没有找到这样的模块"在尝试使用AVFoundation框架时是一条错误消息.我怎样才能解决这个问题,并在我的Apple Watch应用程序中继续引用该类和框架.我应该在手机和手表之间传递数据吗?有没有办法将框架链接到扩展?
我想要做的是以下,在我的InterfaceController中:
override func willActivate() {
super.willActivate()
let defaultsShared = NSUserDefaults(suiteName: "somesharedappgroup")
let defaults = NSUserDefaults.standardUserDefaults()
if let barcodeString = defaultsShared!.objectForKey("barcode") as? String {
if let barcodeContent = RSUnifiedCodeGenerator.shared.generateCode(barcodeString, machineReadableCodeObjectType: AVMetadataObjectTypeCode39Code) {
barcode.setImage(barcodeContent)
label.setText("ID: \(barcodeString)")
} else {
label.setText("Please setup extensions in the settings of SHPID.")
barcode.setImage(nil)
}
} else {
label.setText("Please setup extensions in the settings of SHPID.")
barcode.setImage(nil)
}
}
Run Code Online (Sandbox Code Playgroud)
的RSUnifiedCodeGenerator是利用AVFoundation生成字符串的条形码图像的类.此外,生成器采用的类型是AVObject:AVMetadataObjectTypeCode39Code.这个解决方案在第一个WatchOS中运行良好,但现在在OS 2中仍然存在问题.我看到WatchConnectivity可能是一个解决方案,并且它只是从手机本身传递条形码,但这需要我停止支持iOS 8.对于在WatchOS 2上使用AVFoundation,这是最好的解决方案.如果我不能这样做,我应该怎么做才能在通话时将这个图像从手机传递给手表.谢谢.
我正在开发一个应用程序和一个小部件,小部件需要从app获取数据.我已经使用以下代码在NSUserDefaults上进行读写.我也用于$(PRODUCT_BUNDLE_IDENTIFIER).widget小部件并$(PRODUCT_BUNDLE_IDENTIFIER)参考这篇文章.但是widget无法从app或NSUserDefaults获取数据.我怎样才能使它工作?
func addTask(name: String?) {
let key = "keyString"
tasks.append(name!)
let defaults = NSUserDefaults(suiteName: "group.Mins")
defaults?.setObject(tasks, forKey: key)
defaults?.synchronize()
}
Run Code Online (Sandbox Code Playgroud)
///////
let defaults = NSUserDefaults(suiteName: "group.Mins")
let key = "keyString"
if let testArray : AnyObject = defaults?.objectForKey(key) {
let readArray : [String] = testArray as! [String]
timeTable = readArray
timeTable = timeTable.sort(<)
print("GOT IT")
print("timetable: \(timeTable)")
}
Run Code Online (Sandbox Code Playgroud) 我在cordova中使用window.resolveLocalFileSystemURL来访问文件系统.但是我找不到使用app group获取目录路径的方法.
在IOS中,我可以轻松使用containerURLForSecurityApplicationGroupIdentifier.
干杯
我发现XCode 8存在问题,其中.entitlements文件未针对每个方案正确引用.基本上,我的Debug .entitlements文件正在为我的Release方案引用.这导致了一个问题,因为我们实现了新的Rich推送通知逻辑,并且需要使用App组.
我使用两个不同的团队(开发和生产),因此将有两个特定的应用程序组.
有谁知道如何解决这个问题?
谢谢
entitlements ios code-signing-entitlements ios-app-group xcode8
我试图用来- (NSURL *)containerURLForSecurityApplicationGroupIdentifier:(NSString *)groupIdentifier在iOS 8 b4上的容器应用程序和扩展程序之间保存/加载文件.
这是代码:
NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:groupID];
containerURL = [containerURL URLByAppendingPathComponent:[NSString stringWithFormat:@"Library/Caches/test.txt"]];
NSString* string = @"hihihihihi";
NSError* error;
[string writeToURL:containerURL atomically:YES encoding:NSUTF8StringEncoding error:&error];
NSLog(@"%@",error);
Run Code Online (Sandbox Code Playgroud)
我将此代码放在扩展(自定义键盘)和容器应用程序中.当我在iOS模拟器上运行它时,它们都可以成功保存文件.但是在iOS设备上,扩展程序无法保存文件(而容器应用程序仍然可以)
当扩展程序试图保存文件时,控制台显示可可错误513.
2014-07-31 01:37:49.316 TestExtention [2359:288820] Error Domain = NSCocoaErrorDomain Code = 513"无法完成操作.(Cocoa error 513.)"UserInfo = 0x15df2100 {NSFilePath =/private/var/mobile/Containers/Shared/AppGroup/4FA2DA5E-89C3-4BC3-AA5B-DD869827C5E7/Library/Caches/test.txt,NSUnderlyingError = 0x15df1d90"操作无法完成.操作不允许"}
这是iOS 8扩展的限制吗?
我在配置Xcode配置文件时遇到错误.
供应配置文件$ ProfileName不包含com.apple.security.application-groups权利.
如何解决它.我的配置文件/证书似乎没有一些功能.如何/在哪里添加这些功能?
我们有一个今天的小部件,根据相应应用程序中的数据设置,最多显示6个按钮.此数据使用app-groups共享.如果至少配置了一个按钮,它将显示如上图所示.如果用户未登录,或者未配置任何按钮,则会显示如下图所示的消息.
在未打开应用程序几个小时(大约4到7之间)之后,窗口小部件将恢复为"未配置按钮"视图.
从app-group加载数据的方式是使用如下所示的代码完成的.(完整代码的要点)在我编写它的方式中,可以显示"无按钮配置"视图的唯一方法是buttons数组是否实际存在但长度为零.
我期望缓存清除或后台服务停止,但据我所知,应该更早地捕获异常:
userDefaults则应为nil,因此应显示"Not logged in in view".buttons则应为nil,因此应再次显示"未登录视图"考虑到应用程序在后台不执行任何操作,应用程序本身无法更改按钮.
我尝试连接调试器时再现这个,但问题不会重现.
有没有人对如何解决这个问题或如何开始调试这一点有任何想法?
相关文件:
相关代码:
private struct sharedData {
static var baseUrl: String?
static var token: String?
static var phoneDeviceId: String?
static var buttons: Array<Button>?
}
func loadData() {
let groupIdentifier = "group." + NSBundle.mainBundle().bundleIdentifier!
var groupIdArray = groupIdentifier.componentsSeparatedByString(".")
groupIdArray.removeAtIndex(groupIdArray.count - 1)
let appGroupIdentifier = groupIdArray.joinWithSeparator(".");
let userDefaults = NSUserDefaults.init(suiteName: appGroupIdentifier)
if (userDefaults == nil) {
print("Error …Run Code Online (Sandbox Code Playgroud) 这在watchOS 1上不是问题,但现在在watchOS 2上我无法读取手表扩展上的值.
根据Apple文档,这是可能的.根据这个帖子的一些人的说法,这是可能的.根据这个线程上的Apple员工的说法,这是可能的.
据我所知,我正确地设置了所有内容:
ApplicationGroupContainerIdentifier为plist 添加了相同的标识符当我NSUserDefaults使用标识符作为套件名称初始化对象时,我无法读取监视扩展名上的值.我可以在iOS应用程序上阅读它们.这发生在模拟器和真实设备中.
请不要发布有关如何使用Watch Connectivity执行此操作的答案.只有在没有Watch Connectivity的watchOS 2上的共享应用程序组才能实现这一点,人们可以做到这一点,而这里直接来自文档:
在watchOS 2中,您的WatchKit扩展可能会读取首选项的值,但您无法编写新值.watchOS 2中的首选项从iOS转发到Apple Watch,但您所做的任何修改都不会发送回iOS.
当我启动MacOS应用程序时,我可以在控制台上看到错误
com.myAppBundle: Unsatisfied entitlements: com.apple.security.application-groups
Disallowing: com.myAppBundle
Run Code Online (Sandbox Code Playgroud)
但是,似乎该应用程序工作正常,我确实有权利文件与这些值:
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>$(TeamIdentifierPrefix)group</string>
</array>
Run Code Online (Sandbox Code Playgroud)
那么为什么我会收到"不满意的权利"错误?
编辑:
对于iOS应用程序,除了功能选项卡之外,还需要在Apple Developer帐户中添加应用程序组.但OSX应用程序没有这样的选项
我知道如何使用XCode 6的Devices窗口下载和替换特定iOS应用程序的文件系统容器.
但是对于我正在开发的应用程序,我需要能够下载和替换共享的AppGroup容器以进行调试.这将使我能够模拟AppGroup文件夹内容中的情况以进行测试.
任何人都可以告诉我如何做到这一点?可能吗?
更新:我应该澄清这是用于在真实的iOS设备上进行测试.使用iOS模拟器时,我已成功修改AppGroup文件夹 - 因为可以通过Finder/Mac的文件系统直接访问这些文件夹.
ios-app-group ×10
ios ×8
swift ×3
xcode ×3
entitlements ×2
swift2 ×2
watchkit ×2
cordova ×1
ios8 ×1
iphone ×1
macos ×1
objective-c ×1
sandbox ×1
xcode8 ×1