このバグは、2016年5月23日にWhatsAppチームによって修正されました(ビルド番号2.16.4)。
WhatsAppにUIActivityViewController
を使用してNSStringオブジェクトを共有できません。
以下のコードを使用して共有しようとしました。ただし、リストから連絡先を選択すると、「This item cannot be shared. Please select a different item.
"
[〜#〜] code [〜#〜]
NSString *shareText = @"Temp text to share";
NSArray *itemsToShare = @[shareText];
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:itemsToShare applicationActivities:nil];
WhatsAppをバージョン2.16.2に更新した後、この問題に直面しています
WhatsAppチームからの返信を受け取りました
-WhatsAppサポート-
こんにちは、
遅れて申し訳ありません!私たちは最近多くのメールを受け取りました、そして私たちはそれらすべてに答えるために最善を尽くします。お待ちいただいてありがとうございます。
問題についてご連絡いただきありがとうございます。 WhatsAppの将来のバージョンで修正される予定です。残念ながら、今後のスケジュールについてコメントすることはできません。申し訳ありません。 WhatsAppの継続的な忍耐とサポートに感謝します。
乾杯、ハンス
したがって、彼らはバグを認め、次のリリースでこれを修正します。
考えられる回避策=>
共有しようとしているアイテムのローカルURLを共有してみてください。たとえば、pdfを共有する場合、NSDataまたはDataオブジェクトを共有しようとしないでください。WhatsAppはそのエラーを表示します。代わりに、ローカルURLを共有すると、WhatsAppはそれを認識し、適切に共有します。
データオブジェクトを共有しようとすると、ネイティブメール、Gmail、Slack、GDriveなどを含む多くのアプリがPDFを認識することに注意する必要があります。
例えば:
PDFをダウンロードした後、そのURLをfileURLという変数にバインドします。
var fileURL = URL(string: url)
let destination: DownloadRequest.DownloadFileDestination = { _, _ in
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
fileURL = documentsURL.appendingPathComponent("AWESOME_PDF.pdf")
return (fileURL!, [.removePreviousFile, .createIntermediateDirectories])
}
次に、代わりにfileURLを単純に共有できます。
let activityViewController = UIActivityViewController(
activityItems: [fileURL!],
applicationActivities: nil
)
WhatsAppはPDFを認識します。
お役に立てれば!
whatsappを更新した後、同じ問題に直面しています。 whatsappで「cancel」を押しても、完了ブロックは成功を示します。私は「WFActivitySpecificItemProvider」と「WFActivitySpecificItemProvider」を使用して解決しましたwhatsappで共有した後、activityViewControllerを破棄し、urで共有します。 WFActivitySpecificItemProvider、activityViewControllerクラスを https: //github.com/wileywimberly/WFActivitySpecificItemProvider
ここに私のコードがあります
- (void)share{
NSString *defaultMessage = @"your message may contain url";
// Use a dictionary
WFActivitySpecificItemProvider *provider1 =
[[WFActivitySpecificItemProvider alloc]
initWithPlaceholderItem:@""
items:@{
WFActivitySpecificItemProviderTypeDefault : defaultMessage,
UIActivityTypePostToFacebook : defaultMessage,
UIActivityTypeMail : defaultMessage,
UIActivityTypeMessage : defaultMessage,
@"com.linkedin.LinkedIn.ShareExtension":defaultMessage,
UIActivityTypePostToTwitter : defaultMessage
}];
// Use a block
WFActivitySpecificItemProvider *provider2 =
[[WFActivitySpecificItemProvider alloc]
initWithPlaceholderItem:@""
block:^(NSString *activityType){
if ([activityType isEqualToString:@"net.whatsapp.WhatsApp.ShareExtension"]) {
[avc dismissViewControllerAnimated:NO completion:nil];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
NSString *string = [NSString stringWithFormat:@"whatsapp://send?text=%@",defaultMessage];
NSURL *url = [NSURL URLWithString:[string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL: url];
});
}
return defaultMessage;
}];
avc = [[UIActivityViewController alloc]
initWithActivityItems:@[provider1, provider2]
applicationActivities:nil];
[avc dismissViewControllerAnimated:YES completion:nil];
[avc setValue:sharingHeader forKey:@"subject"];
[avc setCompletionHandler:^(NSString *activityType, BOOL completed) {
if (activityType) {
NSLog(@"activity: %@ completed: %@",activityType,completed ? @"YES" : @"NO");
} else {
NSLog(@"No activity was selected. (Cancel)");
}
}];
[self presentViewController:avc animated:YES completion:nil];
}
WhatsAppは、2016年5月23日付の更新(ビルド番号2.16.4)でこのバグを修正しました。
公式ソースからは報告されていませんが、コードでテストしました-正常に動作します。
Whatsappの最新バージョンでは、テキストとURLの両方を同時に共有することはできません。
私は以下のコードを試しました
NSArray *activityItems= @[someText,[NSURL URLWithString:@"http://www.google.com"]];
このコードを使用すると、URLリンクのみを共有できます。whatsAppは「someText」テキストを除外しました。
しかし、他の共有アプリ(SMSなど)はテキストとURLの両方を共有できます。
whatsAppがこの問題をすぐに修正することを願っています。
カスタムの IActivityItemSource でこの問題に遭遇しました。ここでは、ほとんどのプロバイダーがkUTTypeData
の代わりにdataTypeIdentifierForActivityType
デリゲートメソッドを理解しているkUTTypeText
を返していました。単純なケースのオーバーライドにより、私のケースの問題が修正されました。誰かがそれを見た場合、上記のエラーが飛び出る可能性があるちょうど別の理由。
open func activityViewController(_ activityViewController: UIActivityViewController, dataTypeIdentifierForActivityType activityType: UIActivityType?) -> String {
switch activityType {
case UIActivityType(rawValue: "net.whatsapp.WhatsApp.ShareExtension"):
return kUTTypeText as String
default:
return kUTTypeData as String
}
}