Carregar imagem do aplicativo iOS para php - Não consigo acertar - O que estou perdendo?

Em primeiro lugar, sei que essa pergunta foi feita mil vezes. Estou perguntando novamente, porque tentei as soluções nos outros exemplos e elas não estão funcionando para mim e não sei por quê. Todo mundo parece ter uma abordagem um pouco diferente.

NSData *imageData =  UIImagePNGRepresentation(form.image);
NSURL *url = [NSURL URLWithString:@"myscript.php"];
NSMutableString *postParams = [[NSMutableString alloc] initWithFormat:@"&image=%@", imageData]];

NSData *postData = [postParams dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [[NSString alloc] initWithFormat:@"%d", [postData length]];

NSMutableURLRequest *connectRequest = [[NSMutableURLRequest alloc] init];
[connectRequest setURL:url];
[connectRequest setHTTPMethod:@"POST"];
[connectRequest setValue:postLength forHTTPHeaderField:@"Content-Length"];
[connectRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
//[connectRequest setValue:@"image/png" forHTTPHeaderField:@"Content-Type"];
[connectRequest setHTTPBody:postData];

NSData *receivedData;
NSDictionary *jsonData;

NSURLConnection *connectConnection = [[NSURLConnection alloc] initWithRequest:connectRequest delegate:self];

NSError *error = nil;

if (!connectConnection) {
    receivedData = nil;
    NSLog(@"The connection failed!");
} else {
    NSLog(@"Connected!");
    receivedData = [NSURLConnection sendSynchronousRequest:connectRequest returningResponse:NULL error:&error];
}

if (!receivedData) {
    NSLog(@"Data fetch failed: %@", [error localizedDescription]);
} else {
    NSLog(@"The data is %lu bytes", (unsigned long)[receivedData length]);
    NSLog(@"%@", receivedData);

    if (NSClassFromString(@"NSJSONSerialization")) {
        id object = [NSJSONSerialization JSONObjectWithData:receivedData options:0 error:&error];

        if (!object) {
            NSLog(@"JSON Serialization failed: %@", [error localizedDescription]);
        }

        if ([object isKindOfClass:[NSDictionary class]]) {
            jsonData = object;
            NSLog(@"json data: %@", jsonData);
        }
    }
}

No momento eu estou passando o NSData no postParams e usando este script php:

if (isset($_POST['image']) && !empty($_POST['image'])) {

     if (file_put_contents('images/test.png', $_POST['image'])) {
           echo '{"saved":"YES"}'; die();
     } else {
           echo '{"saved":"NO"}'; die();     
     }
}

Isso está salvando os dados em um arquivo, mas não consigo abri-los porque estão corrompidos ou algo assim. Esse foi praticamente o último esforço e eu realmente não esperava que funcionasse dessa maneira, mas é o mais perto que cheguei até aqui de acertar.

Eu tentei usar vários métodos de tipo de conteúdo de cabeçalho / limite de conteúdo / $ _FILES / enctype, mas não consigo nem mesmo enviar para o script dessa maneira.

aliás, não estou apenas enviando os dados da imagem, mas também publicando outros valores nos postParams que são apenas strings, ints etc.

Alguém tem alguma sugestão ou conhece alguma boa fonte disponível para isso?

Obrigado por qualquer assistência oferecida.

Estado atual após seguir os conselhos fornecidos nas respostas abaixo (também, mais informações de outras partes do programa):

Captura inicial da imagem:

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    [self.view endEditing:YES];

    __unused form *form = self.form;

    form.signature = self.signatureDrawView.bp;

    UIGraphicsBeginImageContext(self.signatureDrawView.bounds.size);
    [self.signatureDrawView.layer renderInContext:UIGraphicsGetCurrentContext()];
    campaignForm.signatureImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
}

onde o signatureDrawView é um UIView e o form.signature é um UIBezierpath.

então...

NSData *sigImage =  UIImagePNGRepresentation(campaignForm.signatureImage);

que é passado para a seguinte função:

- (void)uploadImage:(NSData *)imageData
{
    NSMutableURLRequest *request;
    NSString *urlString = @"https://.../upload.php";
    NSString *filename = @"uploadTest";
    request= [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:urlString]];
    [request setHTTPMethod:@"POST"];
    NSString *boundary = @"---------------------------14737809831466499882746641449";
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"];
    NSMutableData *postbody = [NSMutableData data];
    [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@.png\"\r\n", filename] dataUsingEncoding:NSUTF8StringEncoding]];
    [postbody appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [postbody appendData:[NSData dataWithData:imageData]];
    [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [request setHTTPBody:postbody];

    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    NSString *returnString;
    returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
    NSLog(@"%@", returnString);
}

upload.php parecido com:

    if ($_FILES["file"]["error"] > 0) {
        echo '{"file":"'.$_FILES['file']['error'].'"}';
        die();
    } else {
        $size = $_FILES["file"]["size"] / 1024;
        $upload_array = array(
                    "Upload"=>$_FILES["file"]["name"],
                    "Type"=>$_FILES["file"]["type"],
                    "Size"=>$size,
                    "Stored in"=>$_FILES["file"]["tmp_name"]
                    );
        //echo json_encode($upload_array);
        if (move_uploaded_file($_FILES["file"]["tmp_name"], "signatures/" . $_FILES["file"]["name"])) {
            echo '{"success":"YES"}';
            die();  
        } else { 
            echo '{"success":"NO"}';
            die();  
        }
        die();
    }

Isso está me dando a saída {success: NO} e o dump $ upload_array mostra valores nulos.

questionAnswers(1)

yourAnswerToTheQuestion