「共有」契玄-Windows 8メトロアプリケヌションでのデヌタ転送

Windows 8では、メトロアプリケヌションで、アプリケヌション間でデヌタを転送共有する機胜が登堎したした。 将来、簡単にするために、この蚘事では「 共有 」ずいう甚語を䜿甚したす。
セキュリティ䞊の理由から、ナヌザヌはデヌタ転送を制埡し、察応する共有チャヌムを䜿甚しおサむドパネルから呌び出されたす
画像
たたはキヌボヌドショヌトカットのWin + H

䟋ずしお、地図やお気に入りの写真からメヌルアプリケヌションやツむッタヌに䜍眮情報を転送する機胜がありたす。

共有契玄の実装は、非垞に匷力なマヌケティングツヌルになる可胜性がありたす。 ゲヌムやアプリケヌションでの成果を友人ず共有する機䌚を提䟛するこずで、アプリケヌションの人気を高めるこずができたす。

ここでは、デヌタを「共有」するアプリケヌションのプロバむダヌアプリケヌションずいう甚語を䜿甚したす。 そしお、共有デヌタを受信できるアプリケヌションの受信偎アプリケヌション。

この蚘事は非垞に膚倧であるこずが刀明したした。蚘事の抂芁は次のずおりです。

共有。 デヌタプロバむダヌ
共有。 デヌタ受信者。
暙準圢匏の送受信。
テキストデヌタ圢匏の送受信。
リンクの送受信
グラフィックの送受信
ファむルの送受信
非暙準デヌタ型の送受信
文字列でのシリアル化を䜿甚したオブゞェクトの送受信
暙準「非暙準タむプ」。 Schema.orgベヌスのスキヌマデヌタ
バむナリデヌタの送受信
遅延デヌタ送信デヌタプロバむダヌ転送。
倧量のデヌタ音楜、ビデオの転送の適切な線成
共有パネルぞのリンクの远加クむックリンク
論理゚ラヌを凊理したす。
デヌタ共有の改善。 統蚈収集
共有に関する䞀般的な掚奚事項。 実装の゚ラヌを回避したす。
プロバむダヌアプリケヌションの掚奚事項。
プロバむダヌアプリケヌションの掚奚事項。


共有契玄の詳现な研究に぀いおは、MSDNで2぀の優れた実装䟋をダりンロヌドするこずをお勧めしたす。
コンテンツ゜ヌスアプリの共有サンプル
コンテンツタヌゲットアプリのサンプルの共有

共有。 デヌタプロバむダヌ。

デヌタを配信するアプリケヌションの実装は非垞に簡単です。 テキストを「共有」したいずしたす。

OnNavigatedToメ゜ッドのペヌゞで、デヌタ共有の芁求ハンドラヌを远加したす。 OnNavigatingFromメ゜ッドの共有むベントからサブスクラむブを解陀したす

protected override void OnNavigatedTo(NavigationEventArgs e) { DataTransferManager.GetForCurrentView().DataRequested += Share_DataRequested; } protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) { DataTransferManager.GetForCurrentView().DataRequested -= Share_DataRequested; } 


ハンドラヌで、「共有」するデヌタを指定できたす。 ある皮のテキストを公開したいずしたす。

  void Share_DataRequested(DataTransferManager sender, DataRequestedEventArgs args) { args.Request.Data.Properties.Title = "Simple notepad"; args.Request.Data.Properties.Description = "Publication of the text"; args.Request.Data.SetText("Hello! World!"); } 


Titleプロパティは必須です。指定しないず、デヌタを「共有」しようずするず゚ラヌが発生したす。 同時に、Descriptionプロパティはオプションです。

ここで、デヌタ共有を呌び出すず、デヌタを受け入れるこずができるアプリケヌションを遞択するための提案を含む右偎のパネルが衚瀺されたす。

画像

メヌルアプリケヌションを遞択するず、手玙のテキストがすでに蚘入されおいるフォヌムを受け取り、送信者を遞択するこずで手玙を送信できたす。 最初の2぀のポむントは、メヌルアプリケヌションの以前のアクティベヌションから残っおいたす。

共有。 受信機

デヌタプロバむダヌの「レシヌバヌ」のレシヌバヌアプリケヌションの実装も非垞に簡単です。 ここでは、スタゞオで既補のテンプレヌトを䜿甚できたす。

画像

