Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Prism Objective-C Callback (https://www.delphipraxis.net/175849-objective-c-callback.html)

jensw_2000 23. Jul 2013 22:34

Objective-C Callback
 
Nabend,

ist zufällig jemand anwesend der ein bisschen Objektive-C spricht?

Die EKEventStore Instanzmethode
Code:
- (void)requestAccessToEntityType:(EKEntityType)entityType completion:(EKEventStoreRequestAccessCompletionHandler)completion
erwartet im completion Parameter eine Callback Methode.

Dies ist die Deklaration des Callbacks:
Code:
typedef void (^EKEventStoreRequestAccessCompletionHandler)(BOOL granted, NSError *error);
Wie könnte das unter Delphi / Oxygene aussehen?

Das will irgendwie noch nicht so richtig ...
Delphi-Quellcode:
type
      callback = procedure (granted:BOOL; error:NSError);

EgonHugeist 23. Jul 2013 22:56

AW: Objective-C Callback
 
type
PNSError = ^NSError;
callback = procedure (granted:WORDBOOL; error: PNSError); CDECLS/stdcall? welche call convention?

jensw_2000 23. Jul 2013 23:13

AW: Objective-C Callback
 
Zitat:

Zitat von EgonHugeist (Beitrag 1222429)
CDECLS/stdcall? welche call convention?

Ist keine Lib, sondern ein Framework, das direkt gekinkt wird.

Ich glaube ich bin auch auf dem Holzweg.
Der Type EKEventStoreRequestAccessCompletionHandler ist offensichtlich bereits deklariert.
http://developer.apple.com/library/ios/#documentation/EventKit/Reference/EKEventStoreClassRef/Reference/Reference.html%23//apple_ref/occ/instm/EKEventStore/requestAccessToEntityType:completion:


So sieht das Aufruf unter Obj-C aus ...

Code:
[eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted,NSError* error){
           
            //Access not granted-------------
            if(!granted){
 
            }
           
            //Access granted------------------
            }else{
 
                        }
 }];

jensw_2000 24. Jul 2013 01:11

AW: Objective-C Callback
 
Hab's herausgefunden.

Für die Nachwelt ...
Falls ihr mal aus Oyxgene oder Firemonkey auf den "Kalenderspeicher" (EKEventStore) des iPhones zugreifen wollt und euch freut, dass im Simulator alles schick läuft, dann testet eure App mal auf dem Device. iOS 6.0 oder höher lässt die App crashen, wenn sie keine Frage an den Benutzer stellt, ob auf den Kalender zugegriffen werden darf..

Im Kern formuliert man die Abfrage mit Pascal wir folgt.
(Sollte man natürlich noch ein bisschen ausschmücken.)

Code:
var callback:EKEventStoreRequestAccessCompletionHandler :=
             procedure (granted:Boolean;error:NSError)
             begin
               if not assigned(error) then begin
                  if granted then NSLog('EKEventStore Access >> Access granted') else // alles supi
                  NSLog('EKEventStore Access >> Access blocked'); // ggf App kontrolliert beenden
                end
                else
                  NSLog('%@',error);
             end;

      _eventStore.requestAccessToEntityType(EKEntityType.EKEntityTypeEvent) completion(&callback);

Medium 24. Jul 2013 08:16

AW: Objective-C Callback
 
Ich würde die App bei Nichtgewährung der Rechte keinesfalls beenden. Die netten Apple-Bestimmungen für den Store besagen unter anderem, dass eine App funktionieren muss, egal ob sie ihre Rechte bekommt oder nicht. Vor dem Hintergrund wäre es vermutlich besser, dem User mitzuteilen, dass dieser Programmteil ohne die Rechte nicht geht (alles andere muss aber weiterhin gehen!). Wenn das jeweilige Recht nötig für die einzige bzw. alle Funktionen ist, dann auch einen Hinweis, aber App laufen lassen, und fein säuberlich alle Operationen dagegen absichern, dass sie crashen wenn die verweigerte Funktionalität benutzt werden soll. Je nach dem ein Höllenaufwand, aber der Apfel befiehlt es.

jensw_2000 24. Jul 2013 08:33

AW: Objective-C Callback
 
Jepp. Darum schrieb ich "Sollte man noch ausschmücken".
Wollte mir nur Tipparbeit sparen.
Aber bitte :wink::

In der Live App prüfe ich erstmal ob der EventStore überhaupt "requestAccessToEntityType" unterstützt. Könnte ja auch iOS kleiner 6.0 sein.
Dann hole ich mir den aktuellen Authentifizierungsstatus mit "var authStat := EKEventStore.authorizationStatusForEntityType(EKEn tityType.EKEntityTypeEvent);" und prüfe ab, ob der User die App bereits berechtigt hat.
Falls nicht, prüfe ich die verbleibenden 3 Zustände ("User wurde noch nie gefragt", "User hat den Zugriff nicht gewährt" und "User kann den Zugriff auf Grund von Restrictions nicht freigeben") und reagiere beim Aufruf der Kalenderfunktionen mit einer entsprechenden UIAlert Message bzw. mit der obigen Authentifizierungsabfrage.

Den EKEventStore halte ich in einer ShardInstance in einer "public static class". Somit laufen alle Aufrufe immer durch die obige Logik.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 Uhr.

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