2015-12-11 2 views
9

Это мой код. Файл правильно добавлен в библиотеку фотографий, но в приложении instagram этот url ->instagram://library?AssetPath=assets-library%3A%2F%2Fasset%2Fasset.mp4%3Fid=5EDBD113-FF57-476B-AABB-6A59F31170B5&ext=mp4&InstagramCaption=my%caption не открывает последнее видео.Instagram hooks pre-select media issue

- (void)loadCameraRollAssetToInstagram:(NSURL*)assetsLibraryURL andMessage:(NSString*)message 
{ 
    NSString *escapedString = [self urlencodedString:assetsLibraryURL.absoluteString]; 
    NSString *escapedCaption = [self urlencodedString:message]; 
    NSURL *instagramURL  = [NSURL URLWithString:[NSString stringWithFormat:@"instagram://library?AssetPath=%@&InstagramCaption=%@", escapedString, escapedCaption]]; 

    NSLog(@"instagramURL ==> %@",instagramURL); 

    if ([[UIApplication sharedApplication] canOpenURL:instagramURL]) { 
     NSLog(@"Open Instagram!!"); 
     [[UIApplication sharedApplication] openURL:instagramURL]; 
    } else { 
     NSLog(@"Cant open Instagram!!"); 
     [[[UIAlertView alloc] initWithTitle:@"Instagram" message:@"App not installed" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil] show]; 
    } 
} 

- (NSString*)urlencodedString:(NSString *)message 
{ 
    return [message stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]; 
} 

- (void)saveToCameraRoll:(NSURL *)srcURL withCurrentAction:(NSString *)action 
{ 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    ALAssetsLibraryWriteVideoCompletionBlock videoWriteCompletionBlock = ^(NSURL *newURL, NSError *error) { 

     if (error) { 
      NSLog(@"Error writing image with metadata to Photo Library: %@", error); 
      [[[UIAlertView alloc] initWithTitle:@"Facebook" message:@"Pal - Currently we can't process your video. Please try again in few moments" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Sign In", nil] show]; 

     } else { 
      NSLog(@"Wrote image with metadata to Photo Library: %@", newURL.absoluteString); 
      if ([action isEqualToString:@"instagram"]) 
       [self loadCameraRollAssetToInstagram:newURL andMessage:@"My caption"]; //Can be any text? 
     } 
    }; 

    if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:srcURL]) 
    { 
     [library writeVideoAtPathToSavedPhotosAlbum:srcURL completionBlock:videoWriteCompletionBlock]; 
    } 
} 

enter image description here

что-то очень странное, что работал идеально, пока не получилось удалить и затем установить Instagram. Не знаю, если это имеет какое-то

+1

Вы нашли ответ? Я сталкиваюсь с той же проблемой. – scientiffic

+0

@scientiffic не удалось найти способ исправить это, пока я пренебрег этим билетом. – jose920405

+0

@ jose920405 печально новости, спасибо в любом случае. – saiday

ответ

31

instagram://library?AssetPath=\(assetsLibraryUrl) прекратил работать некоторое время назад. Разработчики Instagram, вероятно, перешли в рамки Photos и больше не используют AssetsLibrary.

Имея это предположение я попробовал несколько других имен параметров и обнаружил, что instagram://library?LocalIdentifier=\(localID) где localId является localIdentifier ваших PHAsset работ на данный момент.

Это все еще так же недокументировано, как и было, поэтому оно может сломаться в любой будущей версии Instagram.

+3

Как получить этот LocalIdentifier после сохранения видео в галерею? –

+0

Спасибо, отлично работает – jose920405

+0

@Devang Goswami вы можете получить LocalIdentifier из строки url ресурса. – jay

-4
if ([[UIApplication sharedApplication] canOpenURL:instagramURL]) { 
NSLog(@"Open Instagram!!"); //enter code here 
[[UIApplication sharedApplication/*<enter your code here>*/] openURL:instagramURL]; 
+0

Я не могу вас понять. Вы можете быть немного яснее – jose920405

+0

Просьба рассказать о том, как это отвечает на вопрос. – JAL

0

использовать этот код

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

Instagram будет показывает только те iamges/видео, которые сохраняются на пути, который вы установили в instagramURL. Этот путь должен быть абсолютным.

Если он еще не отображается, добавьте LSApplicationQueriesSchemes в файл info.plist массива, добавьте его item0 в качестве instagram.

+2

К сожалению, я думаю, что аргумент «AssetPath» был удален из схемы пользовательских URL-схемы instagram: https://www.instagram.com/developer/mobile-sharing/iphone-hooks/ (как и «InstagramCaption») – Workshed

+0

и что это разница с кодом для вопроса? – jose920405

+1

Да, вы правы, я не проверял это в iOS9. Позвольте мне найти новый способ открыть его. На их сайте разработчика нет ничего особенного. –

0

Заменить

- (NSString*)urlencodedString:(NSString *)message{ 
return [message stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]; 
} 

С

- (NSString*)urlencodedString:(NSString *)message{ 
return [message stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]]; 
} 

