iOS의 Instagram에서 이미지를 공유하는 방법은 무엇입니까?


87

제 고객이 Instagram, Twitter, Facebook에서 이미지를 공유하고 싶어합니다.

트위터와 페이스 북을 해봤지만 인스 타 그램에서 이미지를 공유 할 API 나 인터넷에서 아무것도 찾지 못했습니다. 인스 타 그램에서 이미지 공유가 가능합니까? 그렇다면 어떻게?

인스 타 그램의 개발자 사이트를 확인해 보니 Ruby on Rails와 Python의 라이브러리를 발견했습니다. 그러나 iOS Sdk에 대한 문서는 없습니다.

instagram.com/developer에 따라 Instagram에서 토큰을 얻었지만 이제 Instagram 이미지와 공유하기 위해 다음 단계를 수행해야할지 모르겠습니다.


stackoverflow.com/questions/28858512/…에 대한 아이디어가 있습니까?
Ashok

답변:


70

마침내 나는 답을 얻었다. 인스 타 그램에 직접 이미지를 올릴 수 없습니다. UIDocumentInteractionController로 이미지를 다시 만들어야합니다.

@property (nonatomic, retain) UIDocumentInteractionController *dic;    

CGRect rect = CGRectMake(0 ,0 , 0, 0);
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIGraphicsEndImageContext();
NSString  *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/test.igo"];

NSURL *igImageHookFile = [[NSURL alloc] initWithString:[[NSString alloc] initWithFormat:@"file://%@", jpgPath]];
self.dic.UTI = @"com.instagram.photo";
self.dic = [self setupControllerWithURL:igImageHookFile usingDelegate:self];
self.dic=[UIDocumentInteractionController interactionControllerWithURL:igImageHookFile];
[self.dic presentOpenInMenuFromRect: rect    inView: self.view animated: YES ];


- (UIDocumentInteractionController *) setupControllerWithURL: (NSURL*) fileURL usingDelegate: (id <UIDocumentInteractionControllerDelegate>) interactionDelegate {
     UIDocumentInteractionController *interactionController = [UIDocumentInteractionController interactionControllerWithURL: fileURL];
     interactionController.delegate = interactionDelegate;
     return interactionController;
}

참고 : Instagram 앱으로 리디렉션하면 앱으로 돌아갈 수 없습니다. 앱을 다시 열어야합니다

여기 에서 소스 다운로드


setupControllerWithURL 함수는 어디에 있습니까?
khaled

3
@SurenderRathore는 이미지를 612 * 612로 크기를 조정하고 .ig 형식으로 저장해야합니다. .ig는 이미지를 인스 타 그램으로 열고 싶어하며 iPhone 또는 iPod에서 버전 4.3까지 테스트해야 함을 보여줍니다. 아이 패드는 지원되지 않습니다
Hiren

1
@HiRen : 네, 맞아요.하지만 제 앱에서 저는 뷰의 스크린 샷을 찍고 그 스크린 샷을 인스 타 그램 앱을 통해 공유하고 있고 완벽하게 잘 작동합니다. 하지만 해당 스크린 샷과 함께 일부 정적 텍스트도 전달하고 싶습니다. 아이디어가 있으시면 저를 도와주세요. DMACtivityInstagram에 대한 github의 데모 코드가 있으며 거기에서 제가 말하려는 내용을 볼 수 있습니다. 미리 감사드립니다.
Manthan

2
이 줄을 사용하면 iOS 6에서 충돌이 발생했습니다. NSURL * igImageHookFile = [[NSURL alloc] initWithString : [[NSString alloc] initWithFormat : @ "file : // % @", jpgPath]]; 이것을 사용하면 두 가지 모두에서 작동합니다 : NSURL * igImageHookFile = [NSURL fileURLWithPath : jpgPath]; 내가 뭔가를 놓친 것이 아니라면 그에 따라 대답을 편집 할 가치가 있습니까?
weienw

1
이게 나인가, 아니면 다른 사람이 "안녕 인스 타 그램, 당신은 한때 개발자 였는데 왜 우리 삶을 이렇게 힘들게 만들고 있니?"라고 말하고 싶어합니까?
Chris Chen

27

