web-dev-qa-db-ja.com

iOSからInstagramフィードにビデオを共有する

私は、Instagramが起動して次の2つのオプションを提供するアプリの共有エクスペリエンスを作成しようとしています。

enter image description here

Facebookにはかなり 無駄のないドキュメント それについてあります。 UIDocumentInteractionControllerを使用して、考えられるすべての順列を試しました。 uticom.instagram.photoおよびcom.instagram.videoとしてig拡張子を付けて使用してみましたが、Instagramを直接起動する代わりに、標準の共有ポップオーバーを取得し続けます。 igocom.instagram.exclusivegramも試しましたが、とにかく標準のポップオーバーをトリガーすることになっているようです。

最新のコード:

func shareVideo(_ filePath: String) {
  let url = URL(fileURLWithPath: filePath)
  if(hasInstagram()){
    let newURL = url.deletingPathExtension().appendingPathExtension("ig")
    do {
      try FileManager.default.moveItem(at: url, to: newURL)
    } catch { print(error) }

    let dic = UIDocumentInteractionController(url: newURL)
    dic.uti = "com.instagram.photo"
    dic.presentOpenInMenu(from: self.view.frame, in: self.view, animated: true)
  }
}
9
Nuthinking

これを試して :-

私は現在、これによって最後に保存したビデオを共有しています:-

    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)!)
            }
        }

    }
5
Sidharth Khanna

上記の画面にアクセスする唯一の方法は、最初にビデオをライブラリに保存してから、ドキュメント化されていないフックinstagram://libraryを使用してアセットlocalIdentifierを渡すことです。 info.plistinstagramクエリスキームを追加することを忘れないでください。

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)
    }
}
4
Nuthinking
- (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
James Chan