Разрешения фотоальбома iOS на родном языке

Здравствуйте, я пытаюсь получить доступ к фотоальбому пользователя на iOS, чтобы пользователи могли выбрать изображение профиля в моем приложении.

Я использую собственный сценарий и не могу понять, как запросить разрешение на это. Моя ошибка:

 CONSOLE LOG file:///app/shared/user-view-model/user-view-model.js:96:28: fileUri: file:///var/mobile/Media/DCIM/100APPLE/IMG_0002.JPG
    CONSOLE LOG file:///app/shared/user-view-model/user-view-model.js:101:24: NSErrorWrapper: You don’t have permission to save the file “100APPLE” in the folder “DCIM”.

я использовал

<key>NSPhotoLibraryUsageDescription</key>
<string> ${PRODUCT_NAME} photo use</string>

в моем info.plist, но не повезло. Кто-нибудь знает, что мне не хватает?

var frame = require("ui/frame");
var platform = require("platform");
var firebase = require("nativescript-plugin-firebase");
var page;
var list;

function pageLoaded(args) {
    page = args.object;
    list = page.getViewById("urls-list");
}
exports.pageLoaded = pageLoaded;

function onSelectMultipleTap(args) {
    var imagepicker = require("nativescript-imagepicker");
    var context = imagepicker.create({
        mode: "multiple"
    });
    startSelection(context);
}
exports.onSelectMultipleTap = onSelectMultipleTap;

function onSelectSingleTap(args) {
    var imagepicker = require("nativescript-imagepicker");
    var context = imagepicker.create({
        mode: "single"
    });
    startSelection(context);
}
exports.onSelectSingleTap = onSelectSingleTap;

function startSelection(context) {
    context
        .authorize()
        .then(function() {
            list.items = [];
            return context.present();
        })
        .then(function(selection) {
            console.log("Selection done:");
            selection.forEach(function(selected) {
                console.log("----------------");
                console.log("uri: " + selected.uri);
                console.log("fileUri: " + selected.fileUri);
                uploadImage(selected.fileUri);
            });
            list.items = selection;
        }).catch(function (e) {
            console.log(e);
        });
}

function uploadImage(imageUrl){
  firebase.uploadFile({
    remoteFullPath: "test/testimage.jpg",
    localFullPath: imageUrl,
     onProgress: function(status) {
      console.log("Uploaded fraction: " + status.fractionCompleted);
      console.log("Percentage complete: " + status.percentageCompleted);
    }
  }).then((success) => {
    console.log("success: " + success);
  }, (error) => {
    console.log("Error: " + error);
  })
}

person xerotolerant    schedule 09.10.2016    source источник
comment
Не могли бы вы опубликовать еще немного кода? А вы пробовали этот плагин npmjs.com/package/nativescript-imagepicker?   -  person Dean Le    schedule 10.10.2016
comment
вы также можете просмотреть этот пример — github.com/NativeScript/sample-ImageUpload, где было использовал предложенный выше плагин - nativescript-imagepicker   -  person Nikolay Tsonev    schedule 10.10.2016
comment
Здравствуйте, я обновил сообщение, чтобы включить больше кода. Я использую средство выбора изображений. Я также использую его в сочетании с nativescript-plugin-firebase. Насколько я могу судить, я делаю все именно так, как они, я получаю миниатюру, как в примере. Однако когда дело доходит до загрузки изображения, он просто не работает с ошибкой, указанной выше.   -  person xerotolerant    schedule 10.10.2016


Ответы (2)


Вам нужен этот requestAuthorization

PHPhotoLibrary.requestAuthorization(function (result) {
    if (result === PHAuthorizationStatus.PHAuthorizationStatusAuthorized) {
        // OK
    } else {
        // no permissions!
    }
});

Вам также нужно это в вашем info.plist

<dict>
    <key>NSPhotoLibraryUsageDescription</key>
    <string></string>
</dict>
person Nick Iliev    schedule 10.10.2016
comment
Спасибо, но вы знаете, как это сделать с помощью нативного скрипта? - person xerotolerant; 10.10.2016
comment
Это собственный код, который можно использовать в приложении NativeScript. Если вы используете TypeScript, вам нужно будет установить tns-platform-declarations. Если вы используете ванильный JavaScript, вы можете копировать/вставлять прямо туда, где это необходимо. info.plist находится в app/App_Resources/iOS/ - person Nick Iliev; 10.10.2016
comment
Вот реальный пример использования в плагине imagepicker (немного сложно использовать с promises и looper) github.com/NativeScript/nativescript-imagepicker/blob/release/ - person Nick Iliev; 10.10.2016
comment
Мне никогда не удавалось использовать объявления tns-platform по какой-то непонятной причине. Например, я установил его через npm, но нигде в пакете нет ios.d.ts, хотя каждая статья, которую я мог найти, ссылается на него. Также я использовал imagepicker.authorize() , который, насколько я мог судить, ничего не делает. Я попытаюсь заставить работать объявления платформы и посмотреть, что к чему. - person xerotolerant; 10.10.2016
comment
Чтобы использовать tns-platform-declarations, используйте одно из следующих решений, описанных здесь: github. com/NativeScript/NativeScript/issues/ (либо решение 2.2.0, либо следующее) - person Nick Iliev; 10.10.2016
comment
Хорошо, спасибо, я получил объявления. Когда я запускаю рекомендованную вами функцию, я получаю сообщение об успешной авторизации, но при попытке загрузки возникает та же ошибка. Я думаю, что ваше предложение навело меня на правильный путь, потому что я не знал, как получить доступ к родным вещам. Если я использую URL-адрес напрямую вместо использования модуля файловой системы для извлечения файла, я получаю ту же ошибку, что и в это сообщение - person xerotolerant; 10.10.2016
comment
Давайте продолжим это обсуждение в чате. - person xerotolerant; 10.10.2016
comment
@xerotolerant ты смог найти решение этой проблемы? - person Muhammad bin Yusrat; 11.06.2019

Я нашел решение из этого поста на github

https://github.com/NativeScript/sample-ImageUpload/issues/2#issuecomment-252795778

Решение состояло в том, чтобы использовать метод getImage(), а затем метод saveToFile для результата.

private selectImage(context){
    context.authorize()
      .then(() => {return context.present()})
      .then((selection) => {
        selection.forEach((selected) => {
          selected.getImage()
            .then((imageSource) => {
              var appPath = fs.knownFolders.currentApp().path;
              var profilePath = "/img/profile.jpg";
              var filePath = fs.path.join(appPath, profilePath);
              var saved = imageSource.saveToFile(filePath, enums.ImageFormat.jpeg);
              console.log(`item saved:${saved}`);
              console.log("FilePath: " + filePath);
              console.log("Image source " + JSON.stringify(imageSource));
            },
            (error) => {
              console.log("error");
            })
        })
      })
  }
person xerotolerant    schedule 13.10.2016