8

ある意味では、iOS アプリの「Vine」に似たものを作成していると言えます。ユーザーが動画をアップロードして他のユーザーが視聴できるようにするソーシャル ネットワーク。私のプロジェクト全体はほとんど準備ができています。私はParseというデータベース サービスを使用していますが、そこにはあまりストレージがなく、スケールアップしたい場合は高価になります。私はすでに持っているデータベースを使用できると考えており、「ビデオ」のSQLテーブルには、実際のビデオファイルにリンクするURL列があります。データストレージサービスを探していて、Google の「Cloud Storage」を見つけました。

可能であれば、私が本当に探しているのは、次のようなユースケースです。

  1. クライアント アプリには、アップロードする準備ができているビデオがあります。
  2. ビデオファイルをアップロードしますsome-cloud-service.com/myCompany/videoNameID.mp4
  3. この URL をデータベースの「ビデオ オブジェクト」の URL フィールドに保存します。
  4. 他のユーザーが動画のリストを取得すると、名前と URL のコレクションが取得されます
  5. ユーザーが特定の動画を再生したい場合は、テーブル内の URL から取得します。

アプリのファイルをアップロードしてアクセスする場所としてクラウド ストレージを使用できると考えていました。私は Google の Cloud Storage の API とドキュメントを調べてきましたが、そこには役に立たないことがたくさんあり、そのほとんどを理解していません。「Cloud Storage」は私が思っているものではないと思い始めています。iOS アプリ (および後で Web サイト) から直接、潜在的に膨大な量の大きなファイルをアップロードする場所が必要なだけです。Parse が提供するデータ ストレージ サービスは完璧ですが、サイズが非常に限られています。高額になる可能性があることは承知しています。これの値段を読むとグーグルサービス、それは安くてまさに私が必要としているものに見えましたが、可能であれば、それを使用して「資格情報」を使用してファイルを直接アップロードし、ファイルが終了した場所と引き換えにURLを受け取る方法がわかりません上。

これに Google の Cloud Storage を使用できますか? または、他の何か?または、Cloud Storage の使用方法を完全に誤解していますか?

4

3 に答える 3

8

実際、Google サービスの Objective-C ラッパー ライブラリには、非常に詳細なドキュメントがあります: https://code.google.com/p/google-api-objectivec-client/wiki/Introduction#Preparing_to_Use_the_Library

このラッパー ライブラリは、基盤となる JSON API に基づいて自動的に生成されることがわかります。したがって、すべての GTLStorage... クラスは、Google Storage の JSON API を模倣します。実際の API 呼び出しを実行するためのクラスは GTLQueryStorage です。

その JSON ドキュメントを見ると、データをバケットに格納するために使用されるオブジェクト クラスがあることがわかります: https://developers.google.com/storage/docs/json_api/v1/#Objects メソッド新しいオブジェクトをアップロードするのは「挿入」です

GTLQueryStorage.h ファイルに戻ると、バケットに新しいオブジェクトを挿入する対応する Objective-C メソッドが見つかります。

// Method: storage.objects.insert
// Stores new data blobs and associated metadata.
//  Required:
//   bucket: Name of the bucket in which to store the new object. Overrides the
//     provided object metadata's bucket value, if any.
//  Optional:
//   ifGenerationMatch: Makes the operation conditional on whether the object's
//     current generation matches the given value.
//   ifGenerationNotMatch: Makes the operation conditional on whether the
//     object's current generation does not match the given value.
//   ifMetagenerationMatch: Makes the operation conditional on whether the
//     object's current metageneration matches the given value.
//   ifMetagenerationNotMatch: Makes the operation conditional on whether the 
//     object's current metageneration does not match the given value.
//   name: Name of the object. Required when the object metadata is not
//     otherwise provided. Overrides the object metadata's name value, if any.
//   projection: Set of properties to return. Defaults to noAcl, unless the
//     object resource specifies the acl property, when it defaults to full.
//      kGTLStorageProjectionFull: Include all properties.
//      kGTLStorageProjectionNoAcl: Omit the acl property.
//  Upload Parameters:
//   Accepted MIME type(s): */*
//  Authorization scope(s):
//   kGTLAuthScopeStorageDevstorageFullControl
//   kGTLAuthScopeStorageDevstorageReadWrite
// Fetches a GTLStorageObject.
+ (id)queryForObjectsInsertWithObject:(GTLStorageObject *)object
                           bucket:(NSString *)bucket
                 uploadParameters:(GTLUploadParameters *)uploadParametersOrNil;

