【问题标题】:iOS photo album permissions nativescriptiOS相册权限nativescript
【发布时间】:2016-10-09 18:57:00
【问题描述】:

您好,我正在尝试访问 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);
  })
}

【问题讨论】:

  • 你能再贴一些代码吗?你试过这个插件吗npmjs.com/package/nativescript-imagepicker
  • 您也可以查看此示例 - github.com/NativeScript/sample-ImageUpload ,其中已使用上述建议的插件 - nativescript-imagepicker
  • 您好,我更新了帖子以包含更多代码。我正在使用图像选择器。我还将它与 nativescript-plugin-firebase 结合使用。据我所知,我正在按原样做所有事情,我得到了示例中的缩略图。但是,在上传图片时,它会因上述错误而失败。

标签: ios firebase nativescript file-permissions ios-permissions


【解决方案1】:

你需要这个requestAuthorization

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

您的 info.plist

中也需要这个
<dict>
    <key>NSPhotoLibraryUsageDescription</key>
    <string></string>
</dict>

【讨论】:

  • 谢谢,但你知道如何使用 nativescript 来做到这一点吗?
  • 这是可以在 NativeScript 应用程序中使用的本机代码。如果您使用的是 TypeScript,您将需要安装 tns-platform-declarations.. 如果您使用的是 vanilla JavaScript,那么您可以在需要的地方直接复制/粘贴。 info.plist 位于 app/App_Resources/iOS/
  • 这是 imagepicker 插件中的真实示例用法(与 promises 和 looper 一起使用有点复杂)github.com/NativeScript/nativescript-imagepicker/blob/release/…
  • 由于某些无法理解的原因,我一直无法使用 tns-platform 声明。例如,我通过 npm 安装了它,但即使我能找到的每篇文章都引用它,包中的任何地方都没有“ios.d.ts”。我还使用了imagepicker.authorize() ,据我所知,它什么也没做。我将尝试让平台声明工作,看看是什么。
  • 好的,谢谢我得到了声明。当我运行你推荐的函数时,我得到授权成功,但在尝试上传时出现同样的错误。我认为您的建议使我走上了正确的道路,因为我不知道如何访问本地内容。如果我直接使用 url 而不是使用文件系统模块来获取文件,我会得到与 this post 相同的错误
【解决方案2】:

我从这篇 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");
            })
        })
      })
  }

【讨论】:

    猜你喜欢
    • 2015-06-22
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    相关资源
    最近更新 更多