Bilder Sharen / Speichern --> UIActivityViewController mit UIActivityItemProvider “vergisst” Bilder

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Bilder Sharen / Speichern --> UIActivityViewController mit UIActivityItemProvider “vergisst” Bilder

    Hallo !
    Ich habe ein Projekt aus dem ich Bilder "sharen" möchte (Oder eben einfach in die Camera Roll exportieren, das ist ja mit dem UIActivityViewController dann genauso möglich).
    Nun können das 1 ... zigtausend Bilder sein im "schlimmsten" Fall.
    Ich habe die Bilder nicht lokal, sondern Sie kommen per WLAN von einem Server.

    Zuerst habe ich ein "Proof of Concept" mit einem Bild (lokale Resource) und ohne den Provider gemacht --> ging prima.
    Ich kann das so aber nicht machen da es wie gesagt potentiell (wenn auch nicht wahrscheinlich) viele Bilder und damit grosse Datenmengen sein können.
    Appel bietet da eben den Provider an, der es dann ermöglicht NUR das gerade benötigte (aka "gesharte") Bild zur Verfügung zu stellen statt alle erst mal zu laden und dann zu sharen.
    So habe ich es zumindest verstanden, das hörte sich für mich gut an.
    Nun habe ich das alles fein (oder eben nicht so fein) codiert und es SCHIEN zu funktionieren. Nach und nach wurden die verschiedenen Bilder vom jeweiligen Provider vom Netz geladen und dann das nächste u.s.w. .
    Zum Test habe ich die Option "Save image" genutzt welche die Bilder in die Camera Roll speichert.
    Dummerweise ist es so das von den Ausgewählten Bildern nur ein Teil "ankommt". Wenn ich also z.B. 9 Bilder zum "sharen" markiere und dann auf "Save 9 images" drücke dann sind zum Schluss meistens 5 oder 6 Bilder in der Roll. auch mal 4 oder 7 aber Ihr seht das Problem: KEINE 9 !!!!!

    Ich habe mir dann das Apple Airdrop sample zur Brust genommen und habe es zunächst soweit modifiziert das statt einem Bild eben 9 Bilder (okay, 9 mal das gleiche aber aus 9 Providern) geshart werden. Das GEHT !
    Dann habe ich das sample soweit kastriert wie ich konnte um störendes / anderes / verwirrendes wegzunehmen.
    Und siehe da, es gehen dann auch Bilder verloren !!!!

    Nun bin ich unsicher ob es das gleiche Problem ist wie in meiner App, aber die ist zu komplex um Sie heir reinzusetzen.
    Vielleicht ist einer so nett und guckt sich das mal an.

    Hier ist erst mal der Link auf den download des Apple "Airdrop" Examples.
    Heisst zwar Airdrop aber im untersten Menüpunkt kann man ein Bild einer Blume nach "Sepia Umrechnung" dann sharen und zwar eben unter anderem "Save image" --> Also in die Camera Roll exportieren.

    Airdrop Sample download @ Apple


    Hier die Dateien einzeln:

    APLAsyncImageViewController.h:

    Quellcode

    1. #import <UIKit/UIKit.h>
    2. #import "APLAsyncImageActivityItemProvider.h"
    3. @interface APLAsyncImageViewController : UIViewController
    4. @end


    APLAsyncImageViewController.m: (hier kann man sehen das ich in "openActivitySheet" eine Schleife habe in der ich 9 Provider erzeuge, die in einen Array packe und die dann später dem UIActivityViewController mitgebe. Der soll dann hoffentlich nach und nach "item" aufrufen um das jeweilige Bild zu bekommen)

    Quellcode

    1. #import "APLAsyncImageViewController.h"
    2. #import "APLProgressAlertViewController.h"
    3. NSString * const kProgressAlertViewControllerIdentifier = @"APLProgressAlertViewController";
    4. @interface APLAsyncImageViewController ()
    5. @property (strong, nonatomic) UIWindow *alertWindow;
    6. @property (strong, nonatomic) APLProgressAlertViewController *alertViewController;
    7. @property (strong, nonatomic) UIPopoverController *activityPopover;
    8. @property (weak, nonatomic) IBOutlet UIButton *shareImageButton;
    9. - (IBAction)openActivitySheet:(id)sender;
    10. @end
    11. @implementation APLAsyncImageViewController
    12. - (IBAction)openActivitySheet:(id)sender
    13. {
    14. NSMutableArray *itemArray = [[NSMutableArray alloc] init];
    15. for( int i = 0; i < 9;i++)
    16. {
    17. APLAsyncImageActivityItemProvider *aiImageItemProvider = [[APLAsyncImageActivityItemProvider alloc] init];
    18. [itemArray addObject: aiImageItemProvider];
    19. }
    20. //Create an activity view controller with the activity provider item. UIActivityItemProvider (AsyncImageActivityItemProvider's superclass) conforms to the UIActivityItemSource protocol
    21. UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:itemArray applicationActivities:nil];
    22. if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
    23. //iPhone, present activity view controller as is
    24. [self presentViewController:activityViewController animated:YES completion:nil];
    25. }
    26. else
    27. {
    28. //iPad, present the view controller inside a popover
    29. if (![self.activityPopover isPopoverVisible]) {
    30. self.activityPopover = [[UIPopoverController alloc] initWithContentViewController:activityViewController];
    31. [self.activityPopover presentPopoverFromRect:[self.shareImageButton frame] inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    32. }
    33. else
    34. {
    35. //Dismiss if the button is tapped while pop over is visible
    36. [self.activityPopover dismissPopoverAnimated:YES];
    37. }
    38. }
    39. }
    40. @end
    Alles anzeigen


    APLAsyncImageActivityItemProvider.h:

    Quellcode

    1. #import <UIKit/UIKit.h>
    2. @interface APLAsyncImageActivityItemProvider : UIActivityItemProvider
    3. @end


    APLAsyncImageActivityItemProvider.m: (So, hier eben eine Seltsamkeit. So wie es hier steht werden eben ein paar der 9 "hardwired" gesparten Bilder verloren. Wenn man mit dem Bild "irgendwas" macht, z.B. die 4 Zeilen einkommentiert die das Bild auf 1000x1000 skalieren, DANN klappt es)

    Quellcode

    1. #import "APLAsyncImageActivityItemProvider.h"
    2. #import "UIImage+Resize.h"
    3. @implementation APLAsyncImageActivityItemProvider
    4. - (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
    5. {
    6. return [[UIImage alloc] init];
    7. }
    8. - (id)item
    9. {
    10. UIImage *image = [UIImage imageNamed:@"Flower.png"];
    11. //uncomment the next 4 lines (simple scaling using the methods in "UIImage+Resize.h/.m") to make sharing work !!!!
    12. //CGSize imageSize;
    13. //imageSize.height = 1000;
    14. //imageSize.width = 1000;
    15. //image = [UIImage imageWithImage:image scaledToFitToSize:imageSize];
    16. return image;
    17. }
    18. - (UIImage *)activityViewController:(UIActivityViewController *)activityViewController thumbnailImageForActivityType:(NSString *)activityType suggestedSize:(CGSize)size
    19. {
    20. //The filtered image is the image to display on the other side.
    21. return [[UIImage alloc] init];
    22. }
    23. @end
    Alles anzeigen




    Wenn Ihr also das Sample auspackt und die 4 Dateien mit der aus meinem Zip ersetz habt Ihr den Fehelrfall -> einige der 9 Bilde rgehen verloren. Ich habe das mit und ohne ARC probiert, Standart ist natürlich mit ARC.

    Hat einer eine Idee was hier schiefgeht ??

    Ihr habt Euch sicher schon gedacht das ich keine Ahnung von Objective C habe, bin ein C++ Mensch der für diesen Teil des Projektes eben "etwas" OBJ-C machen muss, also: Bitte seid lieb zu mir :)


    Grüße,

    Nils
    Dateien
    • AirDrop mod.zip

      (3,9 kB, 192 mal heruntergeladen, zuletzt: )
  • Nachtrag,
    es scheint so zu sein das das einkommentieren der Skalierung AUCH nicht immer für "verlustfreies" Sharen sorgt, es verbessert nur die Wahrscheinlichkeit.
    Mir ist das völlig rätselhaft, ich würde behaupten das findet alles "by the book" statt, aber meistens ist es ja doch ein Problem zwischen den Ohren und kein iOS Bug :)

    Weiss jemand noch etwas dazu ?

    Grüße,

    Nils