Saturday, November 8, 2014

iOS 8.0 Extensions - Passing data from Host app to Extension

The sample application had a share button. Upon pressing share it brought up a share sheet which had the extension, selecting the extension brought up the extension ui and could read the data in it.

- (IBAction)share:(id)sender {
    
    // Create a UIActivityViewController with our image
    NSString *data = @"This is a data being passed from an extension invoker app to the extension";
     UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[data] applicationActivities:nil];
    // Set a completion handler to handle what the UIActivityViewController returns
    [activityViewController setCompletionWithItemsHandler:^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError * error){
        
        if([returnedItems count] > 0){
            
            NSExtensionItem* extensionItem = [returnedItems firstObject];
            NSItemProvider* imageItemProvider = [[extensionItem attachments] firstObject];
            
            if([imageItemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]){
                
                [imageItemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage options:nil completionHandler:^(UIImage *item, NSError *error) {
                    
                    if(item && !error){
                        
                        dispatch_async(dispatch_get_main_queue(), ^{
//                            [imageView setImage:item];
                        });
                        
                    }
                }];
                
            }
        }
    }];
    [self presentViewController:activityViewController animated:YES completion:nil];

}


Having the data passed like in the above, the trick is to read it in the extension by using the right identifier. In the viewDidLoad of extension, code is like below 

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // Get the item[s] we're handling from the extension context.
    
    // For example, look for an image and place it into an image view.
    // Replace this with something appropriate for the type[s] your extension supports.
    BOOL textFound = NO;
    for (NSExtensionItem *item in self.extensionContext.inputItems) {
        for (NSItemProvider *itemProvider in item.attachments) {
            if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeText]) {
                [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeText options:nil completionHandler:^(NSString *text, NSError *error) {
                    NSLog(@" -- Got input from the extension invoker --");
                    NSLog(@"text is :%@",text);
                    
                    
                }];
                textFound = YES;
                break;
            }
        }
        
        if (textFound) {
            // We only handle one image, so stop looking for more.
            break;
        }
    }
}

No comments:

Post a Comment