Search code examples
iosobjective-cuiactivityviewcontrolleruiactivity

How can I create a custom UIActivity in iOS?


How can I create a custom UIActivity in iOS?

The reason I want this is to add a Review App button in one of my apps that takes the user to the review section in the App Store. How can I create such a custom UIActivity?


Solution

  • First, create the files. I chose to name mine ActivityViewCustomActivity

    Make ActivityViewCustomActivity.h look like this:

    #import <UIKit/UIKit.h>
    
    @interface ActivityViewCustomActivity : UIActivity
    
    @end
    

    Make ActivityViewCustomActivity.m look like this:

    #import "ActivityViewCustomActivity.h"
    
    @implementation ActivityViewCustomActivity
    
    - (NSString *)activityType
    {
        return @"yourappname.Review.App";
    }
    
    - (NSString *)activityTitle
    {
        return @"Review App";
    }
    
    - (UIImage *)activityImage
    {  
        // Note: These images need to have a transparent background and I recommend these sizes:
        // iPadShare@2x should be 126 px, iPadShare should be 53 px, iPhoneShare@2x should be 100 
        // px, and iPhoneShare should be 50 px. I found these sizes to work for what I was making.
    
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        {
            return [UIImage imageNamed:@"iPadShare.png"];
        }
        else
        {
            return [UIImage imageNamed:@"iPhoneShare.png"];
        }
    }
    
    - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems
    {
        NSLog(@"%s", __FUNCTION__);
        return YES;
    }
    
    - (void)prepareWithActivityItems:(NSArray *)activityItems
    {
        NSLog(@"%s",__FUNCTION__);
    }
    
    - (UIViewController *)activityViewController
    {
        NSLog(@"%s",__FUNCTION__);
        return nil;
    }
    
    - (void)performActivity
    {   
        // This is where you can do anything you want, and is the whole reason for creating a custom 
        // UIActivity
    
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=yourappid"]];
        [self activityDidFinish:YES];
    }
    
    @end
    

    This is what my image looked like: Here is the .PSD I made: -- malicious link removed -- And here is the original 250 px .png https://i.sstatic.net/PAbIM.png

    Now in your view controller do this:

    #import "ActivityViewCustomActivity.h"
    

    And now wherever you want to display your UIActivityViewController:

       NSString *textItem = @"Check out the yourAppNameHere app: itunes http link to your app here";
       UIImage *imageToShare = [UIImage imageNamed:@"anyImage.png"];
    
       NSArray *items = [NSArray arrayWithObjects:textItem,imageToShare,nil];
    
       ActivityViewCustomActivity *aVCA = [[ActivityViewCustomActivity alloc]init];
    
       UIActivityViewController *activityVC =
       [[UIActivityViewController alloc] initWithActivityItems:items
                                                      applicationActivities:[NSArray arrayWithObject:aVCA]];
    
       activityVC.excludedActivityTypes = @[UIActivityTypePostToWeibo, UIActivityTypeAssignToContact, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeSaveToCameraRoll];
    
       activityVC.completionHandler = ^(NSString *activityType, BOOL completed)
       {
            NSLog(@"ActivityType: %@", activityType);
            NSLog(@"Completed: %i", completed);
       };
    
       if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
       {
          self.popoverController = [[UIPopoverController alloc] initWithContentViewController:activityVC];
    
          CGRect rect = [[UIScreen mainScreen] bounds];
    
          [self.popoverController
                         presentPopoverFromRect:rect inView:self.view
                         permittedArrowDirections:0
                         animated:YES];
       }
       else
       {
           [self presentViewController:activityVC animated:YES completion:nil];
       }