Делитесь фотографиями в Instagram из приложения React-Native, созданного с помощью Expo SDK

Я хочу, чтобы мое приложение, поддерживающее реакцию, делилось фотографией с Instagram. Я знаю, что при написании нативного кода можно открыть экран фильтра Instagram с указанной фотографией. Ограничение заключается в том, что я использую Expo SDK, который не позволяет использовать npm link для собственных зависимостей.

При вызове этой функции откроется Instagram:

  _handlePress = () => {
    Linking.openURL('instagram://app');
  }

Это кнопка:

   <Button 
      onPress={this._handlePress}
      title='Open Instagram'
    />

Изображение хранится в состоянии:

  state = {
    image: null,
    uploading: false
  }

Я могу просто отобразить изображение в теге Image:

<Image
  source={{uri: image}}
  style={{width: 300, height: 300}}
 />

Но у меня нет возможности передать изображение в Instagram. Вот несколько неудавшихся исследований: Сторонние библиотеки: response-native-instagram-share: https://www.instagram.com/developer/mobile-sharing/iphone-hooks/

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

В документации Instagram объясняется, как открыть Instagram, и что передача изображения может быть выполнена с помощью собственного кода. То есть использовать «UIDocumentInteractionController», который недоступен в JavaScript.
https://www.instagram.com/developer/mobile-sharing/iphone-hooks/

На мой вопрос нет других ответов Stackoverflow.


person whs.bsmith    schedule 17.06.2017    source источник
comment
Я не думаю, что Share API может специально ориентироваться на Instagram.   -  person whs.bsmith    schedule 17.06.2017


Ответы (4)


Я собрал пример, который вы можете запустить на iOS здесь: https://snack.expo.io/rkbW-EG7-

Полный код ниже:

import React, { Component } from 'react';
import { Linking, Button, View, StyleSheet } from 'react-native';
import { ImagePicker } from 'expo';

export default class App extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Button title="Open camera roll" onPress={this._openCameraRoll} />
      </View>
    );
  }

  _openCameraRoll = async () => {
    let image = await ImagePicker.launchImageLibraryAsync();
    let { origURL } = image;
    let encodedURL = encodeURIComponent(origURL);
    let instagramURL = `instagram://library?AssetPath=${encodedURL}`;
    Linking.openURL(instagramURL);
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
    backgroundColor: '#ecf0f1',
  },
});

Это позволит вам открыть фотопленку и выбрать изображение, а затем открыть приложение Instagram с выбранным изображением. Если изображения еще нет в фотопленке, вы можете использовать CameraRoll.saveToCameraRoll на изображении (ссылка на документацию React Native), чтобы получить это там.

Однако подход, использованный в этом примере, будет работать только в том случае, если вы согласны с совместным использованием из камеры, и я не уверен, как это сделать на Android. Я создал проблему на доске запросов функций Expo, чтобы убедиться, что совместное использование Instagram работает отлично из коробки.

person brentvatne    schedule 17.06.2017
comment
Это именно то, что мне нужно. Я действительно добавил CameraRoll.saveToCameraRoll, и он отлично работает. Мне нужно придумать решение для Android, так как вам нужно использовать локальный файл. - person whs.bsmith; 17.06.2017
comment
Может docs.expo.io/versions/latest/sdk/intent-launcher .html для Android, @brentvatne? - person jhm; 10.01.2018
comment
Как вы получили этот URL-адрес в Instagram, @brentvatne? Здесь это не задокументировано: instagram.com/developer/mobile-sharing/iphone- крючки. Кроме того, мы будем очень благодарны за любые советы о том, как это сделать на Android. - person jhm; 08.02.2018
comment
Работает для меня :) onClick = () = ›{ImagePicker.launchImageLibrary (options, response =› {console.log (response); let instagramURL = instagram://library?LocalIdentifier= + response.origURL; Linking.openURL (instagramURL);}) - person Krunal Vaghela; 20.10.2019
comment
Есть идеи, как этого добиться для Android? - person Gabriel Luque; 13.07.2020
comment
Я пробовал в Android и получил следующее: Ошибка: не удалось открыть URL-адрес instagram: // library? AssetPath = file% 3A% 2F% 2F% 2Fstorage% 2Femulated% 2F0% 2FAndroid% 2Fdata% 2Fcom.oit.legionsports% 2Ffiles% 2FPictures % 2F696bd70b-34ea-49da-8817-f4de21fca932.jpg ': Не обнаружено действие для обработки намерения {act = android.intent.action.VIEW dat = instagram: // library? AssetPath = file: /// storage / emulated / 0 /Android/data/com.oit.legionsports/files/Pictures/696bd70b-34ea-49da-8817-f4de21fca932.jpg flg = 0x10000000}. Какие-нибудь решения? - person Luvnish Monga; 15.10.2020

Вот как вы публикуете

import { CameraRoll } from 'react-native'

callThisFunction = async () => {
      await CameraRoll.saveToCameraRoll("https://images.unsplash.com/photo-1504807417934-b7fdec306bfd?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&w=1000&q=80", 'photo');
      let instagramURL = `instagram://library?AssetPath=null`;
      Linking.openURL(instagramURL);
  }
person Li Yuhao    schedule 28.02.2019
comment
Добро пожаловать в Stack Overflow! Прочтите о чем этот сайт и Как спросить, прежде чем задать вопрос. - person Miroslav Glamuzina; 28.02.2019
comment
Добро пожаловать в Stack Overflow! Прочтите о чем этот сайт и Как спросить, прежде чем задать вопрос. - person Miroslav Glamuzina; 28.02.2019
comment
Это сработало для меня - ключевым моментом здесь является Instagram, просто открывающий последнюю сохраненную фотографию и т. Д. Не уверен, работает ли это на Android. - Я также немного обеспокоен тем, что этого нет в их документации по телефонным крючкам и т. Д. - person Danny; 28.03.2019

Вот как поделиться файлом с удаленного URL: сначала скачайте! :)

  const downloadPath = FileSystem.cacheDirectory + 'fileName.jpg';
  // 1 - download the file to a local cache directory
  const { uri: localUrl } = await FileSystem.downloadAsync(remoteURL, downloadPath);
  // 2 - share it from your local storage :)
  Sharing.shareAsync(localUrl, {
    mimeType: 'image/jpeg',            // Android
    dialogTitle: 'share-dialog title', // Android and Web
    UTI: 'image/jpeg'                  // iOS
  });
person Aleksandar    schedule 06.08.2019
comment
Sharing.shareAsync открывает диалоговое окно общего доступа к системе, а не непосредственно приложение Instagram, как задано в этом вопросе. - person Petr Bela; 27.07.2020
comment
@PetrBela Дело в первой части - идея сначала скачать файл. Однако я не буду редактировать этот ответ. Прошло много времени с тех пор, как я его написал, и у меня нет времени писать и тестировать код, который мне нужно было бы написать. Спасибо за идею. Надеюсь, мой ответ кому-то поможет. - person Aleksandar; 30.07.2020

Работал на меня :)

onClick = () => {
  ImagePicker.launchImageLibrary(options, response =>{
    console.log(response);
    let instagramURL = `instagram://library?LocalIdentifier=`+response.origURL;
    Linking.openURL(instagramURL);
  })
person Krunal Vaghela    schedule 20.10.2019