Objective-C, Authorization fails to perform function
===

I'm trying to create an Authorization to copy a file using SMJobBless, although I can't get it to work. The helper app is successfully authorized and the `Job is available!` message appears before the `[self copyFile]` method, but the copyFile always fails. If someone could shed some light on what I'm doing wrong or provide and example of how to make this work that would be great.

appDelegate.h

    #import <Cocoa/Cocoa.h>
    
    @interface SMJobBlessAppController : NSObject {
    	IBOutlet NSTextField *_textField;
    }
    
    - (BOOL)blessHelperWithLabel:(NSString *)label error:(NSError **)error;
    - (void)copyFile;
    
    @end

appDelegate.m

    #import <ServiceManagement/ServiceManagement.h>
    #import <Security/Authorization.h>
    #import "appDelegate.h"
    
    @implementation SMJobBlessAppController
    - (void)applicationDidFinishLaunching:(NSNotification *)notification
    {
    	NSError *error = nil;
    	if (![self blessHelperWithLabel:@"com.apple.bsd.SMJobBlessHelper" error:&error]) {
    		NSLog(@"Something went wrong!");
    	} else {
    		/* At this point, the job is available. However, this is a very
    		 * simple sample, and there is no IPC infrastructure set up to
    		 * make it launch-on-demand. You would normally achieve this by
    		 * using a Sockets or MachServices dictionary in your launchd.plist.
    		 */
    		NSLog(@"Job is available!");
    		
    		[self->_textField setHidden:false];
            
            [self copyFile];
    
    	}
    }
    
    - (void)copyFile {
        
        NSError *error = nil;
        
        NSFileManager *fileManager = [[NSFileManager alloc] init];
        NSString *sourceFile = @"~/path/to/file.txt";
        NSString *destFile = @"~/Library/Application Support/myApp/file.txt";
        
        if ([fileManager copyItemAtPath:sourceFile toPath:destFile error:&error] == YES) {
            NSLog (@"[FILE] Copied.");
            // NSLog (@"Copy successful");
        } else {
            NSLog (@"[FILE] Copy failed.");
            NSLog (@" %@ %@",sourceFile, destFile);
            // NSLog (@"Copy failed");
        }
        
        [fileManager release];
        
        return;
    }
    
    - (BOOL)blessHelperWithLabel:(NSString *)label error:(NSError **)error;
    {
    	BOOL result = NO;
    
    	AuthorizationItem authItem		= { kSMRightBlessPrivilegedHelper, 0, NULL, 0 };
    	AuthorizationRights authRights	= { 1, &authItem };
    	AuthorizationFlags flags		=	kAuthorizationFlagDefaults				| 
    										kAuthorizationFlagInteractionAllowed	|
    										kAuthorizationFlagPreAuthorize			|
    										kAuthorizationFlagExtendRights;
    
    	AuthorizationRef authRef = NULL;
    	
    	/* Obtain the right to install privileged helper tools (kSMRightBlessPrivilegedHelper). */
    	OSStatus status = AuthorizationCreate(&authRights, kAuthorizationEmptyEnvironment, flags, &authRef);
    	if (status != errAuthorizationSuccess) {
    		NSLog(@"Failed to create AuthorizationRef, return code %i", status);
    	} else {
    		/* This does all the work of verifying the helper tool against the application
    		 * and vice-versa. Once verification has passed, the embedded launchd.plist
    		 * is extracted and placed in /Library/LaunchDaemons and then loaded. The
    		 * executable is placed in /Library/PrivilegedHelperTools.
    		 */
    		result = SMJobBless(kSMDomainSystemLaunchd, (CFStringRef)label, authRef, (CFErrorRef *)error);
    	}
    	
    	return result;
    }
    @end