다음은 Instagram에 이미지 + 캡션 텍스트를 업로드하기위한 전체 테스트 코드입니다.

in.h 파일

//Instagram
@property (nonatomic, retain) UIDocumentInteractionController *documentController;

-(void)instaGramWallPost
{
            NSURL *instagramURL = [NSURL URLWithString:@"instagram://app"];
            if([[UIApplication sharedApplication] canOpenURL:instagramURL]) //check for App is install or not
            {
                NSData *imageData = UIImagePNGRepresentation(imge); //convert image into .png format.
                NSFileManager *fileManager = [NSFileManager defaultManager];//create instance of NSFileManager
                NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //create an array and store result of our search for the documents directory in it
                NSString *documentsDirectory = [paths objectAtIndex:0]; //create NSString object, that holds our exact path to the documents directory
                NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"insta.igo"]]; //add our image to the path
                [fileManager createFileAtPath:fullPath contents:imageData attributes:nil]; //finally save the path (image)
                NSLog(@"image saved");

                CGRect rect = CGRectMake(0 ,0 , 0, 0);
                UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);
                [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
                UIGraphicsEndImageContext();
                NSString *fileNameToSave = [NSString stringWithFormat:@"Documents/insta.igo"];
                NSString  *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:fileNameToSave];
                NSLog(@"jpg path %@",jpgPath);
                NSString *newJpgPath = [NSString stringWithFormat:@"file://%@",jpgPath];
                NSLog(@"with File path %@",newJpgPath);
                NSURL *igImageHookFile = [[NSURL alloc]initFileURLWithPath:newJpgPath];
                NSLog(@"url Path %@",igImageHookFile);

                self.documentController.UTI = @"com.instagram.exclusivegram";
                self.documentController = [self setupControllerWithURL:igImageHookFile usingDelegate:self];
                self.documentController=[UIDocumentInteractionController interactionControllerWithURL:igImageHookFile];
                NSString *caption = @"#Your Text"; //settext as Default Caption
                self.documentController.annotation=[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"%@",caption],@"InstagramCaption", nil];
                [self.documentController presentOpenInMenuFromRect:rect inView: self.view animated:YES];
            }
            else
            {
                 NSLog (@"Instagram not found");
            }
}

- (UIDocumentInteractionController *) setupControllerWithURL: (NSURL*) fileURL usingDelegate: (id <UIDocumentInteractionControllerDelegate>) interactionDelegate {
    NSLog(@"file url %@",fileURL);
    UIDocumentInteractionController *interactionController = [UIDocumentInteractionController interactionControllerWithURL: fileURL];
    interactionController.delegate = interactionDelegate;

    return interactionController;
}

또는

-(void)instaGramWallPost
{
    NSURL *myURL = [NSURL URLWithString:@"Your image url"];
    NSData * imageData = [[NSData alloc] initWithContentsOfURL:myURL];
    UIImage *imgShare = [[UIImage alloc] initWithData:imageData];

    NSURL *instagramURL = [NSURL URLWithString:@"instagram://app"];

    if([[UIApplication sharedApplication] canOpenURL:instagramURL]) //check for App is install or not
    {
        UIImage *imageToUse = imgShare;
        NSString *documentDirectory=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
        NSString *saveImagePath=[documentDirectory stringByAppendingPathComponent:@"Image.igo"];
        NSData *imageData=UIImagePNGRepresentation(imageToUse);
        [imageData writeToFile:saveImagePath atomically:YES];
        NSURL *imageURL=[NSURL fileURLWithPath:saveImagePath];
        self.documentController=[[UIDocumentInteractionController alloc]init];
        self.documentController = [UIDocumentInteractionController interactionControllerWithURL:imageURL];
        self.documentController.delegate = self;
        self.documentController.annotation = [NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"Testing"], @"InstagramCaption", nil];
        self.documentController.UTI = @"com.instagram.exclusivegram";
        UIViewController *vc = [UIApplication sharedApplication].keyWindow.rootViewController;
        [self.documentController presentOpenInMenuFromRect:CGRectMake(1, 1, 1, 1) inView:vc.view animated:YES];
    }
    else {
        DisplayAlertWithTitle(@"Instagram not found", @"")
    }
}

그리고 이것을 .plist에 씁니다.

