如何在 Objective-C 中将照片分享到 Facebook?
Posted
技术标签:
【中文标题】如何在 Objective-C 中将照片分享到 Facebook?【英文标题】:How to share photos to Facebook in Objective-C? 【发布时间】:2016-10-07 06:51:51 【问题描述】:我想在我的自定义按钮点击后分享照片,我可以分享链接和消息,但在分享照片时却无法做到。
我正在使用最新的 Facebook SDK 框架 (4.15.1)。
这是我在按钮点击中的代码。
- (IBAction)btnsharecustom:(id)sender
//Get aws s3 Image.
NSString* strS3ImageURL = @"https://TEST_IMAGE_URL/1473497380077.jpg";
//Convert to URL.
NSURL* url1 = [NSURL URLWithString:strS3ImageURL];
//Convert it into data.
NSData* data = [NSData dataWithContentsOfURL:url1];
//Convert it to image.
UIImage* image = [UIImage imageWithData:data];
FBSDKSharePhoto *photo = [[FBSDKSharePhoto alloc]init];
photo.image = image;
photo.caption = @"Test Caption";
photo.userGenerated = YES;
FBSDKSharePhotoContent *content = [[FBSDKSharePhotoContent alloc] init];
content.photos = @[photo];
我将此代码包含在应用程序委托中。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// Override point for customization after application launch.
[[FBSDKApplicationDelegate sharedInstance] application:application
didFinishLaunchingWithOptions:launchOptions];
return YES;
//FaceBook URLs.
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:sourceApplication
annotation:annotation
];
// Add any custom logic here.
return handled;
在 info.plist 中也包含此代码
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>fb15771408xxx409xx</string>
</array>
</dict>
<key>FacebookAppID</key>
<string>15771408xxx409xx</string>
<key>FacebookDisplayName</key>
<string>Cedar ios</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fb-messenger-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
<string>fbapi20130214</string>
<string>fbapi20130410</string>
<string>fbapi20130702</string>
<string>fbapi20131010</string>
<string>fbapi20131219</string>
<string>fbapi20140410</string>
<string>fbapi20140116</string>
<string>fbapi20150313</string>
<string>fbapi20150629</string>
<string>fbapi20160328</string>
<string>fbauth</string>
<string>fb-messenger-api20140430</string>
</array>
当我点击我的自定义按钮 Facebook 应用程序或 safari 浏览器未启动时,谁能告诉我这里缺少什么?
【问题讨论】:
FBSDKSharePhotoContent 仅适用于 FB 应用程序...所以请确保您拥有应用程序并已登录。 @SanketBhavsar 是的,我已经安装了 FB 应用程序并且也登录了。 确保您已通过您的应用程序登录到 facebook 并授予在 facebook 上分享内容的权限。如果你想要代码,那么我会发布我的代码。 如果没有安装Facebook App,如何通过浏览器分享? 【参考方案1】:您应该在对内容进行建模后自己呈现对话框。
添加这个
[FBSDKShareDialog showFromViewController:self
withContent:content
delegate:nil];
到您的 - (IBAction)btnsharecustom:(id)sender
方法结束。
注意:下载图片需要时间,因为它使用同步请求。
//Convert it into data.
NSData* data = [NSData dataWithContentsOfURL:url1];
在此处阅读文档https://developer.apple.com/reference/foundation/nsdata/1547245-datawithcontentsofurl
不要使用这种同步方法来请求基于网络的 URL。对于基于网络的 URL,此方法会在慢速网络上阻塞当前线程数十秒,导致用户体验不佳,并且在 iOS 中可能会导致您的应用被终止。
解决此问题的方法是在用户点击按钮之前异步下载您的图片(如果要上传的图片是可预测的)。通常你可以在viewDidLoad
方法中做到这一点。试试这个https://github.com/rs/SDWebImage 库来简化异步请求图像。
【讨论】:
感谢您的回答。我还有 2 个疑问,是的,当我添加你的代码时,我得到了对话框。所以我的两个疑问是 1. 我提到了标题(你可以在我的代码中看到),但在我启动的对话框中仍然没有。第二个是,如果没有安装 Facebook 应用程序,那么通过 safari 等浏览器共享它的代码是什么? 1.标题是每张照片的描述,因此它不会显示在启动对话框中,因为您可能有不止一张照片。但是,我仍然不知道如何在对话框中添加文本。 2.它会自动检测到。你可以在这里查看文档developers.facebook.com/docs/sharing/ios 是的,文档并没有太大帮助。他们没有详细提及,我没有设置权限和标题【参考方案2】:试试这个代码。
- (IBAction)btnsharecustom:(id)sender
//Get aws s3 Image.
NSString* strS3ImageURL = @"https://placeholdit.imgix.net/~text?txtsize=15&txt=image1&w=120&h=120";
//Convert to URL.
NSURL* url1 = [NSURL URLWithString:strS3ImageURL];
//Convert it into data.
NSData* data = [NSData dataWithContentsOfURL:url1];
//Convert it to image.
UIImage* image = [UIImage imageWithData:data];
FBSDKSharePhoto *photo = [[FBSDKSharePhoto alloc]init];
photo.image = image;
photo.caption = @"Test Caption";
photo.userGenerated = YES;
FBSDKSharePhotoContent *content = [[FBSDKSharePhotoContent alloc] init];
content.photos = @[photo];
[FBSDKShareAPI shareWithContent:content delegate:self];
;
- (void)sharer:(id<FBSDKSharing>)sharer didCompleteWithResults:(NSDictionary *)results
【讨论】:
这将直接分享帖子而不显示对话框,并且需要用户扩展权限才能直接发布。 developers.facebook.com/docs/facebook-login/permissions/… 在上面的代码中出现异常,需要扩展权限还是其他什么? FBShareObj1 FBSDKLog:警告:访问令牌缺少 publish_actions 权限 FBShareObj1 -[ViewController sharer:didFailWithError:]:无法识别的选择器发送到实例 0x175ce3d0 FBShareObj1 *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[ViewController sharer:didFailWithError :]: 无法识别的选择器发送到实例 0x175ce3d0' *** 第一次抛出调用堆栈:libc++abi.dylib: 以 NSException 类型的未捕获异常终止 添加以下共享委托方法:- (void)sharer:(id进口
// 委托 FBSDKSharingDelegate
-(void)shareImageWithFacebook:(UIImage *)image if(![[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"fb://"]]) //您的设备没有 Facebook 应用。 返回;
FBSDKSharePhoto *photo = [FBSDKSharePhoto alloc];
photo.image = _imageSaved;
[photo setUserGenerated:YES];
photo.caption = AppName;
FBSDKSharePhotoContent *photoContent = [FBSDKSharePhotoContent alloc];
photoContent.photos = @[photo];
FBSDKShareDialog *dialog = [[FBSDKShareDialog alloc] init];
dialog.fromViewController = self;
dialog.delegate = self;
dialog.shareContent = photoContent;
[dialog show];
pragma mark- FBShareKit 委托
(void)sharer:(id)sharer didCompleteWithResults:(NSDictionary *)results (void)sharer:(id)sharer didFailWithError:(NSError *)error (void)sharerDidCancel:(id)sharer【讨论】:
以上是关于如何在 Objective-C 中将照片分享到 Facebook?的主要内容,如果未能解决你的问题,请参考以下文章
如何在objective-c中将约束添加到UImageView
如何在 Objective-C 中将带有补充视图的标题添加到 UiCollectionView?
如何在Objective-C中将二维整数数组对象添加到NSMutableArray?