Bagaimana cara membagikan gambar di Instagram di iOS?

87

Klien saya ingin membagikan gambar di Instagram, Twitter, Facebook.

Saya telah melakukan Twitter dan Facebook tetapi tidak menemukan API atau apa pun di internet untuk berbagi gambar di Instagram. Apakah mungkin untuk membagikan gambar di Instagram? jika ya lalu bagaimana?

Ketika saya memeriksa situs pengembang Instagram, saya telah menemukan Perpustakaan Ruby on Rails dan Python. Tetapi tidak ada dokumentasi Sdk iOS

Saya telah mendapatkan token dari instagram sesuai instagram.com/developer tetapi sekarang tidak tahu apa yang harus dilakukan langkah selanjutnya untuk berbagi dengan gambar instagram.

Hiren
sumber

Jawaban:

70

Akhirnya saya mendapat jawabannya. Anda tidak bisa langsung memposting gambar di instagram. Anda harus mengubah gambar Anda dengan 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;
}

CATATAN: setelah Anda mengarahkan ke aplikasi Instagram, Anda tidak dapat kembali ke aplikasi Anda. Anda harus membuka aplikasi Anda lagi

Unduh sumber dari sini

Hiren
sumber
di mana fungsi setupControllerWithURL atau fungsinya?
khaled
3
@SurenderRathore Anda harus menskalakan gambar Anda menjadi 612 * 612 dan menyimpannya ke dalam format .ig .ig menunjukkan bahwa Anda ingin membuka gambar Anda ke instagram dan Anda harus mengujinya di iPhone atau iPod hingga versi 4.3. iPad tidak didukung
Hiren
1
@HiRen: Ya, Anda benar tetapi di aplikasi saya, saya mengambil tangkapan layar dari suatu tampilan dan kemudian membagikan tangkapan layar itu melalui aplikasi Instagram dan itu berfungsi dengan baik. Tetapi saya juga ingin meneruskan beberapa teks statis dengan tangkapan layar itu. Jika Anda punya ide tolong bantu saya. Ada kode demo di github untuk DMACtivityInstagram dan Anda dapat melihat dari sana apa yang saya coba katakan. Terima kasih sebelumnya.
Manthan
2
Menggunakan baris ini membuat saya mogok di iOS 6: NSURL * igImageHookFile = [[NSURL alokasi] initWithString: [[NSString alokasi] initWithFormat: @ "file: //% @", jpgPath]]; Menggunakan ini bekerja di kedua: NSURL * igImageHookFile = [NSURL fileURLWithPath: jpgPath]; Mungkin layak untuk mengedit jawaban yang sesuai, kecuali jika saya melewatkan sesuatu?
weienw
1
apakah ini hanya saya, atau apakah ada orang lain yang ingin mengatakan "hai Instagram, Anda pernah menjadi pengembang, mengapa Anda membuat hidup kita sesulit ini?"
Chris Chen
27

Berikut adalah kode yang diuji penuh untuk Mengunggah gambar + teks teks ke Instagram ..

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

ATAU

-(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", @"")
    }
}

dan Tulis ini ke .plist

<key>LSApplicationQueriesSchemes</key>
    <array>
        <string>instagram</string>
    </array>
Hardik Thakkar
sumber
apakah mungkin untuk kembali ke aplikasi setelah berbagi gambar di Instagram?
Hiren
tidak ... kami harus kembali secara manual ... tetapi jika saya menemukan solusi, saya akan memperbarui kode ...
Hardik Thakkar
Saya memilih tombol Instagram tetapi tidak ada yang terjadi setelah itu? Apakah ada kode tambahan di luar jawaban ini untuk melakukan itu?
noobsmcgoobs
Aplikasi Instagram terinstal di perangkat Anda?
Hardik Thakkar
1
@HardikThakkar ketika saya menggunakan solusi Anda, saya hanya mendapatkan pilihan aplikasi untuk dipilih, bukan Instagram. IOS 11. Apakah Anda tahu apakah masih berfungsi? Terima kasih
Vladyslav Melnychenko
22

Anda dapat menggunakan salah satu skema url yang disediakan oleh Instagram

