2014-09-23 62 views
5

我们在我们的应用程序中使用Dropbox Datastore API,并且它可以正常工作。我们决定在我们的应用中添加一个iOS8小部件。但我们无法从中访问应用程序数据存储。 我们遵循Datastore API安装指南,不同之处在于您无法将URL架构添加到小部件。 什么是问题?从iOS8小部件访问Dropbox数据存储

更新1

当下面的代码(在小部件)运行时,它返回nil:

DBAccount *account = [[DBAccountManager sharedManager] linkedAccount]; 

所以我想的Dropbox SDK无法检索验证数据,它救了当主机应用程序完成身份验证时。 dropbox在哪里保存这些信息?在钥匙串?我可以从主机应用程序获取访问令牌并直接在小部件中使用它吗?因为小部件可以显示UIViewController进行身份验证。

UPDATE 2

我读收存箱核心API的源代码。看来Dropbox将认证信息保存在钥匙串中。所以我为主机应用程序和小部件设置了一个钥匙串组。我测试了它们,并且它们都可以在同一个钥匙串上读写。但仍然[]上的[[DBAccountManager sharedManager] linkedAccount]返回null,并在主机应用程序返回链接帐户!

+0

交联供参考:https://forums.dropbox.com/topic.php?id=120869 – Greg 2014-09-23 16:27:03

+0

有没有发现什么好的解决办法吗?如果你这样做,我会非常感兴趣! – jasonIM 2014-12-03 17:51:09

回答

3

设置钥匙串组是第一步能够从您的扩展中使用Dropbox帐户,但是您还必须在DBKeychain-iOS.m中进行修改!

默认情况下,它将kSecAttrService设置为使用应用程序的包标识符构建的东西!

在你的主应用程序中将是“com.coybit.myapp”,但在你的扩展中它将是“com.coybit.myapp.extensionName”!

可以硬编码kSecAttrService值com.coybit.myapp.dropbox.auth或使用一种方法,其将仅保持该束标识符的第一3种元素构建kSecAttrService:

+ (NSString *)mainBundleName 
{ 
    // Always return main application bundle name (for app extensions, remove last component) 
    NSMutableArray *components = [NSMutableArray arrayWithArray:[[[NSBundle mainBundle] bundleIdentifier] componentsSeparatedByString:@"."]]; 
    while ([components count] > 3) { 
     [components removeLastObject]; 
    } 
    return [components componentsJoinedByString:@"."]; 
} 

初始化函数然后将看起来像:

+ (void)initialize { 
    if ([self class] != [DBKeychain class]) return; 
    NSString *keychainId = [NSString stringWithFormat:@"%@.dropbox.auth", [self mainBundleName]]; 
    kDBKeychainDict = [[NSDictionary alloc] initWithObjectsAndKeys: 
         (id)kSecClassGenericPassword, (id)kSecClass, 
         keychainId, (id)kSecAttrService, 
#if TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR 
         @"keychain_access_group_name",(id)kSecAttrAccessGroup, 
#endif 
         nil]; 
} 
+0

这将使扩展本身完全访问?就像做'DBRecord'的改变会立即反映到其他客户端上?如果我从扩展中进行数据存储更改,我也怀疑hosp应用程序被视为另一个客户端。我希望我们有一些官方指导。 – jasonIM 2014-11-24 08:12:24

+1

我没有使用DBRecord,但如果你想做一些测试,你可以看看我的应用程序!它可以在AppStore上免费获得:https://itunes.apple.com/us/app/nastify/id917241569?mt=8,应用程序的源代码可以在这里找到:https://github.com/sylverb/ NASCES。基本上主要的应用程序和应用程序扩展将在那之后共享相同的本地数据! – Sylverb 2014-11-25 08:55:24

+0

感谢您的回复。我必须找到一种方法从dropboxSDK.framework获取源文件,并可能更改这些值。感谢您的指导。我希望在iOS8上的Dropbox上有更多的帮助。 @smarx。 – jasonIM 2014-12-03 17:50:23