我正在iOS 8测试版上开发一个自定义键盘,我想告诉用户如果我的自定义键盘没有启用,如何在包含app中启用它,有没有办法检测到应用程序扩展已启用?
我正在尝试在我的应用程序和自定义键盘扩展之间共享数据.我在主应用程序目标和自定义键盘目标中打开了App Groups.在我的主应用程序中,我添加了一个具有以下内容的对象:
NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.mycompany.myapp"];
[userDefaults setObject:someObject forKey:@"KEY"];
Run Code Online (Sandbox Code Playgroud)
在控制台中打印出[userDefaults dictionaryRepresentation]会显示该对象已被保存,调用[userDefaults objectForKey:@"KEY"]也是如此.
但是,当我尝试在自定义键盘扩展中访问此对象时:
NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.mycompany.myapp"];
NSString *value = [userDefaults objectForKey:@"KEY"];
Run Code Online (Sandbox Code Playgroud)
值为nil,对[userDefaults dictionaryRepresentation]的调用不会显示上面保存的条目.我正在使用Xcode 6 beta 3.有什么想法吗?
更新已 在Xcode 6 beta 5中修复
UIViewController的InterfaceOrientation已弃用且Document建议使用[[UIApplication sharedApplication] statusBarOrientation],但iOS 8的扩展中没有sharedApplication.
正如@Retro所提到的,在大多数情况下,您可以使用self.traitCollection.verticalSizeClass或self.traitCollection.horizontalSizeClass在UIViewController中获取方向信息.
问题
大多数情况下,当我尝试调试自定义键盘扩展时,我收到以下错误,然后键盘消失(可能是崩溃,所以系统将其从屏幕中删除并用标准键盘替换它)
plugin com.db.Trype.TrypeKeyboard interrupted
Run Code Online (Sandbox Code Playgroud)
(注意:Trype是键盘的名称.)
处理
我按以下方式调试键盘:
TrypeKeyboard方案以在启动时运行我的app可执行文件.我尝试过不同版本的Xcode-Beta,并尝试重新启动模拟器,计算机等,所有这些都取得了不同程度的临时成功.
其他人遇到此错误并有建议吗?
更新:这是随附的错误消息.也许有一些方法可以打印出更多的UserInfo?
viewServiceDidTerminateWithError:: Error Domain=_UIViewServiceInterfaceErrorDomain Code=3
"The operation couldn’t be completed. (_UIViewServiceInterfaceErrorDomain error 3.)"
UserInfo=0x7fc99c900a50 {Message=Service Connection Interrupted}
Run Code Online (Sandbox Code Playgroud) 我正在swift中创建一个具有Notification Center小部件的iOS应用程序.
但是,我希望该应用程序能够在iOS 7上运行.如果我有小部件,我可以在iOS 7上运行应用程序(使用主应用程序,但不能运行小部件)或者我是否必须创建没有小部件的iOS 7版本?
我正忙着为我的应用创建iOS 8 Today扩展程序.我想从我的扩展程序访问我的SQLite(而非Core Data)数据库.在网上搜索一下后,我发现我需要一个App Group.所以我为我的应用程序创建了一个名为"group.AppName"的应用程序组.
使用以下代码,我在NSDocumentDirectory中创建一个SQLite数据库.但App Extensions无法访问NSDocumentDirectory.这就是我想在我的应用程序组中保存SQLite数据库的原因.
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [path objectAtIndex:0];
dbPathString = [docPath stringByAppendingPathComponent: @"dbName.db"];
char *error;
NSFileManager *fileManager = [NSFileManager defaultManager];
if(![fileManager fileExistsAtPath:dbPathString])
{
const char *dbPath = [dbPathString UTF8String];
if(sqlite3_open(dbPath, &treinAppDB) == SQLITE_OK)
{
const char *sql_stat = "CREATE TABLE IF NOT EXISTS table (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, code TEXT, lat TEXT, lon TEXT)";
sqlite3_exec(appDB, sql_stat, NULL, NULL, &error);
sqlite3_close(appDB);
}
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何在我的应用程序组中创建此数据库,因此我可以从我的今日扩展程序访问该数据库.
任何人都可以帮我解决这个问题吗?那太好了!
为了通过Apple的新Test Flight服务分发应用程序,beta-reports-active需要提供密钥.目前我正在使用Apple的bot服务器分发到旧的Test Flight系统和Ad Hoc分发配置文件.使用post build触发器我想archive创建它并创建一个App Store Distribution ipa,我可以上传到iTunes Connect.我写了一个脚本来做到这一点.我使用xcrun命令来构建:
/usr/bin/xcrun -sdk iphoneos PackageApplication -v "${APP}" -o "${APP_STORE_IPA}" --sign "${SIGNING_IDENTITY}" --embed "${PROVISIONING_PROFILE}"
这些SIGNING_IDENTITY和PROVISIONING_PROFILE都是应用商店分发证书/配置文件.因此,配置文件嵌入了ipa它并包含beta-reports-active标志.但是,当我查看ipa验证其权利时,它不存在.
我究竟做错了什么?我在此看到的所有信息刚刚建议重新生成配置文件.我已经这样做了,知道钥匙存在.它没有被添加到权利中.我有一个小部件也被捆绑在ipa中.我不是在辞职.
xcode continuous-integration ios provisioning-profile ios-app-extension
在阅读Apple文档并检查stackoverflow之后,我无法完全理解是否可以以编程方式调用"Action"或"Share"类型的特定应用程序扩展.
主要是,我已经构建了一个类型为"Action"的应用程序扩展,我想从第二个应用程序以编程方式调用它(所以我可以发送一些输入属性并从扩展中获取输出),而无需打开UIActivityViewController.
有什么办法吗?
我正在创建具有Todays Widget的应用程序.当我去Xcode并开始新项目时,我没有看到"应用程序扩展"的选项请查看下面的截图.

我使用Xcode版本6.3

请帮我看看如何启用应用程序扩展选项
对于教程,我指的是以下链接
谢谢大家从下面的评论中得到了我的答案的解决方案.
我一直在研究如何安全地在应用程序之间共享数据.在使用错误的方法深入研究实现之前,我想获得一些正确的处理方法的信息.只是因为你可以做某事并不一定意味着你应该做.
用户案例:我正在开发一套语言学习应用程序,它们具有数百个音频文件的共享音频文件,以及包含与语言相对应的重要数据的json文件.我更愿意允许用户在我们的套件中使用其他应用时不必重新下载语言包.
1.应用扩展程序 - 文档提供程序非UI变体
根据文件:
文件提供程序扩展使用打开和移动操作授予对主机应用程序沙箱外部文件的访问权限.此扩展(有时缩短到文件提供程序)还允许主机应用程序下载文件而不显示文档选择器视图控制器.此功能允许主机应用程序使用安全URL书签访问以前打开的文档,即使这些文件不再存储在设备上也是如此.
从表面上看,这似乎是一个非常可靠的解决方案.我主要担心的是最后几行,它表明应用程序可以下载不再存储在设备上的文件.我希望文件存储在设备本地,以防止不断下载.如果文档提供程序确实在本地存储文件并允许组中的各种应用程序访问文件,那么我认为这可行.
2.共享钥匙串访问
允许您将数据安全地存储到共享密钥链,以便属于一组应用程序的其他应用程序可以访问.共享密钥链访问权限的所有应用程序必须使用相同的应用程序ID前缀.有关共享密钥链访问的示例.
我看了一下这个文档,我认为这可能是最合适的.我对此解决方案的主要关注是上传的数据是否存在大小限制,以及是否允许使用mp3/ogg/json文件类型.我在这个解决方案中发现的大多数示例/用途都指向共享字符串和小数据,我不确定它是否会处理像json或音频文件这样的大数据.
我还发现这个回购显然更容易处理Keychain:
3.定制粘贴板
自定义粘贴板最适合在两个应用程序之间半私有地共享自定义数据.使用唯一名称标识自定义粘贴板.它们可以将数据保留在创建它们的应用程序之外,允许粘贴板在应用程序终止后或甚至在重新启动设备后保留数据.
在粘贴板上写入数据或从中读取数据时,必须指定粘贴板类型.粘贴板类型通常使用统一类型标识符(UTI)来标识进入粘贴板并从粘贴板检索的数据类型.有关其他信息,请参阅Apple的UIPasteboard类参考文档.
以上文档摘自这篇文章
我对这个解决方案的主要关注点可能是它有点像黑客.从逻辑上讲,粘贴板似乎是临时保存数据并允许在应用程序之间共享的东西,而我正在寻找的解决方案需要更多的永久解决方案.
我很感激有关在应用之间共享这些类型文件的最佳做法的任何信息.我假设有很多其他的解决方案我在这里省略了,所以如果有更好的选择,我会喜欢它的一些信息.如果它发生了我在这里列出的解决方案之一是一个解决这个问题的好方法我想更多地了解你与他们合作的经验,如果我对他们的关注是有效的,或者没有什么可担心的.
Thx提前.一如既往,写得很好的答案得到了投票;)
ios ×7
ios8 ×6
swift ×3
iphone ×2
xcode ×2
action ×1
data-sharing ×1
ios7 ×1
keyboard ×1
keychain ×1
objective-c ×1
sqlite ×1
uipasteboard ×1
widget ×1
xcode6 ×1