masukkan deskripsi gambar di sini

  1. Dok resmi Instagram di sini

  2. Bagikan dengan 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. Bagikan dengan pengalihan langsung

    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. ekstensi untuk mengubah ukuran foto ke ukuran yang disarankan

    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. Jangan lupa untuk menambahkan skema yang diperlukan di plist

  <key>LSApplicationQueriesSchemes</key>
  <array>
       <string>instagram</string> 
  </array>
hbk
sumber
1
Mencoba banyak hal lain dari jawaban lain dan hanya ini yang berhasil (setidaknya untuk video. "Instagram: // library? LocalIdentifier =" adalah yang berhasil. Terima kasih banyak!
Bjorn Roche
Berbagi dengan pengalihan langsung (yang sejauh ini merupakan solusi terbaik IMO) tidak lagi berfungsi untuk saya - Instagram terbuka di halaman perpustakaan tetapi tidak memilih gambar sebelumnya. Apakah Anda tahu apa yang mungkin berubah dengan skema URL ini? Apakah Anda mengalami kegagalan serupa dengan versi terbaru Instagram di iOS?
urchino
@gbk Kode ini bekerja untuk saya. Tapi saya punya persyaratan baru untuk mendapatkan banyak foto di Instagram. Seperti Instagram memiliki opsi baru beberapa unggahan dan tampilan seperti tampilan slide. Apakah Anda bagaimana melakukan ini? Tolong bantu aku.
Ekta Padaliya
Sialan. Terima kasih untuk ini. Saya telah membenturkan kepala ke dinding selama beberapa hari terakhir mencoba berbagi ke Instagram dari aplikasi saya agar berfungsi dengan baik.
Jesse S.
2
hanya varian 3 yang berfungsi untuk saya untuk ios 13, btw jangan lupa untuk menambahkan <key> NSPhotoLibraryUsageDescription </key> <string> Aplikasi membutuhkan foto telanjang Anda. </string>
serg_zhd
14

Semoga jawaban ini akan menyelesaikan pertanyaan Anda. Ini secara langsung akan membuka folder perpustakaan di Instagram, bukan di Kamera.

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];
        }
    }];
Pratik Patel
sumber
1
Apakah menemukan bahwa setiap kali Anda melakukan ini, aplikasi Instagram akan memuat pilih gambar sebelumnya? Saya pikir ada yang salah dengan tautan jalur aset.
Supertecnoboff
2
Luar biasa !! Jadi Instagram bisa dibuka Langsung tanpa UIDocumentInteractionController.Thanks.
iChirag
Dapatkah Anda membantu saya dengan kasus ini stackoverflow.com/questions/34226433/…
jose920405
Bisakah kita juga melewatkan URL dengan gambar?
Alok
1
Sayangnya, ALAssetsLibrary tidak digunakan lagi sejak iOS 9.
Alena
10

jika Anda tidak ingin menggunakan 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)
            }

        }
    }
Zuhair Hussain
sumber
Itu yang saya butuhkan. Terima kasih!
Azel
Anda menyelamatkan hidup saya, jawaban sempurna. Terima kasih !!
technerd
1
Ini benar-benar salah setiap kali saya mengklik untuk berbagi di instagram & membatalkan penyimpanannya ke rol kamera.
Shrikant K
9

Untuk iOS 6 dan di atasnya, Anda dapat menggunakan UIActivity ini untuk mengunggah gambar ke Instagram yang memiliki alur kerja yang sama menggunakan pengait iOS tetapi menyederhanakan pengembangan:

https://github.com/coryalder/DMActivityInstagram

Chintan Patel
sumber
hai @Chintan Patel bagaimana saya bisa mendapatkan informasi profil pengguna jika Anda memiliki sumber sampel, silakan bagikan dengan kami
sabir
6

ini adalah jawaban yang benar yang saya implementasikan dengan detail. Dalam file .h

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

file in.m hanya menulis

 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");

 }

Pasti Anda akan mendapatkan hasil. Misalnya Anda akan melihat popover dari bawah dengan gambar instagram. Klik di atasnya dan bersenang-senang.

Lalit
sumber
5

Saya mencoba ini di aplikasi saya dan berfungsi dengan sempurna (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)

 }
pankaj kshatriya
sumber
2

Inilah jawaban yang benar. Anda tidak dapat langsung memposting gambar di Instagram. Anda perlu mengalihkan ke Instagram menggunakan UIDocumentInteractionController ...

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

}

