質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Q&A

解決済

1回答

2213閲覧

【ios】bluetoothのアドバタイズ時にサムネイル画像を表示したい

9_zaku

総合スコア12

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

0グッド

1クリップ

投稿2015/11/09 03:30

bluetooth(フレームワーク:multipeer connectivity )を使ってチャットの送受信するアプリを作ろうとしています。
その際にアドバタイズする情報に自分で設定したサムネイル画像を送信し、相手側の端末でデバイス検索時に、相手の端末名と共にそのサムネイル画像も表示したいのですが、うまくいきません。
もちろん、一度端末同時が接続してしまえば、画像を送信することはできます。
しかし、やりたいことは、端末同士が接続する前の端末を検知した時点で、相手の設定した画像情報を取得して表示したいのです。

やり方としては、アドバタイズする際にMCAdvertiserAssistantを作成する際のサービスタイプの詳細情報(info)に画像データ(NSData)をセットする方法かと思うのですが、アプリが引数エラーで異常終了します。

画像データの大きさが問題なのかと思いましたが、どんなに頑張っても700byteくらいにしか小さくできませんでした。
以下にコードのサンプルを掲載します。

objective

1コード 2 UIImage *imageToSave = [UIImage imageNamed:@"flower.jpg"]; 3 4 /* 画像をリサイズする*/ 5 CGSize resize = CGSizeMake(10, 10); 6 7 // Create a graphics image context 8 UIGraphicsBeginImageContext(resize); 9 [imageToSave drawInRect:CGRectMake(0,0,resize.width,resize.height)]; 10 UIImage* resizedImage = UIGraphicsGetImageFromCurrentImageContext(); 11 UIGraphicsEndImageContext(); 12 13 NSData *jpgData = [[NSData alloc] initWithData:UIImageJPEGRepresentation(resizedImage, 0.1)]; 14 // infoにメッセージをセットする 15 [info setObject:jpgData forKey:@"image"]; 16 17 _nearbyServiceAdvertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:peerID 18 discoveryInfo:info 19 serviceType:serviceType]; 20

RFC6763のSection6にアドバタイズ時の詳細情報(info)のkey/valueの
記載がありますが、バイナリデータを送信しても問題ないような記載があります。
リンク内容

また、bluetooth(フレームワーク:multipeer connectivity )を使ってると思われる類似のiosアプリ『偶然の出会い』では、bluetoothのみで相手のサムネイル画像を表示する機能がありました。

どなたかもしご存じの方がいましたら、ご教授をお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

discoveryInfoの型が、

ObjectiveC

1NSDictionary<NSString *, NSString *>

と、キーも値もNSStringになっていますので、NSDataをBase64でエンコードしてみてはどうでしょうか?
参考URL:iOS 7 では標準で NSData の base64 エンコードが出来るようになりました / Qiita

また、サイズ制限を疑うのであれば、画像以外のデータ(文字列とか)をNSData化して試してみればよいと思います。

投稿2015/11/09 04:06

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

9_zaku

2015/11/09 05:49

fuzzball様 ご回答して頂きありがとうございます。 discoveryInfoの型が、 NSDictionary<NSString *, NSString *> とのご指摘まさにその通りでした。 そこで、ご紹介して頂いきました記事と次の参考URLを元にNSdataをBase64でエンコードしてみました 参考のURL:http://qiita.com/katsuhisaishii/items/76d5eb76317148662eab ------------------------コード開始------------------------- NSData *jpgData = [[NSData alloc] initWithData:UIImageJPEGRepresentation(resizedImage, 0.1)]; NSString *base64str = [jpgData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength]; [info setObject:base64str forKey:@"image"]; ------------------------コード終了------------------------- 結果、次の様な引数エラーとなりました。 Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid discoveryInfo passed to MCNearbyServiceAdvertiser' また、サイズの方ですが文字列型(NSString)で全角約90文字でエラーとなり、80文字ではエラーとなりませんでした。 よって160byteくらいが送信の限界なのでしょうか。 念のためサンプルコードを以下に記載します。 ------------------------コード開始------------------------- NSString *displayMessage="あいうえおかきくけこさしすせそ・・・" [info setObject:displayMessage forKey:@"message"]; ------------------------コード終了------------------------- 質問ばかりで恐縮ですが、 画像データを160byte以下のサイズにすることは可能なのでしょうか?
fuzzball

2015/11/09 08:43

まともな画像で160バイト以下というのは無理でしょうね。 Bluetooth関係は実際に使ったことが無いので、これ以上はお役に立てそうにありません。
9_zaku

2015/11/09 09:22

