7

詳細な例が見つからないため、私はこれに何年も苦労してきました。

私のアプリには、AirDrop 経由で同じアプリを使用している別のユーザーに送信したいカスタム データの配列があります。

最初のステップは、データの送信です。

@IBAction func share_Button_Click(sender: UIBarButtonItem)
{
    let dataToShare: NSData = getMyCustomNSData()

    let controller = UIActivityViewController(activityItems: [dataToShare], applicationActivities: nil)
    controller.excludedActivityTypes = [UIActivityTypePostToFacebook, UIActivityTypePostToTwitter, UIActivityTypePostToWeibo, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypePostToFlickr, UIActivityTypePostToTencentWeibo, UIActivityTypeMail, UIActivityTypeAddToReadingList, UIActivityTypeOpenInIBooks, UIActivityTypeMessage]

    self.presentViewController(controller, animated: true, completion: nil)
}

これにより、データが NSData オブジェクトに変換され、ユーザーは AirDrop 共有オプションを取得し、データは別の電話に送られます。ここまでは順調ですね...

しかし、他のユーザーのアプリはどのようにしてそれを受け取ることができるのでしょうか?

カスタム UTI 型について読んで宣言しましたが、正直なところ、宣言に何を入れればよいかわかりません。また、送信しているデータがこの特定の UTI に準拠していることを iOS にどのように示すのでしょうか?

AirDrop の例はオンラインのあちこちにありますが、それらは画像などの一般的なタイプの共有に重点を置いており、カスタム データ タイプを詳細に共有する作業を行った人は誰も見つけていません。

誰でも助けることができますか?

4

2 に答える 2

11

AirDrop サンプル コードでは、独自のファイル タイプ/UTI を定義し、それを使用して AirDrop を使用してカスタム データを送信する方法について説明します。

主な必要部品は以下の通りです。

  1. アプリの次のキーと値Info.plist

    <...>
    <key>CFBundleDocumentTypes</key>
    <array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>AirDrop Profile File Type</string>
        <key>LSHandlerRank</key>
        <string>Default</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>com.apple.customProfileUTI.customprofile</string>
        </array>
    </dict>
    </array>
    <...>
    
  2. カスタム型の受信をサポートする
    には、アプリ デリゲートで、fileURL実装することで起動されるハンドルを

    Objective-C

    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    

    迅速

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        // Check if your app can open the URL
        // If it can, do something with the url and options, then return true
        // otherwise return false
    }
    

    ファイルを削除/移動して、受信したinboxドキュメントが保存されるフォルダー (アプリのサンドボックス内) でクリーンアップしてください。

  3. カスタム タイプの送信をサポートするには
    渡すアイテムは、カスタム ファイル タイプとして登録した拡張子を持つファイル、またはプロトコルに準拠し、何らかのタイプを返すオブジェクトのUIActivityViewControllerいずれかである必要があります。fileURLUIActivityItemSourceNSData

    - (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
    

    そしてあなたの実際のNSDataブロブ

    - (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType
    

    次に、次のメソッドで、アプリの に登録したカスタム タイプの UTI を返しますInfo.plist

    - (NSString *)activityViewController:(UIActivityViewController *)activityViewController dataTypeIdentifierForActivityType:(NSString *)activityType
    

サンプル コードには、これらすべてを実行する方法と、適切なサイズでトリミングされたプレビュー写真を含めることで全体の UX を改善する方法の優れた例が含まれています。

于 2016-09-04T06:16:54.617 に答える