Wie teile ich ein Bild auf Instagram in iOS?

87

Mein Kunde möchte ein Bild auf Instagram, Twitter, Facebook teilen.

Ich habe Twitter und Facebook gemacht, aber keine API oder etwas im Internet gefunden, um Bilder auf Instagram zu teilen. Ist es möglich, Bilder auf Instagram zu teilen? wenn ja dann wie?

Wenn ich die Entwicklerseite von Instagram überprüfe, habe ich die Bibliotheken von Ruby on Rails und Python gefunden. Es gibt jedoch keine Dokumentation zu iOS Sdk

Ich habe ein Token von instagram gemäß instagram.com/developer erhalten, weiß aber jetzt nicht, was ich als nächstes tun soll, um es mit einem instagram-Bild zu teilen.

Hiren
quelle
Irgendeine Idee auf stackoverflow.com/questions/28858512/… ?
Ashok

Antworten:

70

Endlich habe ich die Antwort bekommen. Sie können ein Bild nicht direkt auf Instagram posten. Sie müssen Ihr Bild mit UIDocumentInteractionController neu festlegen.

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

HINWEIS: Sobald Sie zur Instagram-App umgeleitet haben, können Sie nicht mehr zu Ihrer App zurückkehren. Sie müssen Ihre App erneut öffnen

Quelle von hier herunterladen

Hiren
quelle
Wo ist die Funktion setupControllerWithURL oder wo?
Khaled
3
@SurenderRathore Sie müssen Ihr Bild in 612 * 612 skalieren und im .ig-Format speichern .ig zeigt an, dass Sie Ihr Bild in Instagram öffnen möchten und dass Sie es auf Ihrem iPhone oder iPod bis Version 4.3 testen müssen. iPad wird nicht unterstützt
Hiren
1
@HiRen: Ja, Sie haben Recht, aber in meiner App mache ich einen Screenshot einer Ansicht und teile diesen Screenshot dann über die Instagram-App und er funktioniert perfekt. Ich möchte aber auch statischen Text mit diesem Screenshot übergeben. Wenn Sie eine Idee haben, helfen Sie mir bitte. Auf github gibt es einen Demo-Code für DMACtivityInstagram, und Sie können von dort aus sehen, was ich zu sagen versuche. Danke im Voraus.
Manthan
2
Die Verwendung dieser Zeile führte in iOS 6 zu einem Absturz: NSURL * igImageHookFile = [[NSURL-Zuweisung] initWithString: [[NSString-Zuweisung] initWithFormat: @ "file: //% @", jpgPath]]; Dies funktioniert in beiden Fällen: NSURL * igImageHookFile = [NSURL fileURLWithPath: jpgPath]; Könnte es sich lohnen, die Antwort entsprechend zu bearbeiten, es sei denn, ich vermisse etwas?
Weienw
1
Ist das nur ich oder will jemand anderes sagen "Hey Instagram, du warst einmal Entwickler, warum machst du unser Leben so schwer?"
Chris Chen
27

Hier ist ein vollständig getesteter Code zum Hochladen von Bild- und Untertiteltext auf Instagram.

in.h Datei

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

ODER

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

und schreiben Sie dies in .plist

<key>LSApplicationQueriesSchemes</key>
    <array>
        <string>instagram</string>
    </array>
Hardik Thakkar
quelle
Ist es möglich, nach dem Teilen von Bildern auf Instagram zur Anwendung zurückzukehren?
Hiren
nein ... wir müssen manuell zurückkommen ... aber wenn ich eine Lösung gefunden habe, werde ich den Code aktualisieren ...
Hardik Thakkar
Danke @Fahim Parkar
Hardik Thakkar
Ich wähle den Instagram-Button, aber danach passiert nichts mehr. Gibt es darüber hinaus zusätzlichen Code, um dies zu tun?
Noobsmcgoobs
1
@HardikThakkar Wenn ich Ihre Lösung verwende, kann ich nur eine Auswahl von Apps auswählen, nicht Instagram. IOS 11. Weißt du, ob es noch funktioniert? Vielen Dank
Vladyslav Melnychenko
21

