2016-10-19 25 views
1

Ich bin neu bei Firebase, und ich habe ihre Dokumentation here verfolgt. Aber nichts, was ich versucht habe, scheint zu funktionieren.Firebase Bild auf Speicher während Benutzerregistrierung hochladen

Was ich bin versucht:

1) Registrieren Sie einen Benutzer -Works

2) Gibt der Benutzer ein Profilbild während der -Doesn't Arbeit Registrierung wählen.

Der Code:

- (void) registerNewUser:(FIRUser *)user 

{ 
    FIRUser *currentUser = [FIRAuth auth].currentUser; 
    NSString *email = emailAddressTxtField.text; 
    NSString *password = passwordTxtField.text; 
    NSString *username = usernameTxtField.text; 
    [[FIRAuth auth] 
    createUserWithEmail:email 
    password:password 
    completion:^(FIRUser *_Nullable user, 
        NSError *_Nullable error) 
    { 
     if (error) 
     { 
      NSLog(@"%@", error.localizedDescription); 
      return; 
     } 
     else 
     { 
      ////ASSIGN NEW USER THEIR NAME//// 
      self.databaseRef = [[FIRDatabase database] reference]; 
      [[[databaseRef child:@"users"] child:user.uid] 
       setValue:@{@"name": username}]; 
     } 
    }]; 
    ////ESTABLISHED A USER, SO LET'S ASSIGN THEIR PIC TO THEM//// 
    if (profilePicImageView.image) 
    { 
     FIRStorageReference *profilePicRef = [[storageRef child:@"images/profilePicture.jpg"] child:currentUser.uid]; 
     FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] init]; 
     metadata.contentType = @"image/jpeg"; 
     NSData *imageData = UIImageJPEGRepresentation(self.profilePicImageView.image, 0.8); 
     NSLog(@"metadata from image: %@", metadata); 

     [profilePicRef putData:imageData metadata:metadata completion:^(FIRStorageMetadata *metadata, NSError *error) 
     { 
      if (error != nil) 
      { 
       NSString *profileImageURL = metadata.downloadURL.absoluteString; 
       NSLog(@"Profile Image URL from image: %@", profileImageURL); 
       [ProgressHUD showSuccess:[NSString stringWithFormat:@"%@ Successfully Registered!!", username]]; 
       [self.segmentedLoginRegister setSelectedSegmentIndex:0]; 
       [self checkSegmentedControl]; 
       [ProgressHUD showSuccess:[NSString stringWithFormat:@"Welcome %@!", username]]; 
      } 
      else 
      { 
       NSLog(@"Failed to Register User with profile image"); 
      } 
     }]; 
    } 
} 

Weitere Informationen:

Fotos nur von der Kamerarolle des Geräts Debug Bereich Drucke des Benutzers kommen:

[Allgemeine] Das Erstellen eines Bildformats mit unbekanntem Typ ist ein Fehler

Antwort

1

, wie ein Benutzer

Lassen Sie uns, dass Sie 3 Textfelder einen Benutzer registrieren nehmen REGISTRIERUNGS. Sie haben einen usernameTextfield, ein emailTextField und ein passwordTextfield. Wir möchten auch einen profilePicture mit diesem Benutzer verbunden haben. Also wir zuerst:

ein Verfahren etabliert, unsere Werte für unsere Benutzer auf die Firebase-Datenbank zu speichern:

-(void) saveValuesForUser:(FIRUser *) user 
{ 
    NSString *username = usernameTxtField.text; 
    self.databaseRef = [[FIRDatabase database] reference]; 
    [[[databaseRef child:@"users"] child:user.uid] 
    setValue:@{@"Name": username, @"Profile Picture": profileImageURL}]; 
} 

Die profileImageURL über ein NSString ist, dass Sie über Ihre Implementierung Ihrer View-Controller erstellen können, aber wir auch sollte eine UIImage erstellen, die wir im Laufe des Viewcontroller zugreifen können:

#import "ViewController.h" 
@import Photos; 
@interface ViewController() 

@end 

NSString *profileImageURL; 
UIImage *profileImage; 

@implementation ViewController 