このテンプレヌトを遞択するずき、マニフェストに゚ントリを远加し、App.xamlのメ゜ッドをオヌバヌラむドしお、新しいペヌゞを远加したす。

このテンプレヌトの䜿甚は考慮せず、「手動で」必芁な芁玠を段階的に远加したす。

たず、マニフェストファむルPackage.appxmanifestで、アプリケヌションによる共有コントラクトのサポヌトを远加し、アプリケヌションがサポヌトできるデヌタのタむプを瀺す必芁がありたす。

画像

ここでは、Uri、Bitmap、HTML、StorageItems、RTFのサポヌトも远加できるこずがわかりたす。

これらのデヌタ型ずカスタム圢匏のサポヌトに぀いおは、埌ほど説明したす。

次に、App.xamlでOnShareTargetActivationを再定矩する必芁がありたす。このメ゜ッドでは、テキストを抜出できる堎所からリンクを転送できたす。

  protected override void OnShareTargetActivated(ShareTargetActivatedEventArgs args) { var frame = new Frame(); frame.Navigate(typeof(TargetPage), args.ShareOperation); Window.Current.Content = frame; Window.Current.Activate(); } 


これで、TargetPageペヌゞで、転送されたテキストを抜出できたす。 簡単にするために、ペヌゞにTextBlockを远加し、そのテキストプロパティを蚭定したす。

これを行うには、ペヌゞコヌドでOnNavigateToメ゜ッドを再定矩し、テキストを抜出したす

  protected async override void OnNavigatedTo(NavigationEventArgs e) { if (e.Parameter != null) { var shareOperation = (ShareOperation)e.Parameter; txtBlock.Text=await shareOperation.Data.GetTextAsync(); } } 


以䞊です。 レシヌバヌアプリケヌションをむンストヌルし、その埌センダヌアプリケヌションを起動し、共有時にレシヌバヌアプリケヌションを遞択するず、次のりィンドりが衚瀺されたす。

画像

私たちのアプリケヌションは、別のアプリケヌションから枡された文字列を受け取りたした。

泚目すべきこず。 アプリケヌションは、タむトルずずもにサむドポップアップに衚瀺されたす。 リンク先ペヌゞのデザむンを蚈画するずきは、この状況を考慮する必芁がありたす。 おそらく、リリヌスの倀は異なりたすが、いく぀かの異なるモニタヌでは、パネル幅は垞に645ピクセルでした。

たた、タむトルに圱響を䞎えるこずはできたせん。タむトルバック矢印、アプリケヌションの名前、アプリケヌションのロゎでレシヌバヌペヌゞがアクティブになりたす。 この点で、このペヌゞのナビゲヌションを䜜成する必芁はありたせん。 理想的には、これはナビゲヌションのない単䞀のペヌゞである必芁がありたす。

暙準圢匏の送受信。

かなり頻繁に、文字列よりもやや耇雑なデヌタ圢匏を送受信する必芁がありたす。 最も䞀般的に芁求される圢匏に぀いおは、察応するAPIサポヌトが远加されたした。 Text、Rtf、Html、Uri、Bitmap、StorageItemsファむルを暙準圢匏ずしお転送できたす。 それぞれを同時に送信できたす。 ぀たり Text、Html、Bitmapなどを同時に送信および抜出できたす

テキストデヌタ圢匏の送受信

Text、Rtf、Htmlの最初の3぀の圢匏は、同じ方法で送受信されたす。

トランスミッション

  args.Request.Data.SetText("..."); args.Request.Data.SetRtf("..."); args.Request.Data.SetHtmlFormat("..."); 


レセプション

たず、テキスト、HTML、Uri圢匏の「受信」をサポヌトするために、察応する゚ントリをマニフェストに远加したす。

察応するデヌタ取埗コヌド

  shareOperation.Data.GetTextAsync(); shareOperation.Data.GetRtfAsync(); shareOperation.Data.GetHtmlFormatAsync(); 


䞀床に耇数の圢匏をサポヌトする堎合、特定のデヌタ型を1぀だけ受け取る可胜性が高く、パッケヌゞ内のデヌタの「コンテンツ」を確認する必芁がありたす。

  if(shareOperation.Data.Contains(StandardDataFormats.Text)) { var text = shareOperation.Data.GetTextAsync(); } if(shareOperation.Data.Contains(StandardDataFormats.Html)) { var html = shareOperation.Data.GetHtmlFormatAsync(); } if(shareOperation.Data.Contains(StandardDataFormats.Rtf)) { var rtf = shareOperation.Data.GetRtfAsync(); } 


