Publicación de video en instagram usando ganchos

Quiero que mi aplicación pueda subir videos a Instagram.

Instagram IPhone Hooks brinda información sobre cómo usar los ganchos de iphone para subir una foto a Instagram. Mi pregunta es si alguien tiene alguna experiencia sobre cómo lograr lo mismo pero para un video.

La API de Instagram no admite directamente la carga de nada desde aplicaciones de terceros. Por lo tanto, tiene que hacer compromisos desagradables con la experiencia del usuario al proporcionar la funcionalidad a sus usuarios.

Primero, prepara el video que deseas subir a Instagram y almacena el camino hacia él en algún lado

En segundo lugar, guárdelo en el rollo de la cámara del usuario:

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

Tercero, ahora que el video está guardado, dígale al usuario que para subir el video a su Instagram, debe seleccionarlo de su rollo de cámara luego de hacer clic en el botón cargar.

El botón de carga simplemente haría lo siguiente:

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

Es muy tonto que la API de Instagram no admita la selección inmediata de medios a través de cualquiera de los puntos finales API para fines de carga, pero tal como está ahora, esta es la única manera.

Tenía una pregunta similar: Instagram Video iPhone Hook y yo lo descubrimos. Hay un gancho para iPhone no documentado que le permite seleccionar activos de manera automática desde el rollo de fotos de iPhones y precargar una leyenda para el video. Esto debería darle la misma experiencia de usuario que tiene la aplicación Flipagrams al compartir un video en Instagram.

instagram: // biblioteca? AssetPath = assets-library% 3A% 2F% 2Fasset% 2Fasset.mp4% 3Fid% 3D8864C466-A45C-4C48-B76F-E3C421711E9D% 26ext% 3Dmp4 & InstagramCaption = Some% 20Preloaded% 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]; } }]; 

prueba con:

 instagram://library?AssetPath=yourVideoPath 

encontré la solución aquí: http://blog.horizon.camera/post/102273431070/video-share-objc-ios-instagram

Actualizado para iOS 9.

Primero, para iOS9 necesitarás agregar a tu archivo Info.plist . Agregue una clave a LSApplicationQueriesSchemes con el valor instagram . Esto incluirá en la lista blanca el esquema de Instagram. Más información aquí.

Aquí está el código de trabajo basado en 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 instagramURL de muestra sería:

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

Actualización 2016/5: tenga en cuenta que ALAssetsLibrary ahora está en desuso para guardar en el álbum de fotos de los usuarios, y ahora se recomienda el Marco de Fotos .

Aquí hay un código rápido para compartir videos en Instagram.

aquí videoURL es la URL del activo del video.

  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.") } } } 

Asegúrese de haber agregado el código siguiente en info.plist:

 LSApplicationQueriesSchemes  instagram  

Instagram ha actualizado esto para usar la biblioteca de fotos más nueva. Ahora, en lugar de pasar la URL de la imagen / video, simplemente puede pasar el localIdentifier PHAsset correspondiente:

 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]; } 

La API de Instagram tiene una funcionalidad de carga extremadamente limitada, especialmente cuando se trata de archivos de video.

Por lo que entiendo, básicamente tienes dos opciones cuando se trata de subir archivos multimedia a Instagram. Puede usar la API de interacción de documentos para pasar una imagen a la aplicación de Instagram, o puede llamar a la cámara de Instagram y pedirle al usuario que elija de su rollo de cámara (como dijo Nico ).

Estoy bastante seguro de que solo puedes pasar archivos JPEG o PNG a Instagram a través del sistema Document Interaction, por lo que para el video creo que estás atrapado con el rollo de la cámara por ahora. Definitivamente no es ideal, la aplicación en la que estoy trabajando ahora usa anzuelos de iPhone, pero hemos decidido mantener las imágenes hasta que Instagram mejore su API.

He usado el código a continuación y está funcionando para mí.

 ` [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); } }]; } ` 

puede hacerlo por punto final de medios

 https://api.instagram.com/v1/media/3?access_token=ACCESS-TOKEN 

Obtenga información sobre un objeto multimedia. La clave de tipo devuelta le permitirá diferenciar entre imágenes y medios de video.

http://instagram.com/developer/endpoints/media/

Aquí este enlace es para obtener la identificación de medios de imagen. pero espero que la misma técnica tenga ayuda en video.

¿Dónde encuentro el ID de medios de Instagram de una imagen?

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

Información de ventaja:

  1. instagram: // la cámara abrirá la cámara o la biblioteca de fotos (dependiendo del dispositivo),
  2. instagram: // la aplicación abrirá la aplicación
  3. instagram: // user? username = foo abrirá ese nombre de usuario
  4. instagram: // location? id = 1 abrirá esa ubicación
  5. instagram: // media? id = 315 abrirá ese medio
    Intereting Posts