Это работает для меня!

1

@ Решение borisgolovnev фактически работает. Вы можете получить локальный идентификатор вашего последнего сохраненного видео, используя следующий код. Передача с помощью instagram: // library? LocalIdentifier = (localID) открывает Instagram с выбранным вами видео.

let fetchOptions = PHFetchOptions() 
fetchOptions.sortDescriptors = [NSSortDescriptor(key:"creationDate", ascending:false)] 
let fetchResult = PHAsset.fetchAssetsWithMediaType(.Video, options: fetchOptions) 
if let lastAsset = fetchResult.firstObject as? PHAsset { 
    self.localIdentifier = lastAsset.localIdentifier 
} 
0

скор 3 получить последний идентификатор простой и быстрый

var lastIdentifier = "" 
    let fetchOptions = PHFetchOptions() 
    fetchOptions.sortDescriptors = [NSSortDescriptor(key:"creationDate", ascending:false)] 
    let fetchResult = PHAsset.fetchAssets(with: .video, options: fetchOptions) 
    if let lastAsset: PHAsset = fetchResult.lastObject { 
    lastIdentifier = lastAsset.localIdentifier 
    } 
3

Резюмируя эту задачу после долгого времени и с учетом borisgolovnev's ответ и ALAssetsLibrary осуждается, окончательное решение :

- (void)saveToCameraRollOpt2:(NSURL *)srcURL 
{ 
    __block PHAssetChangeRequest *_mChangeRequest = nil; 
    __block PHObjectPlaceholder *placeholder; 

    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ 

     NSData *pngData = [NSData dataWithContentsOfURL:srcURL]; 
     UIImage *image = [UIImage imageWithData:pngData]; 

     _mChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; 

     placeholder = _mChangeRequest.placeholderForCreatedAsset; 

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

     if (success) { 
      [self loadCameraRollAssetToInstagram:[placeholder localIdentifier]]; 
     } 
     else { 
      NSLog(@"write error : %@",error); 
      [self showAlert:@"Error" msg:@"Error saving in camera roll" action:nil]; 
     } 
    }]; 
} 

- (void)loadCameraRollAssetToInstagram:(NSString *)localId 
{ 
    NSURL *instagramURL = [NSURL URLWithString:[NSString stringWithFormat:@"instagram://library?LocalIdentifier=\%@", localId]]; 

    if ([[UIApplication sharedApplication] canOpenURL:instagramURL]) { 
     [[UIApplication sharedApplication] openURL:instagramURL options:@{} completionHandler:nil]; 
    } else { 
     [self showAlert:@"Error" msg:@"Instagram app is not installed" action:nil]; 
    } 
} 

- (NSString*)urlencodedString:(NSString *)message 
{ 
    return [message stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]; 
} 

Не забудьте

#import <Photos/Photos.h> 

Add `NSPhotoLibraryUsageDescription` and `QueriesSchemes` inside .plist file 

<key>NSPhotoLibraryUsageDescription</key> 
<string>Need permission to access to manage your photos library</string> 
<key>LSApplicationQueriesSchemes</key> 
<array> 
    <string>instagram</string> 
</array> 
+0

Очень нужен ответ, спасибо. –

+0

Как это сделать для видео? –

0

Вот код для обмена видео на Instagram: Может быть вам нужно добавить условие substringFromIndex, но его работы.

- (void)ShareAssetURLvideoToInstagram:(NSURL*)assetsLibraryURL 
     { 
      NSMutableDictionary *queryStringDictionary = [[NSMutableDictionary alloc] init]; 

      NSString *strParamater = [assetsLibraryURL.absoluteString substringFromIndex:[assetsLibraryURL.absoluteString rangeOfString:@"?"].location+1]; 
      NSArray *urlComponents = [strParamater componentsSeparatedByString:@"&"]; 
      for (NSString *keyValuePair in urlComponents) 
      { 
       NSArray *pairComponents = [keyValuePair componentsSeparatedByString:@"="]; 
       NSString *key = [[pairComponents firstObject] stringByRemovingPercentEncoding]; 
       NSString *value = [[pairComponents lastObject] stringByRemovingPercentEncoding]; 

       [queryStringDictionary setObject:value forKey:key]; 
      } 

      NSString *mediaId = [queryStringDictionary valueForKey:@"id"]; 

      if (mediaId.length > 0) { 
       NSURL *instagramURL = [NSURL URLWithString:[NSString stringWithFormat:@"instagram://library?LocalIdentifier=%@",mediaId]]; 

       if ([[UIApplication sharedApplication] canOpenURL:instagramURL]) { 
        [[UIApplication sharedApplication] openURL:instagramURL]; 
       } 
      } 

     }