同じデバイス上の2つのアプリケーション間でデータを共有することは可能ですか?
または、他のアプリケーションがアプリケーションの情報/データを使用することを許可することはできますか?
たとえば、最初のアプリケーションはイベント管理用であり、それを使用してイベントを保存します。 2番目のアプリケーションはリマインダー用で、イベントについて通知するために他のアプリケーションからデータを取得します。
これは単純な例であり、実際のシナリオではありません。
歴史的に、iPhoneはアプリ間のデータ共有を防止しようとしてきました。アイデアは、別のアプリのデータにアクセスできなければ、そのアプリに悪いことは何もできないということでした。
IOSの最近のリリースでは、彼らはそれを少し緩めました。たとえば、iOSプログラミングガイドには、あるアプリに特定のURLプレフィックスを要求させ、他のアプリにそのURLを参照させることにより、アプリ間でデータを渡すセクションがあります。そのため、Webサーバーが「http://」URLに応答するのと同じ方法で、「event://」URLに応答するようにイベントアプリを設定します。
そのアプローチに関するAppleのドキュメントは here です。
「カスタムURLスキームの実装」をご覧ください。
sandboxediOS開発の世界では、アプリケーション間でデータを共有することは困難です。iOS開発者はfile system、アプリケーションの代替ソリューションを見つける必要があります。一般的なソリューションには次のものがあります。
UIDocumentInteractionController
UIActivityViewController
共有キーチェーンアクセス
カスタムURLスキーム
ウェブサービス
iCloud API
ユーザーは、特定のドキュメントを処理できるとして登録されている他のアプリケーションでドキュメントを開くことができますUniform Type Identifier(UTI)。
UIDocumentInteractionControllerは、デバイス上の他のアプリケーションでドキュメントを開く手段として、たとえばメールアプリからの電子メールの添付ファイルを開くために、過去に使用されてきました。
残念ながら、UIDocumentInteractionControllerのUIには6つのアプリケーションしか表示されません。
リストにアプリケーションが表示されることを保証することはできません。 UIDocumentInteractionControllerは非推奨ではありませんが、UIActivityViewControllerはiOS 6.0以降のより柔軟な代替を提供します。
可用性:iOS 3.2+
長所:
短所:
UIDocumentInteractionControllerに送信されるデータのタイプを制御できますが、宛先は制御できません。
追加のユーザー操作が必要です。
データ送信先の数が限られているため、アプリケーションがリストに表示されない場合があります。
ユーザーがデータの配列を使用して多くのアクションを実行できるようにします。
たとえば、印刷、電子メール、コピー、ソーシャルメディアへの投稿、または別のアプリケーションで開くことができます。
ユーザーにカスタムサービスを提供するために、独自のUIActivityサブクラスを作成できます。
可用性:iOS 6.0+
長所:
さまざまなアプリケーションやソーシャルメディアで一般的なデータタイプを共有するのに最適です。
アクティビティへのアプリケーションのアイテムの配列を提供できます。オブジェクトはUIActivityItemSourceプロトコルに準拠する必要があります。
除外されたアクティビティタイプを設定する機能があります。
ページングUIでは、UIDocumentInteractionControllerよりも多くのデータ宛先を使用できます。
短所:
一般的なデータ型の「開く...」宛先を制限するには、カスタムアクティビティタイプを定義する必要があります。
追加のユーザー操作が必要です。
アプリケーションのスイートの一部である他のアプリケーションがアクセスできる共有キーチェーンにデータを安全に保存できます。
キーチェーンアクセスを共有するすべてのアプリケーションは、同じアプリIDプレフィックスを使用する必要があります。
動作中の共有キーチェーンアクセスの例。 AppleのGenericKeychainサンプルコード を参照してください。
可用性:iOS 3.0+
長所:
短所:
共通のアプリIDプレフィックスを共有するアプリケーション間でのみデータを共有できます。
IOSシミュレーターのキーチェーンAPIは、iOSデバイスのAPIとは異なるAPIを持つOS Xからのものです。
単純なURLを使用して、アプリケーション間でデータを渡すことができます。
可用性:iOS 3.0+
長所:
短所:
エスケープされた有効なURLにデータをエンコードする必要があります。
注:base64エンコーディングでは、シリアル化可能なデータを文字列値に変換する一般的な使用法が見られます。ただし、base64文字列には、URLで使用するには無効な文字が含まれる場合があります。 base64urlの使用を検討してください。 詳細については、「Base 64 Encoding with URL and Filename Safe Alphabet」を参照 .
誰もがiCloud、長所、短所について知っているので、それ以上の説明はありません。
しかし、1つのデバイス内のアプリケーション間でデータを共有する方法を尋ねる場合があります。それを実現するための回避策がいくつかあります。
ICloudに使用される識別子はバンドル識別子とは異なるため、画像、ビデオ、その他のドキュメントを共有することができます。
もっと知るために このトピックに関する議論を参照
サードパーティ(Dropboxなど)またはカスタムビルドのWebサービスを介してデータを同期します。
可用性:iOS 2.0+
長所:
短所:
From iOS 8「App Group Functionality。」を使用して同じフォルダーに正常にアクセスしました。@ siejkowskiの回答を拡張しています。
注:同じ開発者アカウントからのみ機能します。
そのためには、以下の手順に従う必要があります。
次に、2つのアプリを作成する必要があります。サンプル名
現在、画像を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
基本的に、次のことが必要です。
最初の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
が指すフォルダー内に配置したものはすべて、すべてのアプリで表示およびアクセス可能になります。
フォルダの場合、デッドロックが発生しないようにするために、アトミックに書き込み/読み取りを行ってください。
アプリ間でデータを共有できますか?はい、そうです!
IOS 3.0から入手可能なUIPasteBoardを使用してください。ドキュメントは こちら で入手できます。 Apple docs say:
UIPasteboardクラスを使用すると、アプリケーションは、システム全体またはアプリケーション固有のペーストボードを使用して、アプリケーション内または別のアプリケーションとデータを共有できます。
キーチェーン内のアプリ間でデータを共有することも可能です。ただし、データは主にパスワードなどを目的としていますが、シリアル化可能なものであれば何でも保存できます。 ここ は、それに関するStack Overflowの質問です。
カスタムURLスキームを使用して、アプリ間でデータにアクセスできます。詳細については、下記のリンクに従ってください-
http://iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html
UIPasteBoardを介してアプリ間でデータを共有することは、iOS7の同じアプリケーショングループ内のアプリに対してのみ機能するという言及です。リンゴが言うように:
+ [UIPasteboard pasteboardWithName:create:]および+ [UIPasteboard pasteboardWithUniqueName]は、同じアプリケーショングループ内のアプリのみがペーストボードにアクセスできるように、指定された名前を一意にするようになりました。開発者が既に存在する名前でペーストボードを作成しようとして、それらが同じアプリスイートの一部ではない場合、開発者は独自のプライベートペーストボードを取得します。これは、ペーストボード、一般、および検索を提供するシステムには影響しないことに注意してください。
https://github.com/burczyk/Camouflage を使用して、.bmpファイルとしてNSDataをiOS Camera Rollに読み書きし、アプリ間で共有できます:)
真新しいソリューション!