<key>LSApplicationQueriesSchemes</key>
    <array>
        <string>instagram</string>
    </array>

Instagram에서 이미지 공유 후 다시 응용 프로그램으로 돌아올 수 있습니까?
Hiren

아니 ... 우리는 수동으로 돌아올 필요가 ...하지만 난 내가 코드를 업데이트합니다 모든 솔루션 ... 발견하는 경우
Hardik Thakkar

감사합니다 @ Fahim Parkar
Hardik Thakkar 2015 년

Instagram 버튼을 선택했지만 그 이후에는 아무 일도 일어나지 않습니까? 이 답변 외에 추가 코드가 있습니까?
noobsmcgoobs

1
@HardikThakkar 솔루션을 사용할 때 Instagram이 아닌 선택할 앱만 선택합니다. IOS 11. 여전히 작동하는지 아십니까? 감사합니다
Vladyslav Melnychenko

22

Instagram에서 제공하는 URL 스키마 중 하나를 사용할 수 있습니다.

여기에 이미지 설명 입력

  1. Instagram oficial 문서는 여기

  2. UIDocumentInteractionController와 공유

    final class InstagramPublisher : NSObject {
    
    private var documentsController:UIDocumentInteractionController = UIDocumentInteractionController()
    
    func postImage(image: UIImage, view: UIView, result:((Bool)->Void)? = nil) {
        guard let instagramURL = NSURL(string: "instagram://app") else {
            if let result = result {
                result(false)
            }
        return
    }
        if UIApplication.sharedApplication().canOpenURL(instagramURL) {
            let jpgPath = (NSTemporaryDirectory() as NSString).stringByAppendingPathComponent("instagrammFotoToShareName.igo")
            if let image = UIImageJPEGRepresentation(image, 1.0) {
                image.writeToFile(jpgPath, atomically: true)
                let fileURL = NSURL.fileURLWithPath(jpgPath)
                documentsController.URL = fileURL
                documentsController.UTI = "com.instagram.exclusivegram"
                documentsController.presentOpenInMenuFromRect(view.bounds, inView: view, animated: true)
                if let result = result {
                    result(true)
                }
            } else if let result = result {
                result(false)
            }
        } else {
            if let result = result {
                result(false)
            }
        }
        }
    }
    
  3. 직접 리디렉션으로 공유

    import Photos
    
    final class InstagramPublisher : NSObject {
    
    func postImage(image: UIImage, result:((Bool)->Void)? = nil) {
    guard let instagramURL = NSURL(string: "instagram://app") else {
        if let result = result {
            result(false)
        }
        return
    }
    
    let image = image.scaleImageWithAspectToWidth(640)
    
    do {
        try PHPhotoLibrary.sharedPhotoLibrary().performChangesAndWait {
            let request = PHAssetChangeRequest.creationRequestForAssetFromImage(image)
    
            let assetID = request.placeholderForCreatedAsset?.localIdentifier ?? ""
            let shareURL = "instagram://library?LocalIdentifier=" + assetID
    
            if UIApplication.sharedApplication().canOpenURL(instagramURL) {
                if let urlForRedirect = NSURL(string: shareURL) {
                    UIApplication.sharedApplication().openURL(urlForRedirect)
                }
            }
        }
    } catch {
        if let result = result {
            result(false)
        }
    }
    }
    }
    
  4. 권장 크기로 사진 크기 조정을위한 확장

    import UIKit
    
    extension UIImage {
        // MARK: - UIImage+Resize
    
        func scaleImageWithAspectToWidth(toWidth:CGFloat) -> UIImage {
            let oldWidth:CGFloat = size.width
            let scaleFactor:CGFloat = toWidth / oldWidth
    
            let newHeight = self.size.height * scaleFactor
            let newWidth = oldWidth * scaleFactor;
    
            UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight))
            drawInRect(CGRectMake(0, 0, newWidth, newHeight))
            let newImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return newImage
        }
    }
    
  5. plist에 필수 구성표를 추가하는 것을 잊지 마십시오

  <key>LSApplicationQueriesSchemes</key>
  <array>
       <string>instagram</string> 
  </array>

