UIDocumentInteractionController crasht beim Versand von Bildern per Whats App

  • UIDocumentInteractionController crasht beim Versand von Bildern per Whats App

    Nabend zusammen.

    Ich habe letzte Woche in einer App den Versand von Screenshots per Whats App eingebaut. Das ging völlig problemlos und funktioniert einwandfrei.

    Das gleiche Feature wollte ich heute in eine ältere App einbauen aber sobald mir der UIDocumentInteractionController die Bestätigungsabfrage 'In WhatsApp öffnen' anzeigt und ich per Touch auf das Icon bestätige stürtzt die App ab.

    Hier mal mein Code:

    PHP-Quellcode

    1. - (void)SendViaWhatsApp
    2. {
    3. NSURL *whatsappURL = [NSURL URLWithString:@"whatsapp://app"];
    4. if ([[UIApplication sharedApplication] canOpenURL: whatsappURL])
    5. {
    6. UIImage *iconImage = [ScreenshotHelper captureView:self.view];
    7. NSString *savePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/whatsAppTmp.wai"];
    8. [UIImageJPEGRepresentation(iconImage, 1.0) writeToFile:savePath atomically:YES];
    9. documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:savePath]];
    10. documentInteractionController.UTI = @"net.whatsapp.image";
    11. documentInteractionController.delegate = self;
    12. [documentInteractionController presentOpenInMenuFromRect:CGRectMake(0, 0, 0, 0) inView:self.view animated: YES];
    13. // Das öffnen per [UIApplication sharedApplication] openURL:xyz] funktioniert einwandfrei
    14. // [[UIApplication sharedApplication] openURL: [NSURL URLWithString:@"whatsapp://send?text=Hello%2C%20World!"]];
    15. }
    16. }
    17. - (UIDocumentInteractionController *) setupControllerWithURL: (NSURL*) fileURL
    18. usingDelegate: (id <UIDocumentInteractionControllerDelegate>) interactionDelegate {
    19. UIDocumentInteractionController *interactionController =
    20. [UIDocumentInteractionController interactionControllerWithURL: fileURL];
    21. interactionController.delegate = interactionDelegate;
    22. return interactionController;
    23. }
    Alles anzeigen


    Der Screenshot-Helper funktioniert einwandfrei, damit versende ich auch Screenshots per Email oder poste diese auf Facebook und Twitter. Kein Objekt ist Nil und bis zum bestätigen des Öffnens von WhatsApp gibt es keine Probleme.

    Hat jemand eine Idee wo der Fehler liegen könnte?

    Hier der Crash-Bericht, falls es hilft :):

    libobjc.A.dylib`objc_msgSend:
    0x39c5c5a0: teq.w r0, #0
    0x39c5c5a4: beq 0x39c5c5e6 ; objc_msgSend + 70
    0x39c5c5a6: push.w {r3, r4}
    0x39c5c5aa: ldr r4, [r0]
    0x39c5c5ac: lsr.w r9, r1, #2
    0x39c5c5b0: ldr r3, [r4, #8] < Thread 1: EXC_BAD_ACCESS (code=1, address=0x8)


    Was mir noch aufgefallen ist, wenn ich anstatt 'WhatsApp öffnen' bestätige den Vorgang abbreche friert die App ein. Irgendwie seltsam das Ganze.
    Keine Fehlermeldung, kein Crash aber die App reagierte dann nicht mehr auf Berührung obwohl ein Timer im Hintergrund weiterläuft.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von gyrosp ()

  • Ich hab noch etwas geforscht und hab ne grobe Idee woran es liegen könnte.

    Der ViewController der den UIDocumentInteractionController aufruft ist ein Child-Element eines UIPageControllers, welcher wiederrum ein Child in einem UITabBarControllerist.
    Diese Hierarchie hatte mit schon vorher Probleme bereitet, wenn ich andere ViewController aufrufen wollte aber alles lösbar.

    Ich fürchte das irgendwie die Referenz auf den UIDocumentInteractionController verloren geht, obwohl das eine Property im ViewController ist.
    Das Problem tritt nämlich genauso auf, wenn ich den UIDocumentInteractionController lokal deklariere.

    Gibt es eine sinnvolle Lösung, bzw. ein Best Practise wie ich einen Practise UIDocumentInteractionController aus so einer Hierarchie aufrufe?
  • Das ist an sich völlig normal so.
    Solange wir nicht gerade über die Verwendung innerhalb eines NavigationControllers reden (der seine ViewController per strong Property hält),
    bist normal immer du für die Ownership deiner ViewController zuständig.

    Die View wird durch die View Hierarchie gehalten, aber der View Controller wird dir unten den Füßen weggezogen wenn du dich nichgt um die Speicherverwaltung kümmerst.
    Wäre beim Anzeigen eines ViewControllers über presentModalViewController:animated: auch nicht anders.

    Crashen tut der Spaß dann, weil die Controls im View ja meist Methoden aus dem ViewController aufrufen wollen.
    Ist der nicht mehr da, schlägt dies eben fehl.
  • Tobse001 schrieb:

    Das ist an sich völlig normal so.
    Solange wir nicht gerade über die Verwendung innerhalb eines NavigationControllers reden (der seine ViewController per strong Property hält),
    bist normal immer du für die Ownership deiner ViewController zuständig.

    Die View wird durch die View Hierarchie gehalten, aber der View Controller wird dir unten den Füßen weggezogen wenn du dich nichgt um die Speicherverwaltung kümmerst.
    Wäre beim Anzeigen eines ViewControllers über presentModalViewController:animated: auch nicht anders.

    Crashen tut der Spaß dann, weil die Controls im View ja meist Methoden aus dem ViewController aufrufen wollen.
    Ist der nicht mehr da, schlägt dies eben fehl.

    Stimmt. Wenn man mal darüber nachdenkt, muss es so sein. Hätte ich auch eher drauf kommen können!