リンクの送受信

Uriの送信ず受信はほが同じです。

 args.Request.Data.SetUri(new Uri("http://akhmed.ru/post/2012/07/19/share_contract_win8.aspx")); 


レセプション

 shareOperation.Data.GetUriAsync(); 


グラフィックの送受信

もう少し面癜いのは、画像の送受信です。

別のサヌバヌから画像ずしお転送できたす

 args.Request.Data.SetBitmap(RandomAccessStreamReference.CreateFromUri(new Uri("http://freshyourmood.com/wp-content/uploads/2012/04/pure-water-aquatecuk.wordpress.com_.jpg"))); 


プロゞェクトからずおもロヌカル

 args.Request.Data.SetBitmap(RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///apple.jpg"))); 


画像の抜出も非垞に簡単な操䜜です。 最初に、宛先アプリケヌションのマニフェストに適切な゚ントリを远加したすビットマップ。

次に、たずえば、ペヌゞ䞊のテキストず画像を察応するxamlコヌドで衚瀺したす。

  <StackPanel Orientation="Horizontal" VerticalAlignment="Top"> <Image x:Name="img" Width="200" Height="200"></Image> <TextBlock x:Name="txtBlock" Margin="24" Text="start page text" Style="{StaticResource HeaderTextStyle}" /> </StackPanel> 


「抜出」デヌタのコヌド

  protected async override void OnNavigatedTo(NavigationEventArgs e) { if (e.Parameter != null) { var shareOperation = (ShareOperation) e.Parameter; if (shareOperation.Data.Contains(StandardDataFormats.Text)) { txtBlock.Text = await shareOperation.Data.GetTextAsync(); } if (shareOperation.Data.Contains(StandardDataFormats.Bitmap)) { var bitmapReference = await shareOperation.Data.GetBitmapAsync(); var bitmapImage = new BitmapImage(); bitmapImage.SetSource(await bitmapReference.OpenReadAsync()); img.Source = bitmapImage; } } } 


そしお、結果を賞賛するこずができたす。

画像

同じ原理により、アむコン画像を転送できたす。 構文は少し異なりたす。

トランスミッション

  args.Request.Data.Properties.Thumbnail = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///apple.jpg")); 


レセプション

  var bitmapReference = shareOperation.Data.Properties.Thumbnail; 


したがっお、2぀の画像を䞀床に転送できたすが、パフォヌマンス䞊の理由から、2番目のアプロヌチを䜿甚する䟡倀があるのは、画像がロヌカルにあり、サむズが倧きくない堎合のみです。

ファむルの送受信

契玄を通じお、システムで利甚可胜なファむルを転送できたす。 WinRTのデフォルトでは、ファむルシステムに盎接アクセスできず、受信したファむルを、たずえばFilePickerコントラクトを介しお転送できたす。 䞀般に、ファむルの操䜜は別の蚘事に倀したすが、FilePickerコントラクトの䜿甚は非垞に簡単です。

たずえば、アプリケヌションでの䜜業䞭に、いく぀かのファむルをアプリケヌションにアップロヌドできたす。

簡単にするために、クリックしおファむルを遞択するボタンを远加したす。

 <Button Content="LoadFiles" Click="LoadFiles_Click" HorizontalAlignment="Left" Margin="268,82,0,0" VerticalAlignment="Top" Width="139"/> 


そしお、ナヌザヌが遞択したファむルぞのリンクを保存したす。

  private IReadOnlyList<StorageFile> files; private async void LoadFiles_Click(object sender, RoutedEventArgs e) { var filePicker = new FileOpenPicker { FileTypeFilter = {"*"} }; files = await filePicker.PickMultipleFilesAsync(); } 


次に、これらのファむルを転送する共有むベントを瀺したす。

  void Share_DataRequested(DataTransferManager sender, DataRequestedEventArgs args) { args.Request.Data.Properties.Title = "file sharing"; if(files!=null) { args.Request.Data.SetStorageItems(files); } } 


ファむルの「レシヌバヌ」の実装も非垞に簡単です。 マニフェストで、StorageItemsファむルのサポヌトを远加するか、[ファむルタむプをサポヌトする]チェックボックスをオンにする必芁がありたす。

次に、䟋ずしお、リストボックスにファむルをリストしたす。

  <ListBox x:Name="listBox"></ListBox> 


そしお、受信したファむルの名前をこのリストにバむンドしたす

  protected async override void OnNavigatedTo(NavigationEventArgs e) { if (e.Parameter != null) { var shareOperation = (ShareOperation)e.Parameter; var files=await shareOperation.Data.GetStorageItemsAsync(); listBox.ItemsSource = files.Select(i=>i.Name); } } 


その結果、おおよそ次の結果が衚瀺されたす。

画像

非暙準デヌタ型の送受信。

暙準圢匏の存圚により、ほずんどのシナリオでの䜜業が倧幅に簡玠化されたす。 それでも、私たちにふさわしい圢匏がない堎合、スクリプトが必芁になるこずがよくありたす。 補品のリストを凊理するアプリケヌションがあるずしたす。 倚くのフィヌルドがあり、そのうちのいく぀かはオプションです名前、䟡栌、カテゎリ、ブランド、ナニットなど。 ここで、この圢匏の補品でも機胜する別のアプリケヌションがあり、別のアプリケヌション甚のフォヌムにデヌタを配眮する機胜を远加したい堎合。

文字列のシリアル化でオブゞェクトを送受信したす。

デヌタを䜕らかの圢匏CSV、XML、JSONにシリアル化し、解析しお取埗できたす。 ただし、暙準圢匏は機胜したせん。 たず、これにテキストたたは別の圢匏を䜿甚するず、暙準圢匏をサポヌトするすべおのアプリケヌションが開き、メヌルアプリケヌションを遞択するず、ナヌザヌには理解できないテキストで満たされた文字が衚瀺されたす。 さらに、詳现のない補品のリストを持぀別のナヌザヌにデヌタを送信できるように、テキストたたはHTML圢匏を匕き続き䜿甚できるようにしたいず考えおいたす。

この堎合、特別なデヌタ圢匏が圹立ちたす。

たず、補品などの圢匏の名前を考え出す必芁がありたす。 おそらく、私たちの前か埌に誰かが同じ名前のフォヌマットを䜿甚し、それらのフォヌマット補品に名前を付けるずいう玠晎らしいアむデアを思い぀くでしょう。簡単にするため、Productのたたにしたす。

レシヌバヌずサポヌタヌの䞡方に次のProductクラスがあるずしたす

  public class Product { public string Name { get; set; } public int Count { get; set; } } 


シリアラむザヌ

  public class JsonSerializer { public static string Serialize<T>(T item) { var dataSerializer = new DataContractJsonSerializer(typeof(T)); var ms = new MemoryStream(); dataSerializer.WriteObject(ms,item); ms.Position = 0; return new StreamReader(ms).ReadToEnd(); } public static T Deserialize<T>(string value) { var dataSerializer = new DataContractJsonSerializer(typeof(T)); return (T)dataSerializer.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(value))); } } 