1
적어도 동영상 (다른 답변에서 다른 물건을 잔뜩 시도 만이 일한..! "인스 타 그램 : // 라이브러리 LocalIdentifier ="그것을 한 일이었다 많은 감사
비요른 로슈

직접 리디렉션을 통한 공유 (지금까지 최고의 솔루션 인 IMO)는 더 이상 저에게 적합하지 않습니다. Instagram은 라이브러리 페이지에서 열리지 만 이미지를 미리 선택하지는 않습니다. 이 URL 스키마로 무엇이 변경되었을 지 알고 있습니까? iOS의 최신 버전 Instagram에서 비슷한 오류가 발생합니까?
urchino

@gbk이 코드는 저에게 효과적입니다. 하지만 인스 타 그램에서 여러 장의 사진을 찍어야한다는 새로운 요구 사항이 있습니다. Instagram처럼 슬라이드보기와 같은 새로운 옵션 다중 업로드 및 표시가 있습니다. 어떻게해야합니까? 제발 도와주세요.
Ekta Padaliya

이런 젠장. 감사합니다. 나는 지난 하루 동안 내 앱에서 Instagram에 공유하여 멋지게 작동하도록 노력하고 있습니다.
Jesse S.

2
단지 3'd 변형은 IOS (13)에 대해 저를 위해 노력하고, BTW <키> <문자열> 앱은 누드 사진을 NSPhotoLibraryUsageDescription </ 키> 필요 추가하는 것을 잊지 말아 </ 문자열>.
serg_zhd

14

이 답변이 귀하의 질문을 해결하기를 바랍니다. 그러면 카메라 대신 Instagram에서 라이브러리 폴더가 직접 열립니다.

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

1
이 작업을 수행 할 때마다 Instagram 앱이 이전 이미지를 선택하여로드된다는 것을 알고 있습니까? 자산 경로 링크에 문제가 있다고 생각합니다.
Supertecnoboff

2
훌륭합니다 !! Instagram은 UIDocumentInteractionController.Thanks없이 직접 열 수 있습니다.
iChirag 2015

이 사건으로 저를 도울 수 있습니까 stackoverflow.com/questions/34226433/…
jose920405

이미지와 함께 URL도 전달할 수 있습니까?
Alok

1
안타깝게도 ALAssetsLibrary는 iOS 9부터 더 이상 사용되지 않습니다.
Alena

10

UIDocumentInteractionController를 사용하지 않으려면

import Photos

...

func postImageToInstagram(image: UIImage) {
        UIImageWriteToSavedPhotosAlbum(image, self, #selector(SocialShare.image(_:didFinishSavingWithError:contextInfo:)), nil)
    }
    func image(image: UIImage, didFinishSavingWithError error: NSError?, contextInfo:UnsafePointer<Void>) {
        if error != nil {
            print(error)
        }

        let fetchOptions = PHFetchOptions()
        fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
        let fetchResult = PHAsset.fetchAssetsWithMediaType(.Image, options: fetchOptions)
        if let lastAsset = fetchResult.firstObject as? PHAsset {
            let localIdentifier = lastAsset.localIdentifier
            let u = "instagram://library?LocalIdentifier=" + localIdentifier
            let url = NSURL(string: u)!
            if UIApplication.sharedApplication().canOpenURL(url) {
                UIApplication.sharedApplication().openURL(NSURL(string: u)!)
            } else {
                let alertController = UIAlertController(title: "Error", message: "Instagram is not installed", preferredStyle: .Alert)
                alertController.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
                self.presentViewController(alertController, animated: true, completion: nil)
            }

        }
    }

내가 정말로 필요한 것입니다. 감사!
Azel

당신은 내 생명을 구했습니다. 완벽한 대답. 감사 !!
technerd

1
Instagram에서 공유하기 위해 클릭하고 카메라 롤에 저장을 취소 할 때마다 이것은 완전히 잘못된 것입니다.
Shrikant K

9

iOS 6 이상에서는이 UIActivity를 사용하여 iOS 후크를 사용하는 동일한 워크 플로를 가지고 있지만 개발을 단순화하는 Instagram에 이미지를 업로드 할 수 있습니다.

https://github.com/coryalder/DMActivityInstagram


당신이 우리와 함께 모든 샘플 소스하시기 바랍니다 점유율이있을 경우 하이 @Chintan 파텔은 내가 어떻게에서 사용자 프로필 정보를 얻을 수 있습니다
사비

6

이것은 내가 세부적으로 구현 한 정답입니다. .h 파일

 UIImageView *imageMain;
 @property (nonatomic, strong) UIDocumentInteractionController *documentController;

in.m 파일 만 쓰기

 NSURL *instagramURL = [NSURL URLWithString:@"instagram://app"];
 if([[UIApplication sharedApplication] canOpenURL:instagramURL])
 {
      CGFloat cropVal = (imageMain.image.size.height > imageMain.image.size.width ? imageMain.image.size.width : imageMain.image.size.height);

      cropVal *= [imageMain.image scale];

      CGRect cropRect = (CGRect){.size.height = cropVal, .size.width = cropVal};
      CGImageRef imageRef = CGImageCreateWithImageInRect([imageMain.image CGImage], cropRect);

      NSData *imageData = UIImageJPEGRepresentation([UIImage imageWithCGImage:imageRef], 1.0);
      CGImageRelease(imageRef);

      NSString *writePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"instagram.igo"];
      if (![imageData writeToFile:writePath atomically:YES]) {
      // failure
           NSLog(@"image save failed to path %@", writePath);
           return;
      } else {
      // success.
      }

      // send it to instagram.
      NSURL *fileURL = [NSURL fileURLWithPath:writePath];
      self.documentController = [UIDocumentInteractionController interactionControllerWithURL:fileURL];
      self.documentController.delegate = self;
      [self.documentController setUTI:@"com.instagram.exclusivegram"];
      [self.documentController setAnnotation:@{@"InstagramCaption" : @"We are making fun"}];
      [self.documentController presentOpenInMenuFromRect:CGRectMake(0, 0, 320, 480) inView:self.view animated:YES];
 }
 else
 {
      NSLog (@"Instagram not found");

 }

확실히 당신은 결과를 얻을 것입니다. 예를 들어 아래에서 인스 타 그램 이미지와 함께 팝 오버를 볼 수 있습니다.


5

내 응용 프로그램에서 이것을 시도했는데 완벽하게 작동합니다 (Swift)

import Foundation

import UIKit

class InstagramManager: NSObject, UIDocumentInteractionControllerDelegate {

    private let kInstagramURL = "instagram://"
    private let kUTI = "com.instagram.exclusivegram"
    private let kfileNameExtension = "instagram.igo"
    private let kAlertViewTitle = "Error"
    private let kAlertViewMessage = "Please install the Instagram application"

    var documentInteractionController = UIDocumentInteractionController()

    // singleton manager
    class var sharedManager: InstagramManager {
        struct Singleton {
            static let instance = InstagramManager()
        }
        return Singleton.instance
    }

    func postImageToInstagramWithCaption(imageInstagram: UIImage, instagramCaption: String, view: UIView) {
        // called to post image with caption to the instagram application

        let instagramURL = NSURL(string: kInstagramURL)
        if UIApplication.sharedApplication().canOpenURL(instagramURL!) {
            let jpgPath = (NSTemporaryDirectory() as NSString).stringByAppendingPathComponent(kfileNameExtension)
            UIImageJPEGRepresentation(imageInstagram, 1.0)!.writeToFile(jpgPath, atomically: true)
            let rect = CGRectMake(0,0,612,612)
            let fileURL = NSURL.fileURLWithPath(jpgPath)
            documentInteractionController.URL = fileURL
            documentInteractionController.delegate = self
            documentInteractionController.UTI = kUTI

            // adding caption for the image
            documentInteractionController.annotation = ["InstagramCaption": instagramCaption]
            documentInteractionController.presentOpenInMenuFromRect(rect, inView: view, animated: true)
        }
        else {

            // alert displayed when the instagram application is not available in the device
            UIAlertView(title: kAlertViewTitle, message: kAlertViewMessage, delegate:nil, cancelButtonTitle:"Ok").show()
        }
    }
}


 func sendToInstagram(){

     let image = postImage

             InstagramManager.sharedManager.postImageToInstagramWithCaption(image!, instagramCaption: "\(description)", view: self.view)

 }

2

여기에 정답이 있습니다. 인스 타 그램에 직접 이미지를 게시 할 수 없습니다. UIDocumentInteractionController를 사용하여 Instagram으로 리디렉션해야합니다.

NSString* imagePath = [NSString stringWithFormat:@"%@/instagramShare.igo", [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]];
[[NSFileManager defaultManager] removeItemAtPath:imagePath error:nil];

UIImage *instagramImage = [UIImage imageNamed:@"imagename you want to share"];
[UIImagePNGRepresentation(instagramImage) writeToFile:imagePath atomically:YES];
NSLog(@"Image Size >>> %@", NSStringFromCGSize(instagramImage.size));

self.dic=[UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:imagePath]];
self.dic.delegate = self;
self.dic.UTI = @"com.instagram.exclusivegram";
[self.dic presentOpenInMenuFromRect: self.view.frame inView:self.view animated:YES ];

}

