web-dev-qa-db-fra.com

Publication d'une vidéo sur Instagram avec l'aide de crochets

Je souhaite que mon application puisse télécharger des vidéos sur instagram.

Instagram IPhone Hooks explique comment utiliser les crochets iphone pour télécharger une photo sur Instagram. Ma question est de savoir si quelqu'un a une expérience sur la façon de réaliser la même chose, mais pour une vidéo?

37
Nilsymbol

L'API d'Instagram ne prend pas directement en charge le téléchargement d'applications tierces. Par conséquent, vous devez faire des compromis avec l'expérience utilisateur laide lors de la fourniture de la fonctionnalité à vos utilisateurs.

Commencez par préparer la vidéo que vous souhaitez télécharger sur Instagram et enregistrez le chemin d'accès quelque part.

Deuxièmement, enregistrez-le sur la pellicule de l'utilisateur:

if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(filePath)) {
    UISaveVideoAtPathToSavedPhotosAlbum(filePath, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);
}

Troisièmement, maintenant que la vidéo est enregistrée, indiquez à l'utilisateur que, pour pouvoir télécharger la vidéo sur son compte Instagram, il doit la sélectionner depuis son rouleau de caméras après avoir cliqué sur le bouton de téléchargement.

Le bouton de téléchargement ferait simplement ce qui suit:

NSURL *instagramURL = [NSURL URLWithString:@"instagram://camera"];
if ([[UIApplication sharedApplication] canOpenURL:instagramURL]) {
    [[UIApplication sharedApplication] openURL:instagramURL];
}

Il est très ridicule que l'API Instagram ne prenne pas en charge la sélection immédiate des médias via l'un des points de terminaison de l'API à des fins de téléchargement, mais telle qu'elle est actuellement, c'est le seul moyen.

43
Nico Hämäläinen

J'avais une question similaire: Instagram Video iPhone Hook et je l'ai compris. Il existe un crochet pour iPhone non documenté qui vous permet de sélectionner automatiquement des éléments du rouleau de photos pour iPhone et de précharger une légende pour la vidéo. Cela devrait vous donner la même expérience utilisateur que l’application Flipagrams avec le partage d’une vidéo sur Instagram. 

instagram: // bibliothèque? AssetPath = bibliothèque_actifs% 3A% 2F% 2Fasset% 2Fasset.mp4% 3Fid% 3D8864C466-A45C-4C48-B76F-E3C421711E9D% 26ext% 3Dmp4 & InstagramCaption = Certains% 20Caption% 20Caption

NSURL *videoFilePath = ...; // Your local path to the video
NSString *caption = @"Some Preloaded Caption";
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeVideoAtPathToSavedPhotosAlbum:[NSURL URLWithString:videoFilePath] completionBlock:^(NSURL *assetURL, NSError *error) {
    NSURL *instagramURL = [NSURL URLWithString:[NSString stringWithFormat:@"instagram://library?AssetPath=%@&InstagramCaption=%@",[assetURL absoluteString].percentEscape,caption.percentEscape]];
    if ([[UIApplication sharedApplication] canOpenURL:instagramURL]) {
        [[UIApplication sharedApplication] openURL:instagramURL];
    }
}];
20
johnnyg17

essayez avec:

instagram://library?AssetPath=yourVideoPath

j'ai trouvé la solution ici: http://blog.horizon.camera/post/102273431070/video-share-objc-ios-instagram

10
user1755548

Mis à jour pour iOS 9. 

Premièrement, pour iOS9, vous devrez ajouter à votre fichier Info.plist. Ajoutez une clé a LSApplicationQueriesSchemes avec la valeur instagram. Ce sera la liste blanche du schéma Instagram. Plus d'infos ici.

Voici un code de travail basé sur johnnyg17:

NSString *moviePath = @"<# /path/to/movie #>";
NSString *caption = @"<# Your caption #>";
NSURL *movieURL = [NSURL fileURLWithPath:moviePath isDirectory:NO];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeVideoAtPathToSavedPhotosAlbum:movieURL
                            completionBlock:^(NSURL *assetURL, NSError *error)
{
    NSURL *instagramURL = [NSURL URLWithString:
                           [NSString stringWithFormat:@"instagram://library?AssetPath=%@&InstagramCaption=%@",
                            [[assetURL absoluteString] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]],
                            [caption stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]]]
                           ];
    if ([[UIApplication sharedApplication] canOpenURL:instagramURL]) {
        [[UIApplication sharedApplication] openURL:instagramURL];
    }
    else {
        NSLog(@"Can't open Instagram");
    }
}];

Un exemple d'instagramURL serait:

