Share video to Instagram feed from iOS

前端 未结 3 1610
無奈伤痛
無奈伤痛 2021-02-04 08:23

I\'ve been trying to create a sharing experience for our app where Instagram launches giving these two options:

Facebook has a pretty lean documentation about i

相关标签:
3条回答
  • 2021-02-04 08:46

    Try this :-

    I am currently sharing my last saved video by this:-

        let fetchOptions = PHFetchOptions()
        fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
        let fetchResult = PHAsset.fetchAssets(with: .video, options: fetchOptions)
        if let lastAsset = fetchResult.firstObject {
            let localIdentifier = lastAsset.localIdentifier
            let u = "instagram://library?LocalIdentifier=" + localIdentifier
            let url = NSURL(string: u)!
            if UIApplication.shared.canOpenURL(url as URL) {
                UIApplication.shared.open(URL(string: u)!, options: [:], completionHandler: nil)
            } else {
    
                let urlStr = "https://itunes.apple.com/in/app/instagram/id389801252?mt=8"
                if #available(iOS 10.0, *) {
                    UIApplication.shared.open(URL(string: urlStr)!, options: [:], completionHandler: nil)
    
                } else {
                    UIApplication.shared.openURL(URL(string: urlStr)!)
                }
            }
    
        }
    
    0 讨论(0)
  • 2021-02-04 08:46
    - (void)postMedia:(NSString *)media Type:(BOOL)isVideo {
    
        [SVProgressHUD showWithStatus:LS(@"Downloading...")];
    
        //download the file in a seperate thread.
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    
            NSURL *url = [NSURL URLWithString:media];
            NSData *urlData = [NSData dataWithContentsOfURL:url];
            if ( urlData ) {
    
                NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:isVideo?@"instagramShare.mp4":@"instagramShare.jpg"];
                NSURL *outputFileURL = [NSURL URLWithString:filePath];
    
                dispatch_async(dispatch_get_main_queue(), ^{
    
                    if (![urlData writeToFile:filePath atomically:YES]) {
                        [SVProgressHUD showErrorWithStatus:LS(@"Failed. Please try again.")];
                        return;
                    }
    
                    // Check authorization status.
                    [PHPhotoLibrary requestAuthorization:^( PHAuthorizationStatus status ) {
                        if ( status == PHAuthorizationStatusAuthorized ) {
    
                            // Save the movie file to the photo library and cleanup.
                            [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
                                // In iOS 9 and later, it's possible to move the file into the photo library without duplicating the file data.
                                // This avoids using double the disk space during save, which can make a difference on devices with limited free disk space.                            
                                PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptions alloc] init];
                                options.shouldMoveFile = YES;
                                PHAssetCreationRequest *changeRequest = [PHAssetCreationRequest creationRequestForAsset];
                                if (isVideo)
                                    [changeRequest addResourceWithType:PHAssetResourceTypeVideo fileURL:outputFileURL options:options];
                                else
                                    [changeRequest addResourceWithType:PHAssetResourceTypePhoto fileURL:outputFileURL options:options];
    
                            } completionHandler:^( BOOL success, NSError *error ) {
    
                                if ( success ) {
    
                                    [SVProgressHUD dismiss];
    
                                    PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
                                    fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]];
                                    PHFetchResult *fetchResult;
                                    if (isVideo)
                                        fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:fetchOptions];
                                    else
                                        fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:fetchOptions];
                                    PHObject *lastAsset = fetchResult.firstObject;
                                    if (lastAsset != nil) {
                                        NSString *localIdentifier = lastAsset.localIdentifier;
                                        NSString *u = [NSString stringWithFormat:@"instagram://library?LocalIdentifier=%@", localIdentifier];
                                        NSURL *url = [NSURL URLWithString:u];
                                        dispatch_async(dispatch_get_main_queue(), ^{
                                            if ([[UIApplication sharedApplication] canOpenURL:url]) {
                                                [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
                                            } else {
    
                                                NSString *urlStr = @"https://itunes.apple.com/in/app/instagram/id389801252?mt=8";
                                                [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlStr] options:@{} completionHandler:nil];
                                            }
                                        });
                                    }
                                }
                                else {
                                    [SVProgressHUD showErrorWithStatus:LS(@"Failed. Please try again.")];
                                }
                            }];
                        }                   
                    }];
                });
            }
            else {
                [SVProgressHUD showErrorWithStatus:LS(@"Failed. Please try again.")];
            }
        });
    }
    
    0 讨论(0)
  • 2021-02-04 08:53

    The only way to get to the screen illustrated above is to save first the video in the library and then use the undocumented hook instagram://library passing the asset localIdentifier. Don't forget to add instagram query scheme in the info.plist.

    if UIApplication.shared.canOpenURL("instagram://app") { // has Instagram
        let url = URL(string: "instagram://library?LocalIdentifier=" + videoLocalIdentifier)
    
        if UIApplication.shared.canOpenURL(url) {
            UIApplication.shared.open(url, options: [:], completionHandler:nil)
        }
    }
    
    0 讨论(0)
提交回复
热议问题