UIActivityViewController分享图片对象时不显示Message选项问题
解决方案
核心原因
Messages应用对分享资源的访问权限要求更高,你单独传入临时目录下的私有文件URL时,Messages无法读取该文件,所以不会出现在分享列表中。
可落地的修改方案
1. 优先检查测试环境
- 不要使用iOS模拟器测试Messages分享功能,模拟器默认未配置iMessage账户,不会显示该选项
- 测试用实体设备必须已登录Apple ID,且开启了iMessage/短信发送功能
2. 修改分享参数适配
初始化activityItems时同时传入UIImage对象和本地文件URL,不要只传单一资源,提升不同应用的适配性,同时将文件写入的atomically参数改为YES,确保文件完全写入完成后再触发分享。
修改后的代码如下:
UIImage *receiptStage3 = [CreateReceiptImage putLogo:nil putLabel:TRANSACTION_RECEIPT inImage:receiptStage2]; NSData *imageData = UIImageJPEGRepresentation(receiptStage3,0.5); // 创建本地临时文件 NSDateFormatter *dateFormatter=[[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyyMMddHHmmss"]; NSString *fileName = [NSString stringWithFormat:@"FormatHere-%@.jpg", [dateFormatter stringFromDate:[NSDate date]]]; NSURL *url = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingString:fileName]]; // 改为原子写入,避免文件写入不完整 [imageData writeToURL:url atomically:YES]; // 同时传入图片对象和文件URL,适配更多分享应用 NSArray *activityItems = @[receiptStage3, url]; UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil]; // 原排除列表未排除Message选项,无需修改 activityVC.excludedActivityTypes = @[UIActivityTypePostToTencentWeibo, UIActivityTypePostToVimeo, UIActivityTypePostToWeibo, UIActivityTypePostToFlickr, UIActivityTypePostToTwitter, UIActivityTypePostToFacebook, UIActivityTypePrint, UIActivityTypeAssignToContact, UIActivityTypeOpenInIBooks, UIActivityTypeAirDrop,UIActivityTypeSaveToCameraRoll,UIActivityTypeAddToReadingList]; [activityVC setCompletionWithItemsHandler:^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) { // 清理临时文件 NSError *errorBlock; if([[NSFileManager defaultManager] removeItemAtURL:url error:&errorBlock] == NO) { NSLog(@"删除临时文件失败: %@",errorBlock.localizedDescription); } }]; [self presentViewController:activityVC animated:YES completion:nil];
3. 备选兜底方案
如果以上修改还是不显示Messages选项,可先将图片写入系统相册,再传入相册对应的assetURL进行分享,Messages对相册公共资源的适配度更高,注意iOS 14及以上系统需要提前申请相册读写权限。
内容的提问来源于stack exchange,提问作者GonoGini
相关产品推荐
相关产品推荐

