2014-09-23 105 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