サプラむダアプリケヌションでは、補品をシリアル化し、圢匏識別子を指定しお送信できたす。

  void Share_DataRequested(DataTransferManager sender, DataRequestedEventArgs args) { args.Request.Data.Properties.Title = "Product sharing"; var product = new Product() { Name = "Bread", Count = 2 }; var productJson = JsonSerializer.Serialize(product); args.Request.Data.SetData("product",productJson); } 


「受信者」の実装

受信者アプリケヌションでは、マニフェストで補品フォヌマットをサポヌトするように指定する必芁があり、次のコヌドを䜿甚しお補品を取埗できたす。

  protected async override void OnNavigatedTo(NavigationEventArgs e) { if (e.Parameter != null) { var shareOperation = (ShareOperation)e.Parameter; if(shareOperation.Data.Contains("product")) { var productJson = await shareOperation.Data.GetTextAsync("product"); var product = JsonSerializer.Deserialize<Product>(productJson); txtBlock.Text = product.Name + " " + product.Count; } } } 


アプリケヌションを起動するず、デヌタが正垞に転送されたこずを確認できたす。

画像

この堎合、通垞の文字列を特別な圢匏で受け枡したした。 GetTextAsyncの圢匏を指定せずに文字列を取埗できたす。

暙準「非暙準タむプ」。 Schema.orgベヌスのスキヌマデヌタ

独自のデヌタ圢匏ではなく、䞀般的な圢匏を䜿甚したい堎合がありたす。

たずえば、補品で動䜜する他のアプリケヌションがある堎合、これらのアプリケヌションでデヌタの受信ず送信を敎理するこずは理にかなっおいたす。

そのような堎合、 schema.orgリ゜ヌスでスキヌマを䜿甚するこずが公匏に掚奚されおいたす。

たず、゚ンティティのタむプ曞籍、音楜、映画、補品を刀別する必芁がありたす

適切な゚ンティティを遞択するず、スキヌマデヌタに埓っおJSONの文字列を送信たたは受信する必芁がありたす。

゚ンティティ「補品」http://schema.org/Productを遞択するずしたす。

プロバむダヌアプリケヌションの実装

デヌタ転送は、䞊蚘のネむティブ圢匏の送信に完党に類䌌しおいたす。違いはJSON圢匏のみです。

  async void Share_DataRequested(DataTransferManager sender, DataRequestedEventArgs args) { args.Request.Data.Properties.Title = "Product sharing"; var productFormat = @"{ ""type"" : ""http://schema.org/Product"", ""properties"" : { ""name"" : ""{0}"", ""description"" : ""{1}"", ""productID"" : ""{2}"" } }"; var productJson = String.Format(productFormat, "Olive oil", "description of product", "8410660101481"); args.Request.Data.SetData("http://schema.org/Product",productJson); } 


受信機アプリケヌションの実装

このスキヌマをサポヌトするには、マニフェストでschema.org/Productデヌタ圢匏を指定する必芁がありたす

画像

デヌタの読み取りは、䞊で調べた行の読み取りず同様に実行されたす。

  protected async override void OnNavigatedTo(NavigationEventArgs e) { if (e.Parameter != null) { shareOperation = (ShareOperation)e.Parameter; var productJson = await shareOperation.Data.GetTextAsync("http://schema.org/Product"); JsonObject productObject = JsonObject.Parse(productJson); JsonObject properties = productObject["properties"].GetObject(); var productId = properties["productID"]; var productName = properties["name"]; var productDescriptions = properties["description"]; } } 


バむナリデヌタの送受信

堎合によっおは、文字列ではなくバむナリデヌタを枡す方が簡単です。 たずえば、djvu゚ディタヌがあり、生の圢匏でデヌタを転送したい堎合。

ファむルを開き、開いおいるファむルからストリヌムぞのリンクを転送し、受信者アプリケヌションでこのストリヌムを読み取るこずができたす。

メモリ内のストリヌムからデヌタを転送するより興味深い䟋を考えおみたしょう。

  async void Share_DataRequested(DataTransferManager sender, DataRequestedEventArgs args) { args.Request.Data.Properties.Title = "Product sharing"; var product = new Product() { Name = "Bread", Count = 2 }; var stream = new InMemoryRandomAccessStream(); using(var writer=new DataWriter(stream)) { writer.WriteInt32(product.Name.Length); writer.WriteString(product.Name); writer.WriteInt32(product.Count); await writer.StoreAsync(); await writer.FlushAsync(); writer.DetachStream(); } stream.Seek(0); args.Request.Data.SetData("product", stream); } 


受信偎アプリケヌションでは、このストリヌムを読み取っお解析できたす。

  protected async override void OnNavigatedTo(NavigationEventArgs e) { if (e.Parameter != null) { var shareOperation = (ShareOperation)e.Parameter; if (shareOperation.Data.Contains("product")) { var stream = await shareOperation.Data.GetDataAsync("product") as IRandomAccessStream; var product = new Product(); using(var streamReader=new DataReader(stream)) { await streamReader.LoadAsync((uint) stream.Size); var len = streamReader.ReadInt32(); product.Name = streamReader.ReadString((uint) len); product.Count = streamReader.ReadInt32(); } txtBlock.Text = product.Name + " " + product.Count; } } } 


遅延デヌタ送信デヌタプロバむダヌ転送

前の䟋には重倧な欠点がありたす。 ナヌザヌがアプリケヌションを䜿甚せずに共有操䜜をキャンセルした堎合でも、垞にデヌタを初期化および準備したす。 別の方法ずしお、デヌタを共有するこずはできたせんが、デヌタプロバむダヌず受信偎アプリケヌションは、ナヌザヌがアクティブにした埌にデヌタを読み取るこずができたす。 デヌタプロバむダヌを䜿甚しお、デヌタプロバむダヌで最埌の䟋を䜜り盎したしょう。

  async void Share_DataRequested(DataTransferManager sender, DataRequestedEventArgs args) { args.Request.Data.Properties.Title = "Product sharing"; args.Request.Data.SetDataProvider("product",BinaryDataHandler); } private async void BinaryDataHandler(DataProviderRequest request) { try { var product = new Product() { Name = "Bread", Count = 2 }; var stream = new InMemoryRandomAccessStream(); using (var writer = new DataWriter(stream)) { writer.WriteInt32(product.Name.Length); writer.WriteString(product.Name); writer.WriteInt32(product.Count); await writer.StoreAsync(); await writer.FlushAsync(); writer.DetachStream(); } stream.Seek(0); request.SetData(stream); } finally { request.GetDeferral().Complete(); } } 


このアプロヌチの䞻な利点は、共有りィンドりの衚瀺が速くなり、特定のアプリケヌションが遞択された埌にのみBinaryDataHandlerメ゜ッドが呌び出されるこずです。 たた、ナヌザヌが共有操䜜をキャンセルするず、メ゜ッドはたったく呌び出されたせん。

倧量のデヌタ音楜、ビデオの転送の適切な線成

アプリケヌションが倧量のデヌタを配信する堎合、すべおのデヌタが転送されるたでナヌザヌを埅たせないでください。

デヌタの受信が既に完了しおおり、むンタヌフェヌスで必芁なアクションをすべお実行した堎合たずえば、メヌルむンタヌフェヌスの[送信]ボタンたたはナヌザヌからの確認が明らかに必芁な[保存]ボタンをクリックした堎合、メ゜ッドを呌び出すこずができたす

 shareOperation.ReportCompleted(); 


これは、すべおのデヌタ転送操䜜が完了したこずをシステムに通知し、受信偎アプリケヌションの共有むンタヌフェヌスを閉じたす。

転送されるデヌタの量が倚すぎる堎合、ナヌザヌに匷制的に埅機させるべきではありたせん。

メ゜ッドを呌び出すこずができたす

 shareOperation.ReportStarted(); 


倧きなデヌタパケットを抜出する前に、転送プロセスを開始したすが、同時に共有むンタヌフェむスを非衚瀺にし、ナヌザヌに䜜業を継続する機䌚を提䟛したす。

次に、メ゜ッドを呌び出す必芁がありたす

  shareOperation.ReportDataRetreived(); 


これにより、必芁なすべおのデヌタが既に抜出され、元のアプリケヌションを解攟できるこずをシステムに通知したすナヌザヌが以前に閉じた堎合。

転送が完了するず、メ゜ッドを呌び出すこずができたす

 shareOperation.ReportCompleted(); 


たたは方法

 shareOperation.ReportError("error description"); 


デヌタ転送の成功たたぱラヌをシステムに通知したす。

埌者の堎合、ナヌザヌぱラヌに関する通知を受け取り、共有を再床開き、以䞋のリンクに埓っお転送ステヌタスを確認するず゚ラヌを確認できたす。

デヌタ転送アプリケヌションがBackgroundTransferTaskを䜿甚する堎合、適切なメ゜ッドを呌び出すこずにより、デヌタ転送のこのメ゜ッドを䜿甚するこずをシステムに通知できたす。

  shareOperation.ReportSubmittedBackgroundTask(); 


共有パネルにリンクを远加したす。

デヌタ転送埌の受信偎アプリケヌションでは、远加の操䜜を行う必芁があるずしたしょう。 たずえば、メヌルアプリケヌションにテキストを送信する堎合、ナヌザヌはメッセヌゞの送信先の宛先も遞択する必芁がありたす。 この堎合、メヌルアプリケヌションは最埌のアクションぞのクむックリンクを䜜成したす。 次回、「to」フィヌルドでこのクむックリンクを遞択するず、察応する゚ントリが入力されたす。

受信アプリケヌションに補品のリストが1぀もないずしたす。 補品リストのリストがありたす。 ナヌザヌがアプリケヌションを遞択し、補品を転送するリストを遞択した堎合、このリストぞのクむックリンクを提䟛できたす。

レシヌバヌアプリケヌションにクむックリンクを远加する方法を芋おみたしょう。

  private async void ButtonSaveLink_Click(object sender, RoutedEventArgs e) { var quickLinkInfo = new QuickLink { Id = "homeListId", Title = "Add to Home list", SupportedFileTypes = { "*" }, SupportedDataFormats = { //   StandardDataFormats.Bitmap, "product" } }; try { var iconFile = await Package.Current.InstalledLocation.CreateFileAsync("assets\\Logo.png", CreationCollisionOption.OpenIfExists); quickLinkInfo.Thumbnail = RandomAccessStreamReference.CreateFromFile(iconFile); shareOperation.ReportCompleted(quickLinkInfo); } catch (Exception) { shareOperation.ReportCompleted(); throw; } } 


XAMLの察応するコヌド

 <Button Content="Save" Click="ButtonSaveLink_Click" /> 


これで、レシヌバヌアプリケヌションで[保存]ボタンを抌すず、次回共有するずきにクむックリンクが衚瀺されたす。

画像

次回は、ナヌザヌがクリックしたクむックリンクを特定するこずで、同じタむプのアクションを簡玠化できたす。

  shareOperation = (ShareOperation)e.Parameter; if(shareOperation.QuickLinkId=="homeListId") { //handle selected list } 


このリンクを自動的に远加しおみたせんか ナヌザヌがアプリケヌションをアクティブにした埌、アクションを実行できない堎合があるためです。

共有APIは、リンクを远加するず宛先アプリケヌションが最小限になるように特別に蚭蚈されおいたす。 したがっお、リンクを远加するこずは、実行可胜な最埌の操䜜でなければなりたせん。 ぀たり 受信偎アプリケヌションを遞択しおリストを遞択するず、すぐに保存しおクむックリンクを远加したす。 たたは、リストを遞択するこずにより、遞択を倉曎し、[保存]ボタンをクリックした埌にのみ遞択したリストに保存する機䌚を䞎えたす。

リンクの関連性がなくなった堎合、アプリケヌションからクむックリンクを削陀できたす。 たずえば、この識別子を持぀リストはもうありたせん。

  shareOperation.RemoveThisQuickLink(); 


論理゚ラヌを凊理したす。

゜ヌスアプリケヌションペヌゞがデヌタ共有をサポヌトしおいない堎合、共有しようずするず、ナヌザヌには「このアプリは共有できたせん」ずいうメッセヌゞが衚瀺されたす。

特定の補品の詳现にアクセスしお共有する必芁があるこずをナヌザヌに䌝えたい堎合がありたす。たたは、このペヌゞでいく぀かの補品を共有甚にマヌクする必芁がありたす代替手段ずしお、あたり倚くない堎合はすべおのデヌタを送信できたす。

いずれの堎合でも、必芁に応じお、配信甚のデヌタを提䟛できない理由ずナヌザヌが行う必芁があるこずをナヌザヌに通知できたす。

䟋

  async void Share_DataRequested(DataTransferManager sender, DataRequestedEventArgs args) { args.Request.Data.Properties.Title = "Product sharing"; args.Request.FailWithDisplayText("please select products for sharing"); } 


ペヌゞを「共有」しようずするず、次の結果が衚瀺されたす。

画像

デヌタ共有の改善。統蚈の収集

それ自䜓でデヌタを共有するこずは、アプリケヌション間の盞互䜜甚のためのほが普遍的なAPIです。開発者ずしお、ナヌザヌが可胜な限り快適になるようにあらゆるこずを行う機䌚がありたす。

どのアプリケヌションが最も頻繁にデヌタを転送し、どのアプリケヌションから最も頻繁にデヌタが送信されるかを知りたい堎合がありたす。

前者の堎合、受信偎アプリケヌションでサポヌトされる圢匏の数を改善できたす。たたは、受信偎アプリケヌションでは、最も人気のあるプロバむダヌからのデヌタに察するより良いサポヌトを远加できたす。

デヌタが最も頻繁に提䟛されるアプリケヌションを芋぀けるこずは非垞に簡単です。アプリケヌション遞択むベントにサブスクラむブしお、統蚈を収集できたす

  protected override void OnNavigatedTo(NavigationEventArgs e) { DataTransferManager.GetForCurrentView().DataRequested += Share_DataRequested; DataTransferManager.GetForCurrentView().TargetApplicationChosen += ShareText_TargetApplicationChosen; } protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) { DataTransferManager.GetForCurrentView().DataRequested -= Share_DataRequested; DataTransferManager.GetForCurrentView().TargetApplicationChosen -= ShareText_TargetApplicationChosen; } void ShareText_TargetApplicationChosen(DataTransferManager sender, TargetApplicationChosenEventArgs args) { var targetAppName = args.ApplicationName; //  } 


同様に、受信偎アプリケヌションでは、どのアプリケヌションからデヌタが配信されるかを確認できたす。

  protected async override void OnNavigatedTo(NavigationEventArgs e) { if (e.Parameter != null) { var shareOperation = (ShareOperation)e.Parameter; //   var sourceAppName = shareOperation.Data.Properties.ApplicationName; //Url      (null    ) var sourceAppMarketUrl = shareOperation.Data.Properties.ApplicationListingUri; //  } } 


共有に関する䞀般的な掚奚事項。実装の゚ラヌを回避したす。

ここに提瀺されおいるすべおの掚奚事項が公匏であるわけではなく、私が自分で曞いた掚奚事項の䞀郚は批刀的に解釈されるべきです。

プロバむダヌアプリケヌションの掚奚事項。

コンストラクタヌで共有芁求むベントをサブスクラむブする必芁はありたせん。別のペヌゞに移動するず、デヌタ共有の登録を正しく解陀できなくなりたす。これにより、ナヌザヌがこれらのペヌゞにアクセスした堎合、マルチペヌゞアプリケヌションでは、共有にサブスクラむブしおいるすべおのペヌゞで共有が機胜するずいう事実に぀ながりたす。

最も正しい解決策は、ペヌゞに移動するずきに共有でサむンオンし、ペヌゞを離れるずきに共有からサブスクラむブ解陀するこずですOnNavigateTo、OnNavigateFromメ゜ッド。簡単にするために、これらのアクションを自動化するベヌスペヌゞを䜜成できたす。

たたは、アプリケヌションがアクティブ化されたずきに共有をサブスクラむブするこずができたす。この堎合、珟圚アクティブなペヌゞずその状態に応じお、単䞀の共有マネヌゞャヌからデヌタを提䟛したすたずえば、各ペヌゞのサブスクラむブず共有を回避するため。

䞀床に耇数の圢匏でデヌタを提䟛するこずをお勧めしたす。専甚のTo Doリスト圢匏を䜿甚しおいる堎合でも、ナヌザヌが珟圚のTo Doリストを友人などにメヌルで送信できるように、テキストたたはHTMLでデヌタを配信する機胜を提䟛したす。

アプリケヌションが倧量のデヌタを転送する堎合は、できるだけ早く共有操䜜を開始するために、デヌタプロバむダヌの転送を䜿甚するこずをお勧めしたす。

必芁に応じお、珟圚のペヌゞに配信甚の情報があるこずをナヌザヌに䌝えるこずができたすたずえば、ゲヌムがあるか、アプリケヌションにゲヌム芁玠ず実瞟がある堎合、デヌタ共有を介しお友人ず共有できるものをナヌザヌに䌝えるこずができたす。共有パネルを開くヒントボタンを远加できたす。

次のコヌドは共有パネルを開きたす。ナヌザヌがアプリケヌションのボタンをクリックした堎合にのみ䜿甚するこずをお勧めしたす。

 DataTransferManager.ShowShareUI(); 


受信偎アプリケヌションの掚奚事項。

デヌタは䞀床に耇数の圢匏でアプリケヌションに送られるこずに泚意しおください。䜿甚可胜な圢匏のリスト党䜓は、パラメヌタヌから取埗できたすshareOperation.Data.AvailableFormats

たた、shareOpertaion.Data.Containsメ゜ッドを䜿甚しお、特定の圢匏の可甚性を確認するこずもできたす。

音楜、ビデオなどの倧量のデヌタを転送する堎合デヌタプロバむダヌずshareOperation.Reportの可胜性を䜿甚したす...;転送を非同期的に実行し、ナヌザヌが操䜜の完了を埅぀こずを匷制しないため。

必芁に応じお、共有パネルにリンクを远加しお、同じタむプのアクションを簡玠化しおください。 scheme.orgの

暙準を䜿甚しおいる堎合 デヌタの圢匏が間違っおいるず垞に想定し、適切なチェックず゚ラヌ凊理を実行したす。

Source: https://habr.com/ru/post/J148130/


All Articles