Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi iOS: Dateien in iCloud Drive speichern (https://www.delphipraxis.net/205445-ios-dateien-icloud-drive-speichern.html)

philipp.hofmann 10. Sep 2020 12:48

iOS: Dateien in iCloud Drive speichern
 
Hi,

ich habe es dank
https://www.delphipraxis.net/199998-...d-lesen-3.html
geschafft, dass meine App jetzt Dateien in der iCloud speichert. Diese sind aber ja noch App-spezifisch abgelegt. Ich möchte aber von einem Browser auf diese Dateien zugreifen.
Daher muss ich die Dateien im iCloud Drive abspeichern, da man nur dort mit mehreren Apps an der gleichen Datei arbeiten kann (https://support.apple.com/de-de/HT201104).

Wie funktioniert dies? Muss man dazu "nur" den Pfad anders ermitteln?
Dies mache ich aktuell folgendermaßen:

Delphi-Quellcode:
class function TFileUtils.getAppSharedDownloadsPath():String;
{$IFDEF IOS}
  var
    nsFile: NSFileManager;
    URL: NSURL;
{$ENDIF}
begin
  {$IFDEF IOS}
    nsFile := TNSFileManager.Wrap(TNSFileManager.OCClass.defaultManager);
    URL := nsFile.URLForUbiquityContainerIdentifier(nil);
    if (URL <> nil) then
      Result := UTF8ToString(URL.path.UTF8String)
    else
      Result := '';
  {$ELSE}
    {$IFDEF MSWINDOWS}
      result:=GetEnvironmentVariable('USERPROFILE')+'\Downloads';
    {$ENDIF}
    {$IFDEF MACOS}
      result:=System.IOUtils.TPath.getDownloadsPath();
    {$ENDIF}
    {$IFDEF ANDROID}
      result:=System.IOUtils.TPath.getSharedDownloadsPath();
    {$ENDIF}
  {$ENDIF}
end;
Grüße, Philipp

Rollo62 10. Sep 2020 14:46

AW: iOS: Dateien in iCloud Drive speichern
 
Vielleicht hilft Dir das weiter ?
https://dev.to/nemecek_f/ios-saving-...lemanager-4kpm
https://medium.com/ios-os-x-developm...s-1a46b5706fe1

philipp.hofmann 10. Sep 2020 16:10

AW: iOS: Dateien in iCloud Drive speichern
 
Das mit der Erweiterung der info.plist hatte ich auch schon an anderer Stelle gefunden, dass ich den Pfadnamen um /Documents verlängern muss, noch nicht.
Ich sehe die Dateien aber weiterhin nur in der App-iCloud und nicht in iCloud Drive.

Wobei ich zugeben muss, dass ich auch den Pfad etwas hemdsärmlig um /Documents verlängert habe und nicht per

Zitat:

The appendingPathComponent("Documents") is very important bit and without it your folder will not show inside iCloud Drive (which you can quickly verify via Files app in iOS).
Zitat:

if let iCloudDocumentsURL = NSFileManager.defaultManager().URLForUbiquityConta inerIdentifier(nil)?.URLByAppendingPathComponent(" Documents") {
if (!NSFileManager.defaultManager().fileExistsAtPath( iCloudDocumentsURL.path!, isDirectory: nil)) {
NSFileManager.defaultManager().createDirectoryAtUR L(iCloudDocumentsURL, withIntermediateDirectories: true, attributes: nil, error: nil)
}
}
Diese Methode steht bei NSURL leider so einfach nicht zur Verfügung. Ich weiß jetzt nicht, ob dies den Unterschied ausmacht.
Genauso weiß ich nicht, ob der Part von "Adding capability" von Delphi via XCode korrekt erledigt wird.

Rollo62 10. Sep 2020 16:15

AW: iOS: Dateien in iCloud Drive speichern
 
Zitat:

Zitat von philipp.hofmann (Beitrag 1473404)
Zitat:

if let iCloudDocumentsURL = NSFileManager.defaultManager().URLForUbiquityConta inerIdentifier(nil)?.URLByAppendingPathComponent(" Documents") {
if (!NSFileManager.defaultManager().fileExistsAtPath( iCloudDocumentsURL.path!, isDirectory: nil)) {
NSFileManager.defaultManager().createDirectoryAtUR L(iCloudDocumentsURL, withIntermediateDirectories: true, attributes: nil, error: nil)
}
}
Diese Methode steht bei NSURL leider so einfach nicht zur Verfügung.
Genauso weiß ich nicht, ob der Part von "Adding capability" von Delphi via XCode korrekt erledigt wird.

Ich denke dafür ist der NSFileManager zuständig, dort wird die URL vom Container erzeugt.
Deshalb soll man auch asynnchron Warten bis es wirklich erzeugt ist, weil beim 1. Mal das wohl länger dauern kann.

Die Capabilities muss mman vielleicht im iTines Connect (oder wie das jetzt heisst) einstellen, und sich da womöglich wieder ein Zertifikat holen.
Ich denke das ist ähnlich wie bei PushNotifications.

philipp.hofmann 10. Sep 2020 17:23

AW: iOS: Dateien in iCloud Drive speichern
 
Ich habe mal alles deinstalliert und gelöscht und von vorne begonnen und den Code gerade gezogen.
Leider bleibt es noch dabei, in der iCloud sind die Daten, aber nicht in iCloud Drive.
Da werde ich noch ein wenig Jugend forscht betreiben müssen:

Delphi-Quellcode:
class function TFileUtils.getAppSharedDownloadsPath():String;
{$IFDEF IOS}
  var
    nsFile: NSFileManager;
    URL: NSURL;
{$ENDIF}
begin
  {$IFDEF IOS}
    nsFile := TNSFileManager.Wrap(TNSFileManager.OCClass.defaultManager);

    URL:=nsFile.URLForUbiquityContainerIdentifier(nil);
    if (URL <> nil) then
    begin
      URL:=URL.URLByAppendingPathComponent(StrToNSStr('Documents'));
      Result := UTF8ToString(URL.path.UTF8String);
      if (not nsFile.fileExistsAtPath(URL.path,nil)) then
      begin
        mlog.info('create new iCloud directory: '+result);
        if (nsFile.createDirectoryAtURL(URL,true,nil,nil)) then
          mlog.info('Created new iCloud directory '+result)
        else
          mlog.info('Can´t creat new iCloud directory '+result);
      end else
        mlog.info('iCloud directory exists yet '+result);
    end else
      Result := '';
  {$ELSE}
    {$IFDEF MSWINDOWS}
      result:=GetEnvironmentVariable('USERPROFILE')+'\Downloads';
    {$ENDIF}
    {$IFDEF MACOS}
      result:=System.IOUtils.TPath.getDownloadsPath();
    {$ENDIF}
    {$IFDEF ANDROID}
      result:=System.IOUtils.TPath.getSharedDownloadsPath();
    {$ENDIF}
  {$ENDIF}
end;
und das neue Zertifikat ist für die iCloud an sich schon notwendig. Das sollte eigentlich alles passen.

Rollo62 10. Sep 2020 17:30

AW: iOS: Dateien in iCloud Drive speichern
 
Ich hatte ja irgendwo gelesen das in dem iCloud Drive die App dann einen Folder mit dem Namen der App anlegt, wo die Daten dann drinstehen sollten.
Kann man sowas im iCloud Driver erkennen ?

Vielleicht macht es auch Sinn einfach mal ein kleines XCode Projekt anzulegen und nach den Anleitungen aufzubauen, um zu sehen was da Alles gesetzt wird.

Ja die Jugend soll meinetwegen forschen, ich bin da langsam zu alt für :-D

philipp.hofmann 10. Sep 2020 17:43

AW: iOS: Dateien in iCloud Drive speichern
 
Nein, leider sehe ich meine App im iCloud Drive noch überhaupt nicht und ja, dies würde ich laut den Beschreibungen eigentlich erwarten. Vielleicht hat es noch etwas damit zu tun, dass die App natürlich im Entwickler-Modus läuft. Daher werde ich es mal so hochladen und in der "echten" Version anschauen.

Ich sehe zumindest in iExplorer auf meinem Mac ausgeführt, dass meine Cloud auf dem iPad unter
/Users/philipp/Library/Mobile Documents/icTrainer
liegt und in der App wird
/private/var/mobile/Library/Mobile Documents/iCloud~de~ictrainer/Documents
ausgegeben.

philipp.hofmann 14. Sep 2020 09:21

AW: iOS: Dateien in iCloud Drive speichern
 
So, ich bin eine Runde weiter. Jetzt sehe ich sowohl bei der über den AppStore installierten, als auch über Delphi installierten Version die Dateien in iCloud Drive. Ich vermute dies geht jetzt, weil die neue Version mit dem iCloud-Zugriff erstmalig über AppStoreConnect hochgeladen wurde.

Wermutstropfen am Morgen: Die Dateien sind im Browser ausgegraut, d.h. nicht auswählbar. Dann muss ich mir dies noch anschauen.

philipp.hofmann 14. Sep 2020 11:22

AW: iOS: Dateien in iCloud Drive speichern
 
Ok, das ausgegraute scheint ein Problem der Garmin-Website unter iOS zu sein. Auf der Strava-Website kann ich das File auswählen. Also doch alles gut.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz