web-dev-qa-db-ja.com

2つ以上のiPhoneアプリケーション間でデータを共有する

同じデバイス上の2つのアプリケーション間でデータを共有することは可能ですか?

または、他のアプリケーションがアプリケーションの情報/データを使用することを許可することはできますか?

たとえば、最初のアプリケーションはイベント管理用であり、それを使用してイベントを保存します。 2番目のアプリケーションはリマインダー用で、イベントについて通知するために他のアプリケーションからデータを取得します。

これは単純な例であり、実際のシナリオではありません。

75
Kamleshwar

歴史的に、iPhoneはアプリ間のデータ共有を防止しようとしてきました。アイデアは、別のアプリのデータにアクセスできなければ、そのアプリに悪いことは何もできないということでした。

IOSの最近のリリースでは、彼らはそれを少し緩めました。たとえば、iOSプログラミングガイドには、あるアプリに特定のURLプレフィックスを要求させ、他のアプリにそのURLを参照させることにより、アプリ間でデータを渡すセクションがあります。そのため、Webサーバーが「http://」URLに応答するのと同じ方法で、「event://」URLに応答するようにイベントアプリを設定します。

そのアプローチに関するAppleのドキュメントは here です。

「カスタムURLスキームの実装」をご覧ください。

33
baudot

sandboxediOS開発の世界では、アプリケーション間でデータを共有することは困難です。iOS開発者はfile system、アプリケーションの代替ソリューションを見つける必要があります。一般的なソリューションには次のものがあります。

  • UIDocumentInteractionController

  • UIActivityViewController

  • 共有キーチェーンアクセス

  • カスタムURLスキーム

  • ウェブサービス

  • iCloud API


UIDocumentInteractionController:

ユーザーは、特定のドキュメントを処理できるとして登録されている他のアプリケーションでドキュメントを開くことができますUniform Type Identifier(UTI)

UIDocumentInteractionControllerは、デバイス上の他のアプリケーションでドキュメントを開く手段として、たとえばメールアプリからの電子メールの添付ファイルを開くために、過去に使用されてきました。

UIDocumentInteractionController

残念ながら、UIDocumentInteractionControllerのUIには6つのアプリケーションしか表示されません

リストにアプリケーションが表示されることを保証することはできません。 UIDocumentInteractionControllerは非推奨ではありませんが、UIActivityViewControllerはiOS 6.0以降のより柔軟な代替を提供します。

可用性:iOS 3.2+

長所:

  • さまざまなアプリケーションと共通のデータ型を共有できます。

短所:

  • UIDocumentInteractionControllerに送信されるデータのタイプを制御できますが、宛先は制御できません。

  • 追加のユーザー操作が必要です。

  • データ送信先の数が限られているため、アプリケーションがリストに表示されない場合があります。


UIActivityViewController:

ユーザーがデータの配列を使用して多くのアクションを実行できるようにします。

たとえば、印刷、電子メール、コピー、ソーシャルメディアへの投稿、または別のアプリケーションで開くことができます。

ユーザーにカスタムサービスを提供するために、独自のUIActivityサブクラスを作成できます。

UIActivityController

可用性:iOS 6.0+

長所:

  • さまざまなアプリケーションやソーシャルメディアで一般的なデータタイプを共有するのに最適です。

  • アクティビティへのアプリケーションのアイテムの配列を提供できます。オブジェクトはUIActivityItemSourceプロトコルに準拠する必要があります。

  • 除外されたアクティビティタイプを設定する機能があります。

  • ページングUIでは、UIDocumentInteractionControllerよりも多くのデータ宛先を使用できます。

短所:

  • 一般的なデータ型の「開く...」宛先を制限するには、カスタムアクティビティタイプを定義する必要があります。

  • 追加のユーザー操作が必要です。


共有キーチェーンアクセス:

アプリケーションのスイートの一部である他のアプリケーションがアクセスできる共有キーチェーンにデータを安全に保存できます。

キーチェーンアクセスを共有するすべてのアプリケーションは、同じアプリIDプレフィックスを使用する必要があります。

動作中の共有キーチェーンアクセスの例。 AppleのGenericKeychainサンプルコード を参照してください。

Shared Key Chain

可用性:iOS 3.0+

長所:

  • データへの安全なアクセス。

短所:

  • 共通のアプリIDプレフィックスを共有するアプリケーション間でのみデータを共有できます。

  • IOSシミュレーターのキーチェーンAPIは、iOSデバイスのAPIとは異なるAPIを持つOS Xからのものです。


カスタムURLスキーム:

単純なURLを使用して、アプリケーション間でデータを渡すことができます。

Custom URL Scheme

可用性:iOS 3.0+

長所:

  • ネットワーク接続は必要ありません。
  • エスケープされた正当なURLに簡単にエンコードできる少量のデータに最適です。

短所:

  • エスケープされた有効なURLにデータをエンコードする必要があります。

    注:base64エンコーディングでは、シリアル化可能なデータを文字列値に変換する一般的な使用法が見られます。ただし、base64文字列には、URLで使用するには無効な文字が含まれる場合があります。 base64urlの使用を検討してください。 詳細については、「Base 64 Encoding with URL and Filename Safe Alphabet」を参照 .


iCloud API:

誰もがiCloud、長所、短所について知っているので、それ以上の説明はありません。

しかし、1つのデバイス内のアプリケーション間でデータを共有する方法を尋ねる場合があります。それを実現するための回避策がいくつかあります。

iCloud

ICloudに使用される識別子はバンドル識別子とは異なるため、画像、ビデオ、その他のドキュメントを共有することができます。

もっと知るために このトピックに関する議論を参照


ウェブサービス:

サードパーティ(Dropboxなど)またはカスタムビルドのWebサービスを介してデータを同期します。

web service

可用性:iOS 2.0+

長所:

  • 大量のデータを共有したり配布したりするのに役立ちます。

短所:

  • ネットワーク接続が必要です。
  • Webサービス実装のオーバーヘッド。

Reference

95
Durai Amuthan.H

From iOS 8App Group Functionality。」を使用して同じフォルダーに正常にアクセスしました。@ siejkowskiの回答を拡張しています。

注:同じ開発者アカウントからのみ機能します。

そのためには、以下の手順に従う必要があります。

  1. まず、開発者アカウントから「アプリグループ」を有効にします。
  2. プロビジョニングプロファイルを生成します。そしてそれを使用します。

次に、2つのアプリを作成する必要があります。サンプル名

  1. Demo_Share_One
  2. Demo_Share_Two

現在、画像をDemo_Share_Oneから共有フォルダーにコピーしています。これは、アプリグループを有効にしてアプリを実行するとデフォルトで作成されます。 Demo_Share_Twoからすべての画像にアクセスします。

開発者account.letsに設定されたグループ名を取得する必要がありますgroup.filesharingdemo

両方のアプリに以下のメソッドを追加して、共有フォルダーのURLの相対パスを取得します。

- (NSString *) getSharedLocationPath:(NSString *)appGroupName {
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSURL *groupContainerURL = [fileManager containerURLForSecurityApplicationGroupIdentifier:appGroupName];
    return [groupContainerURL relativePath];
}

Demo_Share_Oneからバンドルから画像をコピーしています

-(IBAction)writeImage:(id)sender
{
    for (int i = 0; i<15; i++) 
    {
        NSString *strSourcePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"hd%d",i+1] ofType:@"jpg"];
        NSString *strDestinationPath = [[self getSharedLocationPath:@"group.filesharingdemo"] stringByAppendingPathComponent:[NSString stringWithFormat:@"hd%d",i+1]] ;

        BOOL filewrite = [[NSFileManager defaultManager]copyItemAtPath:strSourcePath toPath:strDestinationPath error:nil];
        if (filewrite)
            NSLog(@"File write");
        else
            NSLog(@"can not write file");
    }
}

Demo_Share_Twoでこれらの画像にアクセスします

NSString *pathShared = [[self getSharedLocationPath:@"group.filesharingdemo"] stringByAppendingPathComponent:[NSString stringWithFormat:@"hd%d.jpg",number]];
NSLog(@"%@",pathShared);
//BOOL fileExist = [[NSFileManager defaultManager] fileExistsAtPath:pathShared];
imgView.image = [UIImage imageWithContentsOfFile:pathShared];

そして今、あなたはDemo_Share_Oneから書いたすべての画像を取得します。

したがって、このフォルダーを3番目のアプリと共有したい場合は、これからです。そのアプリをグループに追加するだけです。したがって、複数のアプリで同じ要素にアクセスするのは簡単です。

appIDでアプリグループを有効にしない場合、[self getSharedLocationPath:@ "group.filesharingdemo"]はnullになります。

Apple for独自のアプリ機能から要素を共有するに感謝します。ハッピーコーディング。:)

IOS 8以降、アプリが共通のアプリグループ内にある限り、アプリ間でデータを簡単に共有できます。

Appleのドキュメントは、Extensionsコンテキストで最もよく説明しています: https://developer.Apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html

基本的に、次のことが必要です。

  1. アプリグループIDの定義(の(Certificates、Identifiers&Profiles)セクションのMember CenterApple開発者プログラム。
  2. 通信する必要がある各アプリの上記のアプリグループIDを指定して、アプリグループ機能を有効にします(Xcodeで実行できます:Target-> Capabilitiesor at会員センター)。
  3. 共有コンテナアクセスに2つのAPIのいずれかを使用します。

最初のAPIはNSUserDefaultsに基づいています:

NSString *appGroupId = @"group.my.group.id";

NSUserDefaults *myDefaults = [[NSUserDefaults alloc] 
                    initWithSuiteName:appGroupId];

[myDefaults setObject:@"foo" forKey:@"bar"];

2番目のAPIはNSFileManagerに基づいています。これは、URLを取得した後にアクセスできる単純な共有フォルダーです。

NSString *appGroupId = @"group.my.group.id";

NSURL *sharedFolderURL = [[NSFileManager defaultManager] 
                           containerURLForSecurityApplicationGroupIdentifier:appGroupId];

myDefaultsまたはsharedFolderURLが指すフォルダー内に配置したものはすべて、すべてのアプリで表示およびアクセス可能になります。

フォルダの場合、デッドロックが発生しないようにするために、アトミックに書き込み/読み取りを行ってください。

16
siejkowski

アプリ間でデータを共有できますか?はい、そうです!

IOS 3.0から入手可能なUIPasteBoardを使用してください。ドキュメントは こちら で入手できます。 Apple docs say:

UIPasteboardクラスを使用すると、アプリケーションは、システム全体またはアプリケーション固有のペーストボードを使用して、アプリケーション内または別のアプリケーションとデータを共有できます。

キーチェーン内のアプリ間でデータを共有することも可能です。ただし、データは主にパスワードなどを目的としていますが、シリアル化可能なものであれば何でも保存できます。 ここ は、それに関するStack Overflowの質問です。

14
JugsteR

カスタムURLスキームを使用して、アプリ間でデータにアクセスできます。詳細については、下記のリンクに従ってください-

http://iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html

4
PawanShakya

UIPasteBoardを介してアプリ間でデータを共有することは、iOS7の同じアプリケーショングループ内のアプリに対してのみ機能するという言及です。リンゴが言うように:

+ [UIPasteboard pasteboardWithName:create:]および+ [UIPasteboard pasteboardWithUniqueName]は、同じアプリケーショングループ内のアプリのみがペーストボードにアクセスできるように、指定された名前を一意にするようになりました。開発者が既に存在する名前でペーストボードを作成しようとして、それらが同じアプリスイートの一部ではない場合、開発者は独自のプライベートペーストボードを取得します。これは、ペーストボード、一般、および検索を提供するシステムには影響しないことに注意してください。

3
MasterBeta

https://github.com/burczyk/Camouflage を使用して、.bmpファイルとしてNSDataをiOS Camera Rollに読み書きし、アプリ間で共有できます:)

真新しいソリューション!

3
Kamil

ネットワークへのアクセスを気にしない場合は、カスタムWebサービスを実装してそれを実行するか、クラウドサービスを使用できます。ここでは、iCloud自体はあまり役に立ちません。異なるデバイス上の同じアプリ間でのみデータを共有できます。 iCloud こちら について読むことができます。

ネットワークを使用せずに、「 高速アプリ切り替え 」を利用して、URLエンコードを介してアプリ間で限られた量のデータを転送できます。転送可能なデータの実際の量はわかりませんが、非常に限られていると思います。

この場合、JugsteRとbaudotの回答が最適です。

2
QED