CATATAN: setelah Anda mengarahkan ke aplikasi Instagram, Anda tidak dapat kembali ke aplikasi Anda. Anda harus membuka aplikasi Anda lagi

VM Anooj
sumber
Anda menetapkan delegasi tetapi tidak menulis / mempostingnya?
Raptor
2

Anda dapat melakukannya tanpa menggunakan UIDocumentInteractionController dan langsung membuka Instagram dengan 3 metode berikut:

Ini berfungsi seperti semua aplikasi terkenal lainnya. Kode tersebut ditulis di Objective c, jadi Anda bisa menerjemahkannya ke swift jika Anda mau. Yang perlu Anda lakukan adalah menyimpan gambar Anda ke perangkat dan menggunakan URLScheme

tambahkan ini di dalam file .m Anda

#import <Photos/Photos.h>

Pertama, Anda perlu menyimpan UIImage Anda ke perangkat dengan metode ini:

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

Metode ini adalah panggilan balik untuk menyimpan gambar ke perangkat Anda:

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

}

Setelah gambar disimpan ke perangkat, Anda perlu menanyakan gambar yang baru saja Anda simpan dan mendapatkannya sebagai 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");
        }

    }
}

Dan jangan lupa untuk memasukkan ini ke info.plist Anda di bawah LSApplicationQueriesSchemes

<string>instagram</string>

aviv_elk
sumber
Bagaimana cara menambahkan banyak foto di 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];
    }
}

Saya mencoba ini di aplikasi saya dan itu pasti akan berhasil

neha_sinha19
sumber
Mungkin Anda harus menjelaskan UIUtils& UICachedFileMgr?
Raptor
Memahami. Sarankan untuk mengedit jawaban Anda untuk memberikan detail lebih lanjut
Raptor
@Raptor: Silakan unduh aplikasi sampel dari berikut ini: tautan
neha_sinha19
UIUtils adalah kelas yang saya buat untuk mengelola metode utilitas. Ini berasal dari NSObject. Saya telah menambahkan metode messageAlert untuk menampilkan tampilan peringatan. Dalam contoh aplikasi yang tautannya telah saya berikan di atas, Anda dapat menemukan kelas UIUtils. Semoga kalian mengerti.
neha_sinha19
1

Bagi saya, cara terbaik dan termudah dijelaskan di sini Bagikan foto ke Instagram dari Aplikasi iOS saya

Anda perlu menyimpan gambar di perangkat menggunakan format .igo, lalu gunakan "UIDocumentInteractionController" untuk mengirim aplikasi Instagram jalur lokal. Jangan lupa untuk menyetel "UIDocumentInteractionControllerDelegate"

Saran saya adalah menambahkan sesuatu seperti:

NSURL *instagramURL = [NSURL URLWithString:@"instagram://app"];
if ([[UIApplication sharedApplication] canOpenURL:instagramURL]) 
{
 <your code>
}
Dmitry Soloviov
sumber
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];
fkb
sumber
1

Saya perhatikan jika Anda meletakkan URLmenunjuk ke gambar activityItemsalih-alih UIImage, Copy to Instagramitem aktivitas muncul dengan sendirinya, dan Anda tidak perlu melakukan apa pun. Harap dicatat bahwa Stringobjek di dalamnya activityItemsakan dibuang dan tidak ada cara untuk mengisi teks di Instagram. Jika Anda masih ingin memberi petunjuk kepada pengguna untuk memposting teks tertentu, Anda perlu membuat aktivitas khusus di mana Anda menyalin teks itu ke papan klip dan memberi tahu pengguna tentangnya, seperti dalam inti ini .

Almas Sapargali
sumber
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");
            }
        }
    }

CATATAN: - IMP TODO: - Tambahkan kunci di bawah ini di Info.plist

<key>LSApplicationQueriesSchemes</key>
<array>
<string>instagram</string>
</array>
CrazyPro007
sumber
0

Saya menggunakan kode ini:

    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];
dhar
sumber
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;
}
Kasun Palihakkara
sumber
1
Meskipun kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa kode ini memecahkan masalah akan meningkatkan nilai jawaban jangka panjang.
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];
naresh kolindala
sumber