참고 : Instagram 앱으로 리디렉션하면 앱으로 돌아갈 수 없습니다. 앱을 다시 열어야합니다


대리인을 설정했지만 작성 / 게시하지 않았습니까?
Raptor

2

UIDocumentInteractionController를 사용하지 않고 다음 세 가지 방법으로 Instagram으로 바로 이동할 수 있습니다.

다른 모든 유명한 앱처럼 작동합니다. 코드는 Objective c로 작성되었으므로 원하는 경우 신속하게 변환 할 수 있습니다. 해야 할 일은 이미지를 장치에 저장하고 URLScheme을 사용하는 것입니다.

.m 파일 안에 이것을 추가하십시오.

#import <Photos/Photos.h>

먼저 다음 메서드를 사용하여 UIImage를 장치에 저장해야합니다.

-(void)savePostsPhotoBeforeSharing
{
    UIImageWriteToSavedPhotosAlbum([UIImage imageNamed:@"image_file_name.jpg"], self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
}

이 메서드는 이미지를 장치에 저장하기위한 콜백입니다.

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo: (void *) contextInfo;
{
    [self sharePostOnInstagram];

}

이미지가 장치에 저장되면 방금 저장 한 이미지를 쿼리하여 PHAsset으로 가져와야합니다.

-(void)sharePostOnInstagram
{
    PHFetchOptions *fetchOptions = [PHFetchOptions new];
    fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO],];
    __block PHAsset *assetToShare;
    PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:fetchOptions];
    [result enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
        assetToShare = asset;


    }];


    if([assetToShare isKindOfClass:[PHAsset class]])
    {
        NSString *localIdentifier = assetToShare.localIdentifier;
        NSString *urlString = [NSString stringWithFormat:@"instagram://library?LocalIdentifier=%@",localIdentifier];
        NSURL *instagramURL = [NSURL URLWithString:urlString];
        if ([[UIApplication sharedApplication] canOpenURL: instagramURL])
        {
            [[UIApplication sharedApplication] openURL: instagramURL];
        } else
        {
            // can not share with whats app
            NSLog(@"No instagram installed");
        }

    }
}