instagram://library?AssetPath=assets%2Dlibrary%3A%2F%2Fasset%2Fasset%2Emov%3Fid%3D69920271%2D2D44%2D4A84%2DA373%2D13602E8910B6%26ext%3Dmov&InstagramCaption=Super%20Selfie%20Dance%20%F0%9F%98%83

Mise à jour 2016/5: Notez que ALAssetsLibrary est maintenant déconseillé pour l'enregistrement dans l'album photo des utilisateurs et que le Photos Framework est maintenant recommandé. 

5
Stan James

Instagram a mis à jour cette fonctionnalité pour utiliser la bibliothèque de photos la plus récente. Désormais, au lieu de transmettre l’URL image/vidéos, vous pouvez simplement transmettre le identifiant local de PHAsset:

PHAsset *first = /* Some PHAsset that you want to open Instagram to */;

NSURL *instagramURL = [NSURL URLWithString:[@"instagram://library?AssetPath=" stringByAppendingString:first.localIdentifier]];
if ([[UIApplication sharedApplication] canOpenURL:instagramURL]) {
    [[UIApplication sharedApplication] openURL:instagramURL];
}
2
Tim

Voici le code Swift pour partager la vidéo sur Instagram.

ici videoURL est l'URL de l'actif de la vidéo.

 func shareVideoToInstagram()
    {
        let videoURL : NSURL = "URL of video"

        let library = ALAssetsLibrary()
        library.writeVideoAtPathToSavedPhotosAlbum(videoURL) { (newURL, error) in

            let caption = "write your caption here..."

            let instagramString = "instagram://library?AssetPath=\((newURL.absoluteString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet()))!)&InstagramCaption=\((caption.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet()))!)"

            let instagramURL = NSURL(string: instagramString)

            if UIApplication.sharedApplication().canOpenURL(instagramURL!)
            {
                UIApplication.sharedApplication().openURL(instagramURL!)
            }
            else
            {
                print("Instagram app not installed.")
            }                
        }
    }

Assurez-vous que vous avez ajouté le code ci-dessous dans info.plist:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>instagram</string>
</array>
2
Adnan Thathiya

L'API Instagram est extrêmement limitée dans sa fonctionnalité de téléchargement, en particulier pour les fichiers vidéo.

D'après ce que j'ai compris, vous avez essentiellement deux options pour l'envoi de contenu multimédia sur Instagram. Vous pouvez soit utiliser l’API Document Interaction pour transmettre une image à l’application Instagram, soit appeler la caméra Instagram et demander à l’utilisateur de choisir parmi ses rouleaux de pellicule (sous la forme Nico dit).

Je suis presque sûr que vous ne pouvez transmettre des fichiers JPEG ou PNG à Instagram que par le biais du système Document Interaction. Par conséquent, pour la vidéo, je pense que vous êtes coincé avec la pellicule pour l'instant. Ce n'est certainement pas idéal - l'application sur laquelle je travaille en ce moment utilise des crochets pour iPhone, mais nous avons décidé de nous en tenir aux images jusqu'à ce que Instagram améliore leur API.

1
David Schwartz

J'ai utilisé le code ci-dessous et cela fonctionne pour moi.