ich vermute, dass Sie wissen, wie die Filmrolle starten weg von einem UIButton aber falls Sie nicht, lassen Sie uns diese Methoden aufrufen, so dass wenn unser Benutzer tippt e-Taste, ihr Image zu wählen, dass es zu unserem profilePicture.imageView gesetzt bekommen:

- (IBAction)chooseImageAction:(id)sender 

{ 
    UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
    picker.delegate = self; 
    picker.allowsEditing = YES; 
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
    [self presentViewController:picker animated:YES completion:NULL]; 
} 

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info 

{ 
    picker.delegate = self; 
    profileImage = info[UIImagePickerControllerEditedImage]; 
    profilePicImageView.image = profileImage; 
    [self dismissViewControllerAnimated:NO completion:nil]; 
} 

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker 

{ 
    [picker dismissViewControllerAnimated:YES completion:NULL]; 
} 

Jetzt sind wir mit dem Feuer kochen! Nun, da wir das Bild haben der Benutzer für ihre profilePicture laden, lassen Sie uns eine Methode schaffen es als NSURL unserer Firebase-Datenbank zu speichern:

- (void) saveProfileImage 

{ 
    FIRUser *currentUser = [FIRAuth auth].currentUser; 
    NSString *username = usernameTxtField.text; 

    if (profilePicImageView.image != nil) 
    { 
     FIRStorage *storage = [FIRStorage storage]; 
     storageRef = [storage referenceForURL:@"gs://PUTYOURFIREBASEHERE.appspot.com"]; 
     NSString *imageID = [[NSUUID UUID] UUIDString]; 
     NSString *imageName = [NSString stringWithFormat:@"Profile Pictures/%@.jpg",imageID]; 
     FIRStorageReference *profilePicRef = [storageRef child:imageName]; 
     FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] init]; 
     metadata.contentType = @"image/jpeg"; 
     NSData *imageData = UIImageJPEGRepresentation(self.profilePicImageView.image, 0.8);   
     [profilePicRef putData:imageData metadata:metadata completion:^(FIRStorageMetadata *metadata, NSError *error) 
     { 
      if (!error) 
      { 
       profileImageURL = metadata.downloadURL.absoluteString; 
       [self saveValuesForUser: currentUser]; 
      } 
      else if (error) 
      { 
       NSLog(@"Failed to Register User with profile image"); 
      } 
     }]; 
    } 
} 

Wichtig: Stellen Sie sicher, dass Sie Ihre gs einfügen: // Referenz für den Wert von storageRef! Sie finden dies auf Ihrer Firebase-Konsole unter Speicher.

Nun, da wir die Methode haben die Benutzerprofilbild zu speichern, lassen Sie uns eine Methode erstellen Sie den neuen Benutzer zu registrieren, dass wir es auf unserer IBAction anrufen:

- (void) registerNewUser 

{ 
    NSString *email = emailAddressTxtField.text; 
    NSString *password = passwordTxtField.text; 
    [[FIRAuth auth] 
    createUserWithEmail:email 
    password:password 
    completion:^(FIRUser *_Nullable user, 
        NSError *_Nullable error) 
    { 
     if (error) 
     { 
      NSLog(@"%@", error.localizedDescription); 
      return; 
     } 
     else 
     { 
      [self saveProfileImage]; 
     } 
    }]; 
} 

Oh schön das ist! Nun wollen wir diese Methode auf unserer Taste aufrufen, so dass, wenn der Benutzer tippt die Register-Taste auf unsere UI, dass es die erhalten genannt:

- (IBAction)registerUserAction:(id)sender 
{ 

[self registerNewUser]; 

} 

Hinweis: Achten Sie darauf, dass in Ihrem ViewController.h-Datei, die Sie die entsprechend Delegierten Einstellung:

@interface ViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITextFieldDelegate> 
1

Meine Schätzung ist, dass profilePicImageView.image nicht wirklich ein gültiges Bildobjekt enthält.

+0

Omg, nein, es ist schon komisch, wie diese Dinge funktionieren, hatte ich versehentlich gelöscht den Verweis auf meinen Speicher URL! Lol, ich werde Schritt für Schritt für Obj C als Antwort unterschreiben, danke! –

Verwandte Themen