그리고 이것을 info.plist에 넣는 것을 잊지 마십시오. LSApplicationQueriesSchemes

<string>instagram</string>


Instagram에 여러 사진을 추가하려면 어떻게해야합니까?
Ekta Padaliya

1
- (void) shareImageWithInstagram
{
    NSURL *instagramURL = [NSURL URLWithString:@"instagram://"];
    if ([[UIApplication sharedApplication] canOpenURL:instagramURL])
    {
        UICachedFileMgr* mgr = _gCachedManger;
        UIImage* photoImage = [mgr imageWithUrl:_imageView.image];
        NSData* imageData = UIImagePNGRepresentation(photoImage);
        NSString* captionString = [NSString  stringWithFormat:@"ANY_TAG",];
        NSString* imagePath = [UIUtils documentDirectoryWithSubpath:@"image.igo"];
        [imageData writeToFile:imagePath atomically:NO];
        NSURL* fileURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"file://%@",imagePath]];

        self.docFile = [[self setupControllerWithURL:fileURL usingDelegate:self]retain];
        self.docFile.annotation = [NSDictionary dictionaryWithObject: captionString
                                                     forKey:@"InstagramCaption"];
        self.docFile.UTI = @"com.instagram.photo";

        // OPEN THE HOOK
        [self.docFile presentOpenInMenuFromRect:self.view.frame inView:self.view animated:YES];
    }
    else
    {
        [UIUtils messageAlert:@"Instagram not installed in this device!\nTo share image please install instagram." title:nil delegate:nil];
    }
}

