Как поделиться фотографиями с Facebook в Objective-C?

#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 { }