したがって、次のことを行う必要があります。

  • GTLServiceStorage のインスタンスを割り当てる
  • API キーをそのオブジェクトに設定します
  • 適切なバケットで保存したいオブジェクトに対して上記のクラス メソッドを使用して、GTLQueryStorage オブジェクトをインスタンス化します。
  • クエリを実行し、完了 (成功、エラーの場合) を処理する完了ハンドラーを取得するサービス チケットを作成します。
于 2013-08-19T12:08:38.227 に答える
1

遅い応答ですが、これはこの問題で他の人を助けるかもしれません. このコードは動画を GCS にアップロードします (テスト済みで動作中)

最初に認証

これにより、Google 認証ビュー コントローラーがポップされます (「GTMOAuth2ViewTouch.xib」ファイルをプロジェクトに追加する必要があります)。

- (void) uploadVideoToGoogleCloud {

// declare this
//@property (strong, nonatomic) GTLServiceStorage* serviceStorage;
//@property (strong, nonatomic) NSString* accessToken;

_serviceStorage = [[GTLServiceStorage alloc] init];
_serviceStorage = [GTLServiceStorage new];
_serviceStorage.additionalHTTPHeaders = @{@"x-goog-project-id": @"yourGoogleProjectId"};

// authenticate
GTMOAuth2ViewControllerTouch *oAuthVC =
[[GTMOAuth2ViewControllerTouch alloc] initWithScope:kGTLAuthScopeStorageDevstorageReadWrite
                                           clientID:@"yourClientId from Client ID for iOS application"
                                       clientSecret:@"yourSecret from Client ID for iOS application"
                                   keychainItemName:@"use nil or give a name to save in keychain"
                                  completionHandler:^(GTMOAuth2ViewControllerTouch *viewController, GTMOAuth2Authentication *auth, NSError *error) {

                                      _accessToken = [NSString stringWithFormat:@"Bearer %@", [auth.parameters objectForKey:@"access_token"]];

                                      _serviceStorage.additionalHTTPHeaders = @{@"x-goog-project-id": kProjectID, @"Content-Type": @"application/json-rpc", @"Accept": @"application/json-rpc", @"Authorization": _accessToken};

                                      _serviceStorage.authorizer = auth;


                                      dispatch_async(dispatch_get_main_queue(), ^{
                                          [self dismissViewControllerAnimated:YES completion:nil];
                                      });
                                  }];


dispatch_async(dispatch_get_main_queue(), ^{
    [self presentViewController:oAuthVC animated:YES completion:nil];
});
}

認証後に動画をアップロード

ユーザーが正常に認証されたら、これを呼び出してビデオをアップロードします

// upload video file
NSString *filename = @"yourVideoFileNameNoExtension";
NSString *pathToMovie = [[NSBundle mainBundle] pathForResource:filename ofType:@".mp4"];
NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:pathToMovie];
if (fileHandle) {

    GTLUploadParameters *uploadParam =
    [GTLUploadParameters uploadParametersWithFileHandle:fileHandle MIMEType:@"video/mp4"];

    GTLStorageObject *storageObj = [GTLStorageObject object];
    storageObj.name = @"thisWillAppearOnTheBucketAsTheFilename";

    GTLQueryStorage *query = [GTLQueryStorage queryForObjectsInsertWithObject:storageObj bucket:@"your-bucket-name" uploadParameters:uploadParam];

    GTLServiceTicket *ticket = [_serviceStorage executeQuery:query completionHandler:^(GTLServiceTicket *ticket, id object, NSError *error) {
        NSLog(@"error:%@", error ? [error description] : @"query succeeded!");
    }];


    ticket.uploadProgressBlock = ^(GTLServiceTicket *ticket,
                                   unsigned long long numberOfBytesRead,
                                   unsigned long long dataLength) {
        NSLog(@"ticket: %@", ticket);
        NSLog(@"read %llu from %llu bytes", numberOfBytesRead, dataLength);
    };

} else {
    NSLog(@"no video file handle!");
}

お役に立てれば :)

于 2014-04-10T09:59:07.957 に答える