Sie können eines der von Instagram bereitgestellten URL-Schemata verwenden

Geben Sie hier die Bildbeschreibung ein

  1. Instagram oficial doc hier

  2. Mit UIDocumentInteractionController teilen

    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. Mit direkter Weiterleitung teilen

    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. Erweiterung für die Größenänderung des Fotos auf die empfohlene Größe

    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. Vergessen Sie nicht, das erforderliche Schema in plist hinzuzufügen

  <key>LSApplicationQueriesSchemes</key>
  <array>
       <string>instagram</string> 
  </array>
gbk
quelle
1
Versuchte eine Reihe anderer Dinge aus anderen Antworten und nur dies funktionierte (zumindest für Videos. Das "instagram: // library? LocalIdentifier =" war das, was es getan hat. Vielen Dank!
Björn Roche
Die Freigabe mit direkter Weiterleitung (die bei weitem die beste IMO-Lösung ist) funktioniert bei mir nicht mehr - Instagram wird auf der Bibliotheksseite geöffnet, wählt jedoch kein Bild vor. Haben Sie eine Idee, was sich an diesem URL-Schema geändert haben könnte? Treten bei der neuesten Version von Instagram unter iOS ähnliche Fehler auf?
Urchino
@gbk Dieser Code funktioniert für mich. Aber ich habe neue Anforderungen an mehrere Fotos in Instagram. Wie Instagram haben neue Option mehrere Upload und Anzeige wie Folienansicht. Wie geht das? Bitte hilf mir.
Ekta Padaliya
Heilige Scheiße. Danke dafür. Ich habe den Kopf für den letzten Tag gegen eine Wand geschlagen und versucht, das Teilen von Instagram von meiner App aus zu ermöglichen, damit es gut funktioniert.
Jesse S.
2
Für ios 13 funktioniert nur die 3-fache Variante. Vergessen Sie nicht, die <key> NSPhotoLibraryUsageDescription </ key> <string> -App hinzuzufügen. </ string>
serg_zhd
17

Hoffe, diese Antwort wird Ihre Anfrage lösen. Dadurch wird der Bibliotheksordner direkt in Instagram anstelle der Kamera geöffnet.

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
quelle
1
Finden Sie heraus, dass die Instagram-App jedes Mal, wenn Sie dies tun, das vorherige Bild auswählt? Ich denke, mit dem Asset-Pfad-Link stimmt etwas nicht.
Supertecnoboff
2
ausgezeichnet !! So kann Instagram direkt ohne UIDocumentInteractionController geöffnet werden. Danke.
iChirag
Können Sie mir in diesem Fall helfen stackoverflow.com/questions/34226433/…
jose920405
Können wir die URL auch mit Bild übergeben?
Alok
1
Leider ist ALAssetsLibrary seit iOS 9 veraltet.
Alena
9

Für iOS 6 und höher können Sie diese UIActivity verwenden, um Bilder auf Instagram hochzuladen, das denselben Workflow mit iOS-Hooks hat, aber die Entwicklung vereinfacht:

https://github.com/coryalder/DMActivityInstagram

Chintan Patel
quelle
hi @Chintan Patel Wie kann ich Benutzerprofilinformationen erhalten, wenn Sie eine Beispielquelle haben? Bitte teilen Sie uns diese mit
Sabir
9

Wenn Sie UIDocumentInteractionController nicht verwenden möchten

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
quelle
Es ist das, was ich wirklich brauche. Vielen Dank!
Azel
Du hast mein Leben gerettet, perfekte Antwort. Vielen Dank !!
Technerd
1
Dies ist jedes Mal völlig falsch, wenn ich auf Instagram klicke, um es zu teilen, und das Speichern auf der Kamerarolle abgebrochen habe.
Shrikant K
6

Dies ist die richtige Antwort, die ich mit Detail umsetze. In der .h-Datei

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

in.m Datei nur schreiben

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

 }

Mit Sicherheit erhalten Sie ein Ergebnis. ZB sehen Sie Popover von unten mit Instagram-Bild. Klicken Sie darauf und haben Sie Spaß.

