Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   iOS / iCloud - Dateien aus der Bereitstellung mit "do not back up" markieren (https://www.delphipraxis.net/188378-ios-icloud-dateien-aus-der-bereitstellung-mit-do-not-back-up-markieren.html)

Jef 26. Feb 2016 01:25

Delphi-Version: 10 Seattle

iOS / iCloud - Dateien aus der Bereitstellung mit "do not back up" markieren
 
Hallo Forum,

meine App wurde leider von Apple abgelehnt, weil zu viel content in der iCloud abgelegt wird. Es sind (Audio-)Dateien, die nicht in die iCloud sollen. Sie sollen aber auf jeden Fall offline verfügbar sein.
Das ist die Lösung von Apple: iOS Developer Library - Technical Q&A QA1719

Diese Funktion sollte die "do not back up" Markierung für ausgewählte Dateien ermöglichen (da gibt es einen Delphi Praxis Beitrag zu):
Code:
function SetBackupFlag (AFileName: string; ABackup: boolean): boolean;
var
  URL: NSURL;
  Err: PPointer;
begin
  URL:= TNSURL.Wrap (TNSURL.OCClass.fileURLWithPath (StrToNSStr (AFileName)));
  result:= URL.setResourceValue (TNSNumber.OCClass.numberWithBool(not ABackup),
           StrToNSStr('NSURLIsExcludedFromBackupKey'), err) and (err = nil);
end;
Wie rufe ich diese Funktion korrekt auf? Setze ich die ins Hauptformular und könnte ich die Dateien dann einfach einzeln über FormCreate markieren?
z.B. so:
Code:
SetBackupFlag ( GetHomePath+PathDelim +'Documents'+PathDelim+'dateien'+PathDelim+'audio'+PathDelim + 'Fuss_01.mp3', False );
SetBackupFlag ( GetHomePath+PathDelim +'Documents'+PathDelim+'dateien'+PathDelim+'audio'+PathDelim + 'Fuss_02.mp3', False );
SetBackupFlag ( GetHomePath+PathDelim +'Documents'+PathDelim+'dateien'+PathDelim+'audio'+PathDelim + 'Fuss_03.mp3', False );
...
Würde das schon reichen?

Im oben genannten Beitrag steht
Zitat:

Zitat von Union (Beitrag 1239910)
You can call the function at any time - peferereably within the HandleAppEvent procedure (aeFinishedLaunching).

Wie würde das denn ausschauen?

Jef

Darlo 26. Feb 2016 12:51

AW: iOS / iCloud - Dateien aus der Bereitstellung mit "do not back up" markieren
 
Hi,
Zitat:

Zitat von Jef (Beitrag 1331406)
setze ich die ins Hauptformular und könnte ich die Dateien dann einfach einzeln über FormCreate markieren?

Eigentlich sollte der Flag nur einmal gesetzt werden und nicht jedesmal wenn die App gestartet wird.
Ich würde den Flag setzen sobald die Daten vom Server in die App geladen werden. Wenn Du die Daten nicht von einem Server nachlädst, würde die App aus einem Backup heraus nicht funktionieren, da die Daten ja nicht gesichert worden sind...

Ich gehe davon aus, dass Du die Daten über die Bereitstellung mitlieferst.
Daher

Zitat:

Important: Apps should avoid mingling app data and user data in the same file. Doing so will unnecessarily increase backup sizes and can be considered a violation of the iOS Data Storage Guidelines.
Quelle
Zitat:

Zitat von Jef (Beitrag 1331406)
Das ist die Lösung von Apple: iOS Developer Library - Technical Q&A QA1719

Vielleicht einfach nicht ins Documents-Dir rein, sondern in einen schreibgeschützten Bereich darüber.
Ich würde die Files nur in Documents-Dir mit "do not back up" Flag legen wenn Du diese austauschen können möchtest, ohne dass Du Deine App im Store aktualisieren möchtest...

Gruß

Philip

Jef 26. Feb 2016 13:46

AW: iOS / iCloud - Dateien aus der Bereitstellung mit "do not back up" markieren
 
Hi,

danke für die Antwort.
ja, ich liefere die Dateien über die Bereitstellung mit.
Zitat:

Zitat von Darlo (Beitrag 1331447)
Vielleicht einfach nicht ins Documents-Dir rein, sondern in einen schreibgeschützten Bereich darüber.

Ich dachte das Documents-Dir ist der Projektordner, daher weiß ich nicht, was mit einem schreibgeschützten Bereich darüber gemeint ist. Ich dachte das ist die oberste Ebene.
Gerade steht dieser Remote-Pfad in der Bereitstellung: .\StartUp\Documents\dateien\audio - der ganze audio-Ordner soll nicht in die iCloud.
Wo lege ich den neuen Ordner dann an? Und nutze ich dann immer noch die SetBackupFlag Funktion im FormCreate?

Jef

Darlo 26. Feb 2016 14:29

AW: iOS / iCloud - Dateien aus der Bereitstellung mit "do not back up" markieren
 
Soweit ich die Logik verstehe liegen im Documents-Ordner die Userdaten mit Schreibrecht. Die MP3s sind ja Ressourcen und somit Programmdaten. Und Programmdate sollen wie ich das verstehe nicht in das Dokuments-Verzeichnis. Wahrscheinlich wird dieses als Userdaten in der Cloud gesichert. Wenn die MP3s als Programmdaten abgelegt sind ist es Apple doch egal wie groß die App ist... Gibt ja auch Apps mit paar Hundert MB...

Darlo 26. Feb 2016 15:13

AW: iOS / iCloud - Dateien aus der Bereitstellung mit "do not back up" markieren
 
https://developer.apple.com/library/...mOverview.html

und

https://developer.apple.com/library/...010672-CH2-SW1

und

https://developer.apple.com/library/.../uid/10000051i

Jef 26. Feb 2016 15:31

AW: iOS / iCloud - Dateien aus der Bereitstellung mit "do not back up" markieren
 
Ich habe eine Lösung für dieses Problem von Marco Cantu gefunden. Folgendes Video ab Minute 18:00 bis 19:20.
The Life of an Object Pascal Public Store App

So wie ich das verstanden habe, gibt man den Remote-Pfad in der Bereitstellung als
Delphi-Quellcode:
.\
an und damit wird die Datei direkt ins App-Bundle gesetzt. Sie ist also weit weg von den Userdaten.
Und so kann man die Datei dann laden:
Code:
MediaPlayer1.FileName := (ExtractFilePath(paramstr(0)) + 'Test_01.mp3')
Das Abspielen funktioniert jedenfalls so.
Das scheint mir jetzt die einfachste Lösung zu sein. Sehe ich das richtig so?

Darlo 26. Feb 2016 15:40

AW: iOS / iCloud - Dateien aus der Bereitstellung mit "do not back up" markieren
 
Den ersten Link von mir (https://developer.apple.com/library/...mOverview.html) hast Du Dir aber schon durchgelesen, oder? Erster Eintrag in der Tabelle 1-1:
AppName.app (=Root-Directory = \) : The contents of this directory are not backed up by iTunes
Documents : The contents of this directory are backed up by iTunes

Jef 26. Feb 2016 15:56

AW: iOS / iCloud - Dateien aus der Bereitstellung mit "do not back up" markieren
 
Zitat:

Zitat von Darlo (Beitrag 1331464)
Den ersten Link von mir (https://developer.apple.com/library/...mOverview.html) hast Du Dir aber schon durchgelesen, oder? Erster Eintrag in der Tabelle 1-1:
AppName.app (=Root-Directory = \) : The contents of this directory are not backed up by iTunes
Documents : The contents of this directory are backed up by iTunes

Schön, dass es in Deinem erstem Link bestätigt wird. Vielen Dank, dass Du es rausgesucht hast. Ich hab Cantus Lösung jetzt trotzdem mal gepostet. Vielleicht gibt es ja noch andere wie mich, die öfters mal auf dem Schlauch stehen und sich daher über eine direkte Antwort mehr freuen als über den Link zur Gebrauchsanweisung. ;-)

CHackbart 7. Mai 2016 09:11

AW: iOS / iCloud - Dateien aus der Bereitstellung mit "do not back up" markieren
 
Ich wollte gerade ein älteres Projekt, aktualisiert mit 10.1, in den Store stellen und die App wurde wegen obigen Problem auch zurückgewiesen.
Ich habe in dem Projekt mehrere Dateien (vornehmlich Bilder bzw. eine 5mb große Datenbank) die ich als Resource gelinked habe. Die werden ja automatisch unter iOS im Documents Pfad gespeichert und das wird in die Cloud gestellt. Das ist ziemlich blöde, da ich Bilder ungern in den Formularen hinterlege, sondern lieber als Resource speichere und dann dynamisch einlese. Reicht es, wenn ich SetBackupFlag für die besagten Ressourcen beim Start ausführe - oder gibt es eine andere Methode das zu verhindern?

Christian


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:50 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