내 응용 프로그램에서 이것을 시도했으며 확실히 작동합니다.


아마도 당신은 UIUtils& UICachedFileMgr?
Raptor

이해하다. 더 자세한 정보를 제공하기 위해 답변을 수정하는 것이 좋습니다
랩터

@Raptor : 다음에서 샘플 앱을 다운로드하십시오. 링크
neha_sinha19 2014

UIUtils는 유틸리티 메서드를 관리하기 위해 만든 클래스로 NSObject에서 파생됩니다. 경고보기를 표시하기 위해 messageAlert 메서드를 추가했습니다. 위에 링크를 제공 한 샘플 앱에서 UIUtils 클래스를 찾을 수 있습니다. 바라건대, 당신은 이해할 것입니다.
neha_sinha19 2014

1

나를 위해 여기에 설명 된 가장 쉽고 쉬운 방법 은 내 iOS 앱에서 Instagram으로 사진 공유

.igo 형식을 사용하여 장치에 이미지를 저장 한 다음 "UIDocumentInteractionController"를 사용하여 로컬 경로 Instagram 앱을 보내야합니다. "UIDocumentInteractionControllerDelegate"를 설정하는 것을 잊지 마십시오.

내 조언은 다음과 같은 것을 추가하는 것입니다.

NSURL *instagramURL = [NSURL URLWithString:@"instagram://app"];
if ([[UIApplication sharedApplication] canOpenURL:instagramURL]) 
{
 <your code>
}

1
NSURL *instagramURL = [NSURL URLWithString:@"instagram://app"];

if ([[UIApplication sharedApplication] canOpenURL:instagramURL])
{

    NSString  *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/Insta_Images/%@",@"shareImage.png"]];


    NSURL *igImageHookFile = [[NSURL alloc] initWithString:[[NSString alloc] initWithFormat:@"file://%@", jpgPath]];


    docController.UTI = @"com.instagram.photo";

    docController = [self setupControllerWithURL:igImageHookFile usingDelegate:self];

    docController =[UIDocumentInteractionController interactionControllerWithURL:igImageHookFile];

    docController.delegate=self;

    [docController presentOpenInMenuFromRect:CGRectMake(0 ,0 , 612, 612) inView:self.view animated:YES];

1

당신이 세우면 나는 눈치 URL로 이미지를 가리키는 activityItems대신 UIImage, Copy to Instagram활동 항목 자체가 나타납니다, 당신은 다른 작업을 수행 할 필요가 없습니다. 참고 String내부 객체는 activityItems폐기 될 것이며, 인스 타 그램에 미리 작성된 자막 할 수있는 방법은 없습니다. 그래도 사용자에게 특정 캡션을 게시하도록 힌트하려면 이 요점 과 같이 해당 텍스트를 클립 보드에 복사하고 사용자에게 알리는 사용자 지정 활동을 만들어야 합니다.


1
    @import Photos;

    -(void)shareOnInstagram:(UIImage*)imageInstagram {

        [self authorizePHAssest:imageInstagram];
    }

    -(void)authorizePHAssest:(UIImage *)aImage{

        PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];

        if (status == PHAuthorizationStatusAuthorized) {
            // Access has been granted.
            [self savePostsPhotoBeforeSharing:aImage];
        }

        else if (status == PHAuthorizationStatusDenied) {
            // Access has been denied.
        }

        else if (status == PHAuthorizationStatusNotDetermined) {

            // Access has not been determined.
            [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {

                if (status == PHAuthorizationStatusAuthorized) {
                    // Access has been granted.
                    [self savePostsPhotoBeforeSharing:aImage];
                }
            }];
        }

        else if (status == PHAuthorizationStatusRestricted) {
            // Restricted access - normally won't happen.
        }
    }
    -(void)saveImageInDeviceBeforeSharing:(UIImage *)aImage
    {
        UIImageWriteToSavedPhotosAlbum(aImage, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
    }

    - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo: (void *) contextInfo;
    {
        if (error == nil){
            [self sharePostOnInstagram];
        }
    }

    -(void)shareImageOnInstagram
    {
        PHFetchOptions *fetchOptions = [PHFetchOptions new];
        fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:false]];
        PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:fetchOptions];

        __block PHAsset *assetToShare = [result firstObject];

        if([assetToShare isKindOfClass:[PHAsset class]])
        {
            NSString *localIdentifier = assetToShare.localIdentifier;
            NSString *urlString = [NSString stringWithFormat:@"instagram://library?LocalIdentifier=%@",localIdentifier];
            NSURL *instagramURL = [NSURL URLWithString:urlString];
            if ([[UIApplication sharedApplication] canOpenURL: instagramURL])
            {
                [[UIApplication sharedApplication] openURL:instagramURL options:@{} completionHandler:nil];
            } else
            {
                NSLog(@"No instagram installed");
            }
        }
    }