` [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
            switch (status) {

                case PHAuthorizationStatusAuthorized: {

                    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"instagram://"]])
                    {
                            [MMProgressHUD setPresentationStyle:MMProgressHUDPresentationStyleExpand];
                            [MMProgressHUD showWithTitle:APPNAME status:@"Please wait..."];

                            _FinalVideoPath = [_FinalVideoPath stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];

                            NSURL *videoUrl = [NSURL URLWithString:[NSString stringWithFormat:@"%@", _FinalVideoPath]];

                            dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
                            dispatch_async(q, ^{

                                NSData *videoData = [NSData dataWithContentsOfURL:videoUrl];

                                dispatch_async(dispatch_get_main_queue(), ^{

                                    // Write it to cache directory
                                    NSString *videoPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"file.mov"];

                                    [videoData writeToFile:videoPath atomically:YES];

                                    [self createAlbumInPhotosLibrary:APPNAME videoAtFile:[NSURL fileURLWithPath:videoPath]ShareOnString:@"Instagram"];

                                });
                            });

                    }
                    else
                    {

                        [MMProgressHUD dismiss];

                        [STMethod showAlert:self Title:APPNAME Message:@"Please install Instagram to share this video" ButtonTitle:@"Ok"];
                    }

                    break;
                }

                case PHAuthorizationStatusRestricted: {
                    [self PhotosDenied];
                    break;
                }
                case PHAuthorizationStatusDenied: {

                    [self PhotosDenied];
                    break;
                }
                default:
                {
                    break;
                }
            }
        }];

- (void)createAlbumInPhotosLibrary:(NSString *)photoAlbumName videoAtFile:(NSURL *)videoURL ShareOnString:(NSString*)ShareOnStr
{

    // RELIVIT_moments
    __block PHFetchResult *photosAsset;
    __block PHAssetCollection *collection;
    __block PHObjectPlaceholder *placeholder;

    // Find the album
    PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
    fetchOptions.predicate = [NSPredicate predicateWithFormat:@"title = %@", photoAlbumName];
    collection = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum
                                                          subtype:PHAssetCollectionSubtypeAny
                                                          options:fetchOptions].firstObject;
    // Create the album
    if (!collection)
    {
        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
            PHAssetCollectionChangeRequest *createAlbum = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:photoAlbumName];
            placeholder = [createAlbum placeholderForCreatedAssetCollection];

        } completionHandler:^(BOOL success, NSError *error) {

            if (success)
            {
                PHFetchResult *collectionFetchResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[placeholder.localIdentifier]
                                                                                                            options:nil];
                collection = collectionFetchResult.firstObject;

                [self saveVideoInRelivitFolderSetPlaceHolder:placeholder photosAsset:photosAsset collection:collection VideoAtFile:videoURL ShareOnStr:ShareOnStr];

            }
            else
            {
                [MMProgressHUD dismiss];
            }

        }];

    } else {

        [self saveVideoInRelivitFolderSetPlaceHolder:placeholder photosAsset:photosAsset collection:collection VideoAtFile:videoURL ShareOnStr:ShareOnStr];
    }

}


- (void)saveVideoInRelivitFolderSetPlaceHolder:(PHObjectPlaceholder *)placeholderLocal photosAsset:(PHFetchResult *)photosAssetLocal  collection:(PHAssetCollection *)collectionLocal VideoAtFile:(NSURL *)videoURL ShareOnStr:(NSString*)ShareOnstring
{

    __block PHFetchResult *photosAsset = photosAssetLocal;
    __block PHAssetCollection *collection = collectionLocal;
    __block PHObjectPlaceholder *placeholder = placeholderLocal;

    // Save to the album
    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        PHAssetChangeRequest *assetRequest = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:videoURL];
        placeholder = [assetRequest placeholderForCreatedAsset];
        photosAsset = [PHAsset fetchAssetsInAssetCollection:collection options:nil];

        PHAssetCollectionChangeRequest *albumChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:collection
                                                                                                                      assets:photosAsset];
        [albumChangeRequest addAssets:@[placeholder]];

    } completionHandler:^(BOOL success, NSError *error) {
        if (success)
        {
            NSLog(@"done");

            NSString *LocalIdentifire=placeholder.localIdentifier;

            NSString *AssetIdentifire=[LocalIdentifire stringByReplacingOccurrencesOfString:@"/.*" withString:@""];

            NSString *Extension=@"mov";

            NSString *AssetURL=[NSString stringWithFormat:@"assets-library://asset/asset.%@?id=%@&ext=%@",Extension,AssetIdentifire,Extension];

            NSURL *aSSurl=[NSURL URLWithString:AssetURL];

            [MMProgressHUD dismiss];

            if ([ShareOnstring isEqualToString:@"Instagram"])
            {
                NSLog(@"%@",AssetURL);

                NSString *caption = @"#Zoetrope";

                NSURL *instagramURL = [NSURL URLWithString:
                                       [NSString stringWithFormat:@"instagram://library?AssetPath=%@&InstagramCaption=%@",
                                        [[aSSurl absoluteString] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]],
                                        [caption stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]]]
                                       ];

                if ([[UIApplication sharedApplication] canOpenURL:instagramURL])
                {
                    [MMProgressHUD dismiss];
                    [[UIApplication sharedApplication] openURL:instagramURL];
                }
                else
                {
                    NSLog(@"Can't open Instagram");
                    [MMProgressHUD dismiss];

                    [STMethod showAlert:self Title:APPNAME Message:@"Please install Instagram to share this video" ButtonTitle:@"Ok"];
                }

            }
             else
            {
                NSString *videoPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"file.mov"];

                NSError *removeError = nil;

                [[NSFileManager defaultManager] removeItemAtURL:[NSURL fileURLWithPath:videoPath] error:&removeError];

                NSLog(@"%@",[removeError localizedDescription]);

                ZShareSuccessViewController *ShareView=[self.storyboard instantiateViewControllerWithIdentifier:@"ZShareSuccessViewController"];

                [self.navigationController pushViewController:ShareView animated:true];

            }
        }
        else
        {

            if (![ShareOnstring isEqualToString:@"Instagram"] || [ShareOnstring isEqualToString:@"facebook"])
            {
                [self PhotosDenied];
            }

            [MMProgressHUD dismiss];

            NSLog(@"%@", error.localizedDescription);
        }
    }];

}


`
0
Jignesh Radadiya