【Objective-C】アプリで作成した動画をInstagramでシェアする

Unityでアプリを作成している際、Instagramに動画をシェアする必要が出てきたのですが、iOSだとサードパーティ製のアプリから直接動画を投稿する方法が記載されていないのでいろいろ調べました。

スポンサーリンク

事前準備

事前準備としてXcodeプロジェクトのinfo.plistに以下を設定する必要があります。

Key Type Value
LSApplicationQueriesSchemes Array instagram

ソースコード

基本はUnityのSNS連携プラグイン「Social Connector v0.2.9」をベースにObjective-Cのコードを作成してます。必要な部分のみを抜き出してるので自分の環境用に読み解いてください。
Objective-Cというものを初めて触ったため、エラー処理とかそういったものは全く考慮してません。
そのあたりは空気を読んでご自身で対応をお願いします←丸投げ

void PostMessage(const char *movieURL) {

    NSString *_movieURL = [NSString stringWithUTF8String:movieURL ? movieURL : ""];

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

        NSURL *videoFilePath = [NSURL fileURLWithPath:_movieURL];
        NSString *caption = @"";
        ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
        [library writeVideoAtPathToSavedPhotosAlbum:videoFilePath completionBlock:^(NSURL *assetURL, NSError *error) {
            NSURL *instagramURL = [NSURL URLWithString:[NSString stringWithFormat:@"instagram://library?AssetPath=%@&InstagramCaption=%@",[[assetURL absoluteString] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]],]]];
            if ([[UIApplication sharedApplication] canOpenURL:instagramURL]) {
                [[UIApplication sharedApplication] openURL:instagramURL];
            } else {
                NSLog(@"Can't open Instagram");
            }
        }];

    } else {
        // Instagramがインストールされていない
        // 必要なら適当にエラー処理
    }

}

やってることは作成した動画をカメラロールに登録して、登録した動画のassetURLをInstagramの起動パスに設定するって感じです。

愚痴

公式で公開しているiPhone Hooksには動画をシェアする方法が記載されてなかったので、海外のサイトとかいろいろ調べてようやくこのやり方にたどり着きました。
AndroidならIntentに突っ込んでmimeタイプをVideoにするだけで終わるのに…。