참고 :-IMP TODO :-Info.plist에 아래 키 추가

<key>LSApplicationQueriesSchemes</key>
<array>
<string>instagram</string>
</array>

0

이 코드를 사용했습니다.

    NSString* filePathStr = [[NSBundle mainBundle] pathForResource:@"UMS_social_demo" ofType:@"png"];
NSURL* fileUrl = [NSURL fileURLWithPath:filePathStr];

NSString  *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/test.igo"];
[[NSData dataWithContentsOfURL:fileUrl] writeToFile:jpgPath atomically:YES];

NSURL* documentURL = [NSURL URLWithString:[NSString stringWithFormat:@"file://%@", jpgPath]];

UIDocumentInteractionController *interactionController = [UIDocumentInteractionController interactionControllerWithURL: documentURL];
self.interactionController = interactionController;
interactionController.delegate = self;
interactionController.UTI = @"com.instagram.photo";
CGRect rect = CGRectMake(0 ,0 , 0, 0);
[interactionController presentOpenInMenuFromRect:rect inView:self.view animated:YES];

0
-(void)shareOnInstagram {

    CGRect rect = CGRectMake(self.view.frame.size.width*0.375 ,self.view.frame.size.height/2 , 0, 0);



    NSString * saveImagePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/ShareInstragramImage.igo"];

    [UIImagePNGRepresentation(_image) writeToFile:saveImagePath atomically:YES];

    NSURL *igImageHookFile = [[NSURL alloc] initWithString:[[NSString alloc] initWithFormat:@"file://%@", saveImagePath]];

    self.documentController=[UIDocumentInteractionController interactionControllerWithURL:igImageHookFile];

    self.documentController.UTI = @"com.instagram.exclusivegram";
    self.documentController = [self setupControllerWithURL:igImageHookFile usingDelegate:self];

    [self.documentController presentOpenInMenuFromRect: rect    inView: self.view animated: YES ];

}

-(UIDocumentInteractionController *) setupControllerWithURL: (NSURL*) fileURL usingDelegate: (id <UIDocumentInteractionControllerDelegate>) interactionDelegate {

    UIDocumentInteractionController *interactionController = [UIDocumentInteractionController interactionControllerWithURL: fileURL];
    interactionController.delegate = interactionDelegate;
    return interactionController;
}

1
이 코드가 질문에 답할 수 있지만 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 답변의 장기적인 가치가 향상됩니다.
thewaywewere

0
 NSURL *myURL = [NSURL URLWithString:sampleImageURL];
                    NSData * imageData = [[NSData alloc] initWithContentsOfURL:myURL];
                    UIImage *imageToUse = [[UIImage alloc] initWithData:imageData];
                    NSString *documentDirectory=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
                    NSString *saveImagePath=[documentDirectory stringByAppendingPathComponent:@"Image.ig"];
                    [imageData writeToFile:saveImagePath atomically:YES];
                    NSURL *imageURL=[NSURL fileURLWithPath:saveImagePath];
                    self.documentController = [UIDocumentInteractionController interactionControllerWithURL:imageURL];
                    self.documentController.delegate = self;
                    self.documentController.annotation = [NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@""], @"", nil];
                    self.documentController.UTI = @"com.instagram.exclusivegram";
                    [self.documentController presentOpenInMenuFromRect:CGRectMake(1, 1, 1, 1) inView:self.view animated:YES];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.