#ios #objective-c #iphone #facebook-graph-api #fbsdksharekit
#iOS #objective-c #iPhone #facebook-graph-api #fbsdksharekit
Вопрос:
Я хочу делиться фотографиями при нажатии пользовательской кнопки, могу делиться ссылками и сообщениями, но когда дело доходит до обмена фотографиями, я не могу этого сделать.
Я использую последнюю версию Facebook SDK framework (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 не запускаются, так что кто-нибудь может сказать мне, чего мне здесь не хватает?
Комментарии:
1. FBSDKSharePhotoContent работает только на FB App…so убедитесь, что у вас есть приложение и вы вошли в систему.
2. @SanketBhavsar да, я установил приложение FB и также вошел в него.
3. Убедитесь, что вы вошли в Facebook через свое приложение и дали разрешение на совместное использование контента на facebook. Если вам нужен код, я опубликую свой код.
4. Что делать, если у меня не установлено приложение Facebook, как я могу поделиться через браузер?
Ответ №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 библиотека, упрощающая асинхронный запрос изображения.
Комментарии:
1. Спасибо за ваш ответ. У меня есть еще 2 сомнения, да, когда я добавляю ваш код, я получаю диалоговое окно. итак, мои 2 сомнения — 1. Я упоминаю заголовок (вы можете видеть в моем коде), но все же его нет в моем запущенном диалоговом окне. 2-й вопрос: если приложение Facebook не установлено, то какой код для обмена им через браузер, например Safari?
2. 1. Подпись — это описание для каждой фотографии, поэтому она не будет отображаться в диалоговом окне запуска, поскольку у вас может быть более одной фотографии. Однако я до сих пор не знаю, как добавить текст в диалоговое окно. 2. Он автоматически обнаружит это. Вы можете ознакомиться с документацией здесь developers.facebook.com/docs/sharing/ios
3. Да, эта документация не очень помогла. они не упоминали подробно, я не могу установить разрешение и подпись
Ответ №2:
попробуйте этот код.
- (IBAction)btnsharecustom:(id)sender {
//Get aws s3 Image.
NSString* strS3ImageURL = @"https://placeholdit.imgix.net/~text?txtsize=15amp;txt=image1amp;w=120amp;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{
}
Комментарии:
1. Это приведет к публикации публикации напрямую, без отображения диалогового окна, и пользователю необходимо предоставить разрешение на прямую публикацию. developers.facebook.com/docs/facebook-login/permissions /…
2. Я получаю исключение в приведенном выше коде, требуется расширение разрешения или что-то еще? FBShareObj1 FBSDKLog: Предупреждение: отсутствует токен доступа к разрешениям publish_actions FBShareObj1 -[Разделитель ViewController: didFailWithError:]: нераспознанный селектор, отправленный экземпляру 0x175ce3d0 FBShareObj1 *** Завершение работы приложения из-за неперехваченного исключения ‘NSInvalidArgumentException’, причина: ‘-[Разделитель ViewController: didFailWithError :]: нераспознанный селектор, отправленный экземпляру 0x175ce3d0’*** Стек вызовов первого броска: libc abi.dylib: завершается неперехваченным исключением типа NSException
3. добавьте следующий метод делегирования для совместного использования: — (void)sharer:(id<FBSDKSharing>)sharer didFailWithError:(NSError *)ошибка{ }
4. @KKRocks спасибо за ваш ответ, да, я включил этот метод после метода действия buttonshare, получая ошибку примерно такого рода: «com.facebook.sdk: FBSDKErrorDeveloperMessageKey»: @»Для запроса информации о текущем пользователе должен использоваться токен активного доступа».
5. Пожалуйста, проверьте это, я думаю, что что-то не так в вашем appdelegate.developers.facebook.com/docs/ios/getting-started/#app-delegate
Ответ №3:
импорт
// Делегировать FBSDKSharingDelegate
-(void)shareImageWithFacebook:(UIImage *)изображение { 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 *)результаты { }
- (void)sharer:(id)sharer didFailWithError:(NSError *)ошибка { }
- (void) sharerDidCancel:(id)sharer { }