1

私が現在やろうとしているのは、基本的に2つのアプリがあり、もう1つがインストールされているかどうかに基づいて、特定の方法で動作することです。アプリ間通信のためにPasteboardに出くわしたので、それらを使うべきだと思いました。さてここに問題があります、両方のアプリはこのようなことをします

UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"com.company.app.key" create:YES];
[pasteboard setPersistent:YES];
NSData *data = [pasteboard dataForPasteboardType:@"com.company.otherapp"];
if(data != nil)
{
     // Do stuff
}
NSData *selfKey = [pasteboard dataForPasteboardType:@"com.company.thisapp"];
if(data == nil)
{
     [pasteboard setValue:@"string" forPasteboardType:@"com.company.thisapp"];
}

そこで、一方のアプリをインストールしてもう一方のアプリを実行しましたが、最初に動作したとき、データはnilではありませんでした。また、NSDataでNSString初期化子を使用してNSDataをNSStringに変換すると、「文字列」と表示されます。

問題は、2番目のアプリを閉じて再度実行すると、突然データがゼロになることです。最初は、アクセスした後、ペーストボードが削除するだけだと思ったので、//Dostuffに次の行を追加しました

[pasteboard setValue@"string" forPasteboardType:@"com.company.otherapp"];

アプリを2回実行しても、データはまだゼロです。他のアプリがインストールされているかどうかを教えてくれるので、文字列をPasteboardに永久に残す必要があります。それで、1回の実行後にのみデータがnilを返す理由を誰かが知っていますか?

ホームボタンを押してからアプリを再度実行するだけなので、状況は次のようになります。

-app1を実行します

-app2を実行します(Pasteboardからデータを取得します)

-ホームボタンを押す

-app2を実行します(データはnilになりました)

4

2 に答える 2

1

ペーストボードをロードするときは、永続的に設定する必要があります。上記のコードの最初の行の後に、次を追加します。

pasteboard.persistent = YES;
于 2012-11-17T15:23:59.667 に答える
1

それで、app2がそれを再び見ることができなかった理由を理解しました。setValue:forPasteboardTypeが行うことは、Pasteboardの最初の項目を上書きすることです。そのため、アプリを実行するたびに、ペーストボードでお互いのキーが上書きされていました。

解決策は、クラスの複数の厚紙アイテムを使用して、厚紙タイプのインデックスを検索し、そこからデータを取得することです。

于 2012-11-17T19:42:12.803 に答える