2014-09-23 8 views
5

Wir verwenden Dropbox Datastore API in unserer Anwendung und es funktioniert ordnungsgemäß. Wir haben uns entschieden, unserer App ein iOS8-Widget hinzuzufügen. Aber wir können nicht auf den App-Datenspeicher zugreifen. Wir haben den Installationsleitfaden für die Datastore-API befolgt, mit der Ausnahme, dass Sie kein URL-Schema zu einem Widget hinzufügen können. Was ist ein Problem?Zugriff auf Dropbox-Datenspeicher von iOS8 Widgets

UPDATE 1

Wenn der Code unten (im Widget) läuft, gibt sie nil:

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

So denke ich, Dropbox SDK kann nicht Retrieval-Authentifizierungsdaten, die sie gespeichert hat wenn die Authentifizierung in der Host-App erfolgt. Wo speichert Dropbox diese Informationen? Im Schlüsselbund? Kann ich ein Zugriffstoken von der Host-App erhalten und direkt im Widget verwenden? Weil Widgets einen UIViewController für die Authentifizierung anzeigen können.

UPDATE 2

las ich Dropbox Core-API-Quellcode. Es scheint, Dropbox speichert Authentifizierungsinformationen im Schlüsselbund. Also habe ich eine Schlüsselbundgruppe für Host-App und Widget festgelegt. Ich habe getestet und beide können auf demselben Schlüsselbund lesen und schreiben. Aber immer noch [[DBAccountManager sharedManager] linkedAccount] auf dem Widget gibt null und auf der Host-App zurück verknüpften Konto!

+0

Vernetzungs Referenz: https://forums.dropbox.com/topic.php?id=120869 – Greg

+0

noch keine gute Lösung gefunden? Ich wäre sehr interessiert, wenn du es tätest! – jasonIM

Antwort

3

Das Setzen einer Schlüsselbundgruppe war der erste Schritt, um den Dropbox-Account von Ihrer Erweiterung zu verwenden, aber Sie müssen auch eine Änderung in DBKeychain-iOS.m vornehmen!

Standardmäßig setzt kSecAttrService auf etwas, das mit dem Paket-Bezeichner der Anwendung erstellt wurde!

In Ihrer Haupt-App wird es "com.coybit.myapp" sein, aber in Ihrer Erweiterung wird es "com.coybit.myapp.extensionName" sein!

Sie können die kSecAttrService Wert codieren, ein Verfahren com.coybit.myapp.dropbox.auth oder zu verwenden, die nur die ersten 3 Elemente des Bündels Identifikator kSecAttrService halten zu bauen:

+ (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:@"."]; 
} 

Die Initialisierungsfunktion wird sieht dann aus wie:

+ (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

Dies wird den vollständigen Zugriff von Erweiterungen selbst ermöglichen? Wie würde eine "DBRecord" -Änderung sich sofort auf andere Kunden auswirken? Ich frage mich auch, ob die Hosp-App als ein anderer Client behandelt wird, wenn ich Datastore-Änderungen von der Erweiterung vorgenommen habe. Ich wünschte, wir hätten eine offizielle Anleitung. – jasonIM

+1

Ich benutze DBRecord nicht, aber Sie können sich meine App ansehen, wenn Sie einige Tests machen möchten! Es ist kostenlos im AppStore verfügbar: https://itunes.apple.com/us/app/nastify/id917241569?mt=8 und der Quellcode der Anwendung ist hier verfügbar: https://github.com/sylverb/ NAStify. Grundsätzlich teilen sich die Haupt-App und die App-Erweiterung danach dieselben lokalen Daten! – Sylverb

+0

danke für deine antwort. Ich müsste einen Weg finden, um die Quelldateien von dropboxSDK.framework zu bekommen und wahrscheinlich diese Werte zu ändern. Danke für deine Hilfe. Ich wünschte, es gäbe mehr Hilfe von Dropbox auf Erweiterungen auf iOS8. @smarx. – jasonIM