Отображение изображения профиля пользователя из Salesforce в приложении iOS

Я пытаюсь отобразить вошедшее в профиль изображение пользователя, используя следующее:

    NSLog(@"url is : %@",[SFAccountManager sharedInstance].idData.pictureUrl);
    profilePicData=[NSData dataWithContentsOfURL:[SFAccountManager sharedInstance].idData.pictureUrl];
    if ( profilePicData )
    {
        NSArray       *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString  *documentsDirectory = [paths objectAtIndex:0];

        NSString  *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"filename.jpg"];
        NSLog(@"pic path:  %@",filePath);
        [profilePicData writeToFile:filePath atomically:YES];
    }
    NSLog(@"pic data:  %@",profilePicData);


}

в NSLog("%@", [NSData dataWithContentsOfURL:[SFAccountManager sharedInstance].idData.pictureUrl]); показывает некоторые данные, но не отображает изображение в UIImageView.

Любая помощь будет оценена.

4 ответа

Решение

Вызов Salesforce Rest API и получение информации о пользователе.

    NSString *path=@"/services/data/v29.0/chatter/users/me";
    SFRestMethod method=0;
    SFRestRequest *request = [SFRestRequest requestWithMethod:method path:path queryParams:queryParams];
    [[SFRestAPI sharedInstance] send:request delegate:self];

это вернет ответ JSON. - (void) запрос:(SFRestRequest *) запрос didLoadResponse:(id)dataResponse {….}

Извлеките из него необходимый словарь фотографий и используйте fullEmailPhotoUrl для загрузки / сохранения изображений. использование largePhotoUrl и largePhotoUrl не загрузили картинку для меня. Например. разобрано фото словаря:

фото = {

fullEmailPhotoUrl = " https://na14.salesforce.com/ncsphoto/< SOMEIDENTIFIERS> ";

largePhotoUrl = " https://c.na14.content.force.com/profilephoto/< SOMEIDENTIFIERS> / F ";

photoVersionId = < PHOTOID>;

smallPhotoUrl = " https://c.na14.content.force.com/profilephoto/< SOMEIDENTIFIERS> / Т ";

standardEmailPhotoUrl = " https://na14.salesforce.com/ncsphoto/< SOMEIDENTIFIERS> ";

url = "/services/data/v29.0/chatter/users/< SOMEIDENTIFIERS> / Фото ";

};

Я пытался сделать то же самое в Chatter API - я хотел загрузить изображение из данных канала в "smallPhotoUrl". Я обнаружил, что в конце URL должен быть добавлен активный токен.

Этот источник познакомил меня с концепцией: Доступ к фотографиям пользователя Chatter

И, наконец, я смог найти некоторую ясную информацию о том, как получить доступ к этому токену здесь: salesforce_platform_mobile_services.pdf страница 262

В итоге я сделал это:

    NSString *builtImageUrlWithToken = [NSString stringWithFormat:@"%@?oauth_token=%@",
 phototoUrl, [SFAccountManager sharedInstance].credentials.accessToken];


    NSURL *imageURL = [NSURL URLWithString:builtImageUrlWithToken];
    NSData *imageData = [NSData dataWithContentsOfURL:imageURL];

Я думаю, что это актуально для этой темы, так как я столкнулся с ней, когда искал именно это решение. Я уверен, что это может быть полезно и для других.

Спасибо!

Первые документы Apple говорят, что не следует использовать dataWithContentsOfURL для сетевых вызовов, потому что это синхронно.

Таким образом, вы можете сделать что-то вроде этого, чтобы получить изображение:

SFIdentityData *idData = [SFAccountManager sharedInstance].idData;

if(idData != nil) {
    SFRestRequest *request = [[SFRestRequest alloc] init];
    request.endpoint = [idData.pictureUrl absoluteString];
    request.method = SFRestMethodGET;
    request.path = @"";

    [[SFRestAPI sharedInstance] send:request delegate:_delegate];
}

(Это асинхронно. Вы можете использовать блоки вместо делегирования.)

В вашем делегате вы можете (например) сохранить изображение в CoreData или назначить NSData для UIImage таким образом:

[[UIImage alloc] initWithData: picData];

Вы также должны убедиться, что ваш UIImage правильно подключен, например, один из способов - через UIImageView, который является IBOutlet.

В Swift 3, используя Alamofire:

       if let url = URL(string: baseURl + "/sobjects/Attachment/\(imageID)/Body"){

       let header = ["Authorization": "Your Auth Token"]

        Alamofire.request(url, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: header).responseData { (response) in
            if response.error == nil {
                // Show the downloaded image:
                if let data = response.data {
                    self.profileImg.image = UIImage(data: data)
                }
            }
          }
        }
Другие вопросы по тегам