fuzzball様 度々ご回答して頂きありがとうございます。 試行錯誤した結果、端末を検知した時点で、相手の設定した画像情報を取得して表示することが不完全ながら可能となりました。 不完全というのは、画像が送信元の画像と完全に同じに復元はできませんが、ある程度の精度で復元できたということです。 やり方としましては、 【送信側】 ①画像データ(NSData)をNSRange(150byte)で分割 ②①で分割したNSDataをNSString型にbase64エンコード ③base64エンコードしたものをそれぞれdiscoveryInfoにセット 【受信側】 ①受信したNSStringを順番に結合 ②結合したNSStringをbase64デコードしてNSDataを復元 ③NSDataから画像を作成 ソースは以下の通りです。 ーーーーー【送信側】ーーーーー /* 画像をリサイズする場合*/ CGSize resize = CGSizeMake(100, 100); UIGraphicsBeginImageContext(resize); [imageToSave drawInRect:CGRectMake(0,0,resize.width,resize.height)]; UIImage* resizedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); NSData *jpgData = [[NSData alloc] initWithData:UIImageJPEGRepresentation(resizedImage, 0.1)]; // jpgDataのサイズは1817 NSRange range1; range1.location = 0; range1.length = 149; NSRange range2; range2.location = 150; range2.length = 149; NSRange range3; range3.location = 300; range3.length = 149; NSRange range4; range4.location = 450; range4.length = 149; NSRange range5; range5.location = 600; range5.length = 149; NSRange range6; range6.location = 750; range6.length = 149; NSRange range7; range7.location = 900; range7.length = 149; NSRange range8; range8.location = 1050; range8.length = 149; NSRange range9; range9.location = 1200; range9.length = 149; NSRange range10; range10.location = 1350; range10.length = 149; NSRange range11; range11.location = 1500; range11.length = 149; NSRange range12; range12.location = 1650; range12.length = 149; NSRange range13; range13.location = 1800; range13.length = 17; NSData *jpgDataPart1 = [jpgData subdataWithRange:range1]; NSData *jpgDataPart2 = [jpgData subdataWithRange:range2]; NSData *jpgDataPart3 = [jpgData subdataWithRange:range3]; NSData *jpgDataPart4 = [jpgData subdataWithRange:range4]; NSData *jpgDataPart5 = [jpgData subdataWithRange:range5]; NSData *jpgDataPart6 = [jpgData subdataWithRange:range6]; NSData *jpgDataPart7 = [jpgData subdataWithRange:range7]; NSData *jpgDataPart8 = [jpgData subdataWithRange:range8]; NSData *jpgDataPart9 = [jpgData subdataWithRange:range9]; NSData *jpgDataPart10 = [jpgData subdataWithRange:range10]; NSData *jpgDataPart11 = [jpgData subdataWithRange:range11]; NSData *jpgDataPart12 = [jpgData subdataWithRange:range12]; NSData *jpgDataPart13 = [jpgData subdataWithRange:range13]; NSString *base64str1 = [jpgDataPart1 base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength]; NSString *base64str2 = [jpgDataPart2 base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength]; NSString *base64str3 = [jpgDataPart3 base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength]; NSString *base64str4 = [jpgDataPart4 base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength]; NSString *base64str5 = [jpgDataPart5 base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength]; NSString *base64str6 = [jpgDataPart6 base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength]; NSString *base64str7 = [jpgDataPart7 base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength]; NSString *base64str8 = [jpgDataPart8 base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength]; NSString *base64str9 = [jpgDataPart9 base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength]; NSString *base64str10 = [jpgDataPart10 base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength]; NSString *base64str11 = [jpgDataPart11 base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength]; NSString *base64str12 = [jpgDataPart12 base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength]; NSString *base64str13 = [jpgDataPart13 base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength]; [info setObject:base64str1 forKey:@"image1"]; [info setObject:base64str2 forKey:@"image2"]; [info setObject:base64str3 forKey:@"image3"]; [info setObject:base64str4 forKey:@"image4"]; [info setObject:base64str5 forKey:@"image5"]; [info setObject:base64str6 forKey:@"image6"]; [info setObject:base64str7 forKey:@"image7"]; [info setObject:base64str8 forKey:@"image8"]; [info setObject:base64str9 forKey:@"image9"]; [info setObject:base64str10 forKey:@"image10"]; [info setObject:base64str11 forKey:@"image11"]; [info setObject:base64str12 forKey:@"image12"]; [info setObject:base64str13 forKey:@"image13"]; _nearbyServiceAdvertiser = [[MCNearbyServiceAdvertiser alloc] initWithPeer:peerID discoveryInfo:info serviceType:serviceType]; ーーーーー【受信側】ーーーーー // infoからimageを取得 NSString *image1 = [info objectForKey:@"image1"]; NSString *image2 = [info objectForKey:@"image2"]; NSString *image3 = [info objectForKey:@"image3"]; NSString *image4 = [info objectForKey:@"image4"]; NSString *image5 = [info objectForKey:@"image5"]; NSString *image6 = [info objectForKey:@"image6"]; NSString *image7 = [info objectForKey:@"image7"]; NSString *image8 = [info objectForKey:@"image8"]; NSString *image9 = [info objectForKey:@"image9"]; NSString *image10 = [info objectForKey:@"image10"]; NSString *image11 = [info objectForKey:@"image11"]; NSString *image12 = [info objectForKey:@"image12"]; NSString *image13 = [info objectForKey:@"image13"]; // データを結合する NSString *base64str = [NSString stringWithFormat:@"%@%@%@%@%@%@%@%@%@%@%@%@%@", image1,image2,image3,image4,image5,image6,image7,image8, image9,image10,image11,image12,image13]; // NSDataにBase64エンコードする NSData *jpgData = [[NSData alloc] initWithBase64EncodedString:base64str options:NSDataBase64DecodingIgnoreUnknownCharacters]; 画像の復元が不完全ではありますが、 fuzzball様の助言のおかげで目的をほぼ達成することができましたので、 解決済みとさせて頂きます。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問