在 Facebook 上显式分享 iOS SDK 4.0
Explicit Sharing on Facebook iOS SDK 4.0
我想使用新的 iOS 4.0 SDK 在 Facebook 上明确分享一个开放图谱操作。以下不起作用。它出现在我的 Activity 日志中,但没有出现在我的时间轴上。
// Construct an FBSDKSharePhoto
FBSDKSharePhoto *photo = [[FBSDKSharePhoto alloc] init];
photo.image = img;
photo.userGenerated = YES;
// Create an object
NSDictionary *properties = @{
@"og:type": @"theprose:post",
@"og:title": post.title,
@"og:description": post.text,
@"og:caption": @"A fresh picked Prose for you.",
@"og:url": post.url,
@"fb:explicitly_shared": @"true"
};
FBSDKShareOpenGraphObject *object = [FBSDKShareOpenGraphObject objectWithProperties:properties];
// Create an action
FBSDKShareOpenGraphAction *act = [[FBSDKShareOpenGraphAction alloc] init];
act.actionType = @"theprose:share";
[act setObject:object forKey:@"theprose:post"];
[act setPhoto:photo forKey:@"image"];
// Create the content
FBSDKShareOpenGraphContent *content = [[FBSDKShareOpenGraphContent alloc] init];
content.action = act;
content.previewPropertyName = @"theprose:post";
[[FBSDKShareAPI shareWithContent:content delegate:nil] share];
如果您的 Facebook 应用不是 public,请确保在“角色”部分将测试帐户添加为测试帐户。
确保您已请求 publish_actions 权限:
https://developers.facebook.com/docs/facebook-login/ios/permissions
您的呼叫没有分配代理人,您很可能没有收到 Facebook 返回的错误
相同的问题,但在同一帐户下使用 FBSDKShareDialog 可以正常工作。所以问题出在其他地方。
转到您的打开图表设置、操作类型,然后选择您的自定义操作。向下滚动到功能部分并确保选中 "explicitly share" 框。
我遇到了同样的问题。我的意思是你的代码中的原因是,你在对象中设置了 fb:explicitly_shared 属性 而不是在相关操作中。
下面的代码应该可以解决这个问题。
[action setString:@"true" forKey:@"fb:explicitly_shared"];
它应该不起作用,因为 4.1 之前的 SDK 版本在 FB 中存在错误:
https://developers.facebook.com/bugs/943100005734949/
https://developers.facebook.com/bugs/1563738347248670
但在 SDK 4.1 版本中,此错误已修复,但与 FSDKShareDialog (((
相比,自定义 story/action/object 的内容以非常不同的方式显示
将此页面的答案拼凑在一起,这对我有用:
1.选中显式共享框
转到您的打开图表设置、操作类型,然后选择您的自定义操作。向下滚动到功能部分并确保选中 "explicitly share" 框。
2。设置 fb:explicitely_shared 启用
[action setString:@"true" forKey:@"fb:explicitly_shared"];
3。设置动作与对象之间的关系
确保您知道将动作与对象相关联的正确方法。在这种情况下,密钥是 "article":
[FBSDKShareOpenGraphAction actionWithType:@"mynamespace:share" object:object key:@"article"]
您可以通过查看您在 Facebook 应用的“开放图谱”设置中创建的操作类型来找到该键。当您通过故事将操作与对象连接时,该关系的新键将出现在操作页面的 属性 名称列下。
当您真正需要的只是该键的 property_name 时,原始发帖者使用 namespace:property_name 格式。这可能是 OP 的修复。
4.设置委托,查找错误
OP 没有利用 FBSDKSharingDelegate 功能。它会报告错误并帮助您解决问题:
[[FBSDKShareAPI shareWithContent:content delegate:self] share];
并在 self 中实现委托方法:
#pragma mark - FBSDKSharingDelegate
- (void) sharer:(id<FBSDKSharing>)sharer didCompleteWithResults:(NSDictionary *)results {
NSLog(@"Facebook sharing completed: %@", results);
}
- (void) sharer:(id<FBSDKSharing>)sharer didFailWithError:(NSError *)error {
NSLog(@"Facebook sharing failed: %@", error);
}
- (void) sharerDidCancel:(id<FBSDKSharing>)sharer {
NSLog(@"Facebook sharing cancelled.");
}
供参考,这是我的工作代码
// Create the object
NSMutableDictionary *properties = [NSMutableDictionary dictionaryWithDictionary: @{
@"og:type": @"mynamespace:article",
@"og:title": myModel.title,
@"og:description": @"myModel.description",
@"og:url": @"http://mywebsite.com"
}];
NSURL *imageURL = [myModel getImageURL];
if (imageURL) {
FBSDKSharePhoto *photo = [FBSDKSharePhoto photoWithImageURL:imageURL userGenerated:NO];
[properties setObject:@[photo] forKey:@"og:image"];
}
FBSDKShareOpenGraphObject *object = [FBSDKShareOpenGraphObject objectWithProperties:properties];
// Create the action
FBSDKShareOpenGraphAction *action = [FBSDKShareOpenGraphAction actionWithType:@"mynamespace:share" object:object key:@"article"];
[action setString:@"true" forKey:@"fb:explicitly_shared"];
// Create the content
FBSDKShareOpenGraphContent *content = [[FBSDKShareOpenGraphContent alloc] init];
content.action = action;
content.previewPropertyName = @"article";
// Share the content
FBSDKShareAPI *shareAPI = [[FBSDKShareAPI alloc] init];
shareAPI.shareContent = content;
shareAPI.delegate = self;
[shareAPI share];
再核对一下清单:FBSDKShareApi 仅适用于主线程。所以请确保您是从那里分享的。
我想使用新的 iOS 4.0 SDK 在 Facebook 上明确分享一个开放图谱操作。以下不起作用。它出现在我的 Activity 日志中,但没有出现在我的时间轴上。
// Construct an FBSDKSharePhoto
FBSDKSharePhoto *photo = [[FBSDKSharePhoto alloc] init];
photo.image = img;
photo.userGenerated = YES;
// Create an object
NSDictionary *properties = @{
@"og:type": @"theprose:post",
@"og:title": post.title,
@"og:description": post.text,
@"og:caption": @"A fresh picked Prose for you.",
@"og:url": post.url,
@"fb:explicitly_shared": @"true"
};
FBSDKShareOpenGraphObject *object = [FBSDKShareOpenGraphObject objectWithProperties:properties];
// Create an action
FBSDKShareOpenGraphAction *act = [[FBSDKShareOpenGraphAction alloc] init];
act.actionType = @"theprose:share";
[act setObject:object forKey:@"theprose:post"];
[act setPhoto:photo forKey:@"image"];
// Create the content
FBSDKShareOpenGraphContent *content = [[FBSDKShareOpenGraphContent alloc] init];
content.action = act;
content.previewPropertyName = @"theprose:post";
[[FBSDKShareAPI shareWithContent:content delegate:nil] share];
如果您的 Facebook 应用不是 public,请确保在“角色”部分将测试帐户添加为测试帐户。
确保您已请求 publish_actions 权限: https://developers.facebook.com/docs/facebook-login/ios/permissions
您的呼叫没有分配代理人,您很可能没有收到 Facebook 返回的错误
相同的问题,但在同一帐户下使用 FBSDKShareDialog 可以正常工作。所以问题出在其他地方。
转到您的打开图表设置、操作类型,然后选择您的自定义操作。向下滚动到功能部分并确保选中 "explicitly share" 框。
我遇到了同样的问题。我的意思是你的代码中的原因是,你在对象中设置了 fb:explicitly_shared 属性 而不是在相关操作中。
下面的代码应该可以解决这个问题。
[action setString:@"true" forKey:@"fb:explicitly_shared"];
它应该不起作用,因为 4.1 之前的 SDK 版本在 FB 中存在错误: https://developers.facebook.com/bugs/943100005734949/ https://developers.facebook.com/bugs/1563738347248670 但在 SDK 4.1 版本中,此错误已修复,但与 FSDKShareDialog (((
相比,自定义 story/action/object 的内容以非常不同的方式显示将此页面的答案拼凑在一起,这对我有用:
1.选中显式共享框
转到您的打开图表设置、操作类型,然后选择您的自定义操作。向下滚动到功能部分并确保选中 "explicitly share" 框。
2。设置 fb:explicitely_shared 启用
[action setString:@"true" forKey:@"fb:explicitly_shared"];
3。设置动作与对象之间的关系
确保您知道将动作与对象相关联的正确方法。在这种情况下,密钥是 "article":
[FBSDKShareOpenGraphAction actionWithType:@"mynamespace:share" object:object key:@"article"]
您可以通过查看您在 Facebook 应用的“开放图谱”设置中创建的操作类型来找到该键。当您通过故事将操作与对象连接时,该关系的新键将出现在操作页面的 属性 名称列下。
当您真正需要的只是该键的 property_name 时,原始发帖者使用 namespace:property_name 格式。这可能是 OP 的修复。
4.设置委托,查找错误
OP 没有利用 FBSDKSharingDelegate 功能。它会报告错误并帮助您解决问题:
[[FBSDKShareAPI shareWithContent:content delegate:self] share];
并在 self 中实现委托方法:
#pragma mark - FBSDKSharingDelegate
- (void) sharer:(id<FBSDKSharing>)sharer didCompleteWithResults:(NSDictionary *)results {
NSLog(@"Facebook sharing completed: %@", results);
}
- (void) sharer:(id<FBSDKSharing>)sharer didFailWithError:(NSError *)error {
NSLog(@"Facebook sharing failed: %@", error);
}
- (void) sharerDidCancel:(id<FBSDKSharing>)sharer {
NSLog(@"Facebook sharing cancelled.");
}
供参考,这是我的工作代码
// Create the object
NSMutableDictionary *properties = [NSMutableDictionary dictionaryWithDictionary: @{
@"og:type": @"mynamespace:article",
@"og:title": myModel.title,
@"og:description": @"myModel.description",
@"og:url": @"http://mywebsite.com"
}];
NSURL *imageURL = [myModel getImageURL];
if (imageURL) {
FBSDKSharePhoto *photo = [FBSDKSharePhoto photoWithImageURL:imageURL userGenerated:NO];
[properties setObject:@[photo] forKey:@"og:image"];
}
FBSDKShareOpenGraphObject *object = [FBSDKShareOpenGraphObject objectWithProperties:properties];
// Create the action
FBSDKShareOpenGraphAction *action = [FBSDKShareOpenGraphAction actionWithType:@"mynamespace:share" object:object key:@"article"];
[action setString:@"true" forKey:@"fb:explicitly_shared"];
// Create the content
FBSDKShareOpenGraphContent *content = [[FBSDKShareOpenGraphContent alloc] init];
content.action = action;
content.previewPropertyName = @"article";
// Share the content
FBSDKShareAPI *shareAPI = [[FBSDKShareAPI alloc] init];
shareAPI.shareContent = content;
shareAPI.delegate = self;
[shareAPI share];
再核对一下清单:FBSDKShareApi 仅适用于主线程。所以请确保您是从那里分享的。