Отображение изображения профиля пользователя из 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)
}
}
}
}