Lalit
quelle
5

Ich habe dies in meiner Anwendung versucht und es funktioniert perfekt (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
quelle
2

Hier ist die richtige Antwort. Du kannst kein Bild direkt auf Instagram posten. Sie müssen mit UIDocumentInteractionController zu Instagram umleiten ...

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

}}

HINWEIS: Sobald Sie zur Instagram-App umgeleitet haben, können Sie nicht mehr zu Ihrer App zurückkehren. Sie müssen Ihre App erneut öffnen

Anooj VM
quelle
Sie haben den Delegierten festgelegt, ihn aber nicht geschrieben / veröffentlicht?
Raptor
2

Sie können dies tun, ohne den UIDocumentInteractionController zu verwenden, und mit diesen drei Methoden direkt zu Instagram wechseln:

Es funktioniert genauso wie alle anderen bekannten Apps. Der Code ist in Ziel c geschrieben, sodass Sie ihn bei Bedarf in schnell übersetzen können. Sie müssen lediglich Ihr Bild auf dem Gerät speichern und ein URLScheme verwenden

Fügen Sie dies in Ihre .m-Datei ein

#import <Photos/Photos.h>

Zuerst müssen Sie Ihr UIImage mit dieser Methode auf dem Gerät speichern:

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

Diese Methode ist der Rückruf zum Speichern des Bildes auf Ihrem Gerät:

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

}

Nachdem das Bild auf dem Gerät gespeichert wurde, müssen Sie das gerade gespeicherte Bild abfragen und als PHAsset abrufen

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

    }
}

Und vergessen Sie nicht, dies in Ihre info.plist unter aufzunehmen LSApplicationQueriesSchemes

<string>instagram</string>

aviv_elk
quelle
Wie kann ich mehrere Fotos auf Instagram hinzufügen?
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];
    }
}

Ich habe dies in meiner Anwendung versucht und es wird definitiv funktionieren

neha_sinha19
quelle
Vielleicht solltest du UIUtils& erklären UICachedFileMgr?
Raptor
Verstehen. Schlagen Sie vor, Ihre Antwort zu bearbeiten, um weitere Details bereitzustellen
Raptor
@Raptor: Bitte laden Sie die Beispiel-App von folgendem herunter: link
neha_sinha19
UIUtils ist eine Klasse, die ich zum Verwalten von Dienstprogrammmethoden erstellt habe. Sie wird von NSObject abgeleitet. Ich habe die messageAlert-Methode hinzugefügt, um die Alarmansicht anzuzeigen. In der Beispiel-App, deren Link ich oben angegeben habe, finden Sie die UIUtils-Klasse. Hoffentlich wirst du verstehen.
neha_sinha19
1

Was mich betrifft, der beste und einfachste Weg, der hier beschrieben wird. Teile Fotos von meiner iOS-App an Instagram

Sie müssen das Bild im .igo-Format auf dem Gerät speichern und dann mit "UIDocumentInteractionController" die Instagram-App für den lokalen Pfad senden. Vergessen Sie nicht, "UIDocumentInteractionControllerDelegate" festzulegen.

Mein Rat ist, etwas hinzuzufügen wie:

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

Mir ist aufgefallen , dass das Aktivitätselement selbst angezeigt wird, wenn Sie URLauf das Bild activityItemsanstatt auf zeigen, und Sie nichts anderes tun müssen. Bitte beachten Sie, dass darin enthaltene Objekte verworfen werden und es keine Möglichkeit gibt, Untertitel in Instagram vorab auszufüllen. Wenn Sie den Benutzer dennoch anweisen möchten, eine bestimmte Beschriftung zu veröffentlichen, müssen Sie eine benutzerdefinierte Aktivität erstellen, in der Sie diesen Text in die Zwischenablage kopieren und den Benutzer darüber informieren, wie in dieser Übersicht .UIImageCopy to InstagramStringactivityItems

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

HINWEIS: - IMP TODO: - Fügen Sie den folgenden Schlüssel in Info.plist hinzu

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

Ich habe diesen Code verwendet:

    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
quelle
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
quelle
1
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
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
quelle