最近,看到App Store上有些应用可以直接把做好的视频或图片分享到Instagram上,而且是那种直接打开Instagram,并且可以直接编辑的方式,这种分享非常的友好,不需要用户去登录,只要安装了Instagram就可以直接跳转过去,相当于我们说的一键发布,省去了很多的麻烦。

可是,在我去Instagram的开发者网站看的时候,发现并没有说怎么直接打开Instagram的方式,然后花了将近5天的时间在网上找答案。我研究别人的应用发现,他们其实并没用使用Instagram的SDK,因为并没有登录授权这一步,就像使用了iOS的原生分享,跳过了中间选择平台的步骤那样,直接选了Instagram。所以,我猜测是使用了Instagram的一个URL Schemes!

但是这个URL Scheme是什么,官方文档也没给出来,知道今天,我在网上看到一个国外的博客,终于实现这个方法:

原文戳这里:点击打开链接

主要就是这个了:

instagram://library?AssetPath=[URL ENCODED STRING OF PHOTO LIBRARY ASSET URL]&InstagramCaption=[URL ENCODED MESSAGE]

于是,自己写了一个原生实现方法:

//
//  SocialShare.m
//  Unity-iPhone
//#import "SocialShare.h"
#import <Social/Social.h>
#import <AssetsLibrary/AssetsLibrary.h>NSString * const STR_SPLITTER = @"|";
NSString * const STR_EOF = @"endofline";
NSString * const STR_ARRAY_SPLITTER = @"%%%";@interface SocialShare ()
{NSMutableArray *imageArray;//经过压缩的图片NSString* tempPath;
}@property (nonatomic, strong) NSString *theMainPath;
@property (nonatomic, strong) NSString *theVideoName;
@end@implementation GJCSocialSharestatic GJCSocialShare * shared_Instance;+ (id)sharedInstance {if (shared_Instance == nil)  {shared_Instance = [[self alloc] init];[shared_Instance initData];}return shared_Instance;
}
+ (void)PostShareToInstagram:(NSString*)videoPath
{NSLog(@"save video url: %@", videoPath);NSURL* instagramURL = [NSURL URLWithString:@"instagram://app"];if ([[UIApplication sharedApplication] canOpenURL:instagramURL]){NSString *caption = @"Some Preloaded Caption";ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];[library writeVideoAtPathToSavedPhotosAlbum:[NSURL URLWithString:videoPath] completionBlock:^(NSURL *assetURL, NSError *error) {NSString *escapedString   = [SocialShare urlencodedString:[assetURL absoluteString]];NSString *escapedCaption  = [SocialShare urlencodedString:caption];NSURL *insURL = [NSURL URLWithString:[NSString stringWithFormat:@"instagram://library?AssetPath=%@&InstagramCaption=%@", escapedString, escapedCaption]];[[UIApplication sharedApplication] openURL:insURL];}];}else{NSLog(@"无法打开Instagram,请确定是否安装了Instagram!");UnitySendMessage("NativeShare", "OnNativeShareUninstall", [DataConvertor NSStringToChar:@"instagram"]);}
}
+ (NSString*)urlencodedString:(NSString *)message{return [message stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]];
}
@end@implementation DataConvertor+(NSString *) charToNSString:(char *)value {if (value != NULL) {return [NSString stringWithUTF8String: value];} else {return [NSString stringWithUTF8String: ""];}
}+(const char *)NSIntToChar:(NSInteger)value {NSString *tmp = [NSString stringWithFormat:@"%ld", (long)value];return [tmp UTF8String];
}+ (const char *) NSStringToChar:(NSString *)value {return [value UTF8String];
}+ (NSArray *)charToNSArray:(char *)value {NSString* strValue = [GJC_DataConvertor charToNSString:value];NSArray *array;if([strValue length] == 0) {array = [[NSArray alloc] init];} else {array = [strValue componentsSeparatedByString:STR_ARRAY_SPLITTER];}return array;
}+ (const char *) NSStringsArrayToChar:(NSArray *) array {return [DataConvertor NSStringToChar:[GJC_DataConvertor serializeNSStringsArray:array]];
}+ (NSString *) serializeNSStringsArray:(NSArray *) array {NSMutableString * data = [[NSMutableString alloc] init];for(NSString* str in array) {[data appendString:str];[data appendString: STR_ARRAY_SPLITTER];}[data appendString: STR_EOF];NSString *str = [data copy];
#if UNITY_VERSION < 500[str autorelease];
#endifreturn str;
}+ (NSMutableString *)serializeErrorToNSString:(NSError *)error {NSString* description = @"";if(error.description != nil) {description = error.description;}return  [self serializeErrorWithDataToNSString:description code: (int) error.code];
}+ (NSMutableString *)serializeErrorWithDataToNSString:(NSString *)description code:(int)code {NSMutableString * data = [[NSMutableString alloc] init];[data appendFormat:@"%i", code];[data appendString: STR_SPLITTER];[data appendString: description];return  data;
}+ (const char *) serializeErrorWithData:(NSString *)description code: (int) code {NSString *str = [DataConvertor serializeErrorWithDataToNSString:description code:code];return [DataConvertor NSStringToChar:str];
}+ (const char *) serializeError:(NSError *)error  {NSString *str = [DataConvertor serializeErrorToNSString:error];return [DataConvertor NSStringToChar:str];
}@end

然后建立一个桥接的方法:

extern "C" {void _TS_ShareVideoWithInstagram(char* path) {NSString *savePath = [DataConvertor charToNSString:path];[SocialShare PostShareToInstagram:savePath];}
}

在Unity端加入调用方法:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#if UNITY_IPHONE && !UNITY_EDITOR
using System.Runtime.InteropServices;
#endif/// <summary>
/// 添加的库文件 AVKit,Social,AVFoundation,Foundation,MediaPlayer,AssetsLibrary
/// </summary>
public class NativeShare : MonoBehaviour {[DllImport ("__Internal")]private static extern void _TS_ShareImageWithInstagram(string savePath);[DllImport ("__Internal")]private static extern void _TS_ShareVideoWithInstagram(string savePath);private static NativeShare _instance = null;public static NativeShare Instance {get {if (_instance == null) {_instance = GameObject.FindObjectOfType(typeof(NativeShare)) as NativeShare;if (_instance == null) {_instance = new GameObject ().AddComponent<NativeShare> ();_instance.gameObject.name = _instance.GetType ().FullName;}}return _instance;}}/// <summary>/// 将本地图片分享到 Instagram 上去/// </summary>/// <param name="imagePath"></param>public void ShareImageWithInstagram(string imagePath){#if UNITY_IPHONE && !UNITY_EDITOR_TS_ShareImageWithInstagram(imagePath);#endif}/// <summary>/// 将本地视频分享到 Instagram 上去/// </summary>/// <param name="videoPath"></param>public void ShareVideoWithInstagram(string videoPath){#if UNITY_IPHONE && !UNITY_EDITOR_TS_ShareVideoWithInstagram(videoPath);#endif}private void OnNativeShareSuccess(string result){// Debug.Log("success: " + result);}private void OnNativeShareCancel(string result){// Debug.Log("cancel: " + result);}private void OnNativeShareUninstall(string platform){}
}

然后在其他地方调用ShareVideoWithInstagram

注意,我们要在Info.plist文件中添加一个参数:

<key>LSApplicationQueriesSchemes</key><array><string>instagram</string></array>

不然可能会崩溃哦!

最后,我们需要传递的是我们图片或者视频的存储的位置,这里没有写出图片的来,其实和视频差不多哦,多加个函数就好了,至于视频怎么保存,可以在网上搜索下,或者等下次我发个blog吧。。

希望可以帮到更多的人~

Unity3D-iOS分享本地视频或图片到Instagram(可直接打开Instagram分享的方式)相关推荐

  1. 分享本地视频到微信好友和QQ好友

    最近在做一个项目,需要分享本地视频到微信好友和QQ好友,这里总结一下分享本地视频的方法. 一.分享到微信 刚开始分享到微信时,没有自己申请appid,而是使用了之前一个项目的appid,并修改包名,改 ...

  2. “限时分享“ 本地80个小游戏 HTML+CSS+JS源码分享

    开源项目集合 1. "限时分享" 本地80个小游戏 HTML+CSS+JS源码分享 2. "限时分享" 别错过了,最全的微信小程序源码收集分享 里面有80款小游 ...

  3. iOS操作本地视频 - 获取,压缩,取第一帧

    文章目录 一.前言 二.通过PHAsset获取AVURLAsset 2.1 PhotoKit 简介 2.2 AVAsset的简单介绍 2.3 通过PHAsset 获取AVURLAsset 三. 视频压 ...

  4. iOS获取本地视频列表数据

    iOS本地的视频存在于三个地方: iTunes中影片中导入的视频文件 iTunes中通过共享文件导入的视频文件,即应用沙盒 摄像头拍摄的视频文件,可以相册找到 这三处获取视频列表方式不同. iTune ...

  5. ios微信本地视频上传到服务器,小程序 ios上传视频的问题

    微信小程序做了个视频上传的功能,上传视频到七牛云 安卓没有任何问题 ios就有问题了 ios下如果从相册选择视频上传之后提示上传成功了,但是跳转不了页面,但是如果直接拍摄的视频上传之后可以正常跳转页面 ...

  6. ios微信本地视频上传到服务器,ios本地视频wx.uploadFile上传

    //上传视频 uploadVideo:function(){ let _this = this; let list = ['camera', 'album']; wx.showActionSheet( ...

  7. 微信分享本地视频到朋友圈,收藏或者对话

    /*** 分享到微信* @param path 路径* @param scene 分享到对话--SendMessageToWX.Req.WXSceneSession; 分享到朋友圈--SendMess ...

  8. wangEditor 上传本地视频和图片到oss服务器并在富文本回显。

    不多说直接上代码,无效你顺着网线来打我: 先看一下改后的效果图 第一步:找到wangEditor.js文件,一下代码直接全选复制,到wangEditor.js文件里面Ctrl+A 在Ctrl+V全部替 ...

  9. Android VR Player(全景视频播放器) [6]:视频列表的实现-本地视频

    Android VR Player(全景视频播放器) [6]:视频列表的实现-本地视频 (本篇博客参考<Android第一行代码(第二版)>中关于RecyclerView的部分) 列表的实 ...

最新文章

  1. 模拟频率和数字频率的区别
  2. 面试时与人事交谈时间_如何与您的技术负责人交谈并解决通讯故障
  3. MySQL基础之增删改查
  4. 运行 vue 报node错
  5. 查看java返回的值,JavaScript 遍历对象查找指定的值并返回路径
  6. JavaWeb课程复习资料(十)——修改功能
  7. 搭建samba文件共享服务
  8. (vue基础试炼_07)Vue实例生命周期函数
  9. eclipse分级,分级列表显示 - bieshixuan的个人博客 - OSCHINA - 中文开源技术交流社区...
  10. Hadoop 的核心(1)—— HDFS
  11. Go实现 爬虫v0.1
  12. Keil v5安装和使用
  13. Android期末复习题库
  14. linux删除用户账户_如何在Linux中删除删除用户帐户?
  15. 华为云平台 IP SAN 存储配置
  16. 计算机大纲中的应用,计算机的应用论文提纲模板范本 计算机的应用论文大纲怎么写...
  17. (Math)矩阵求导
  18. Facebook Instant Game 捆绑包配置方法
  19. Linux 检查PCIe盘协商速率是否正确
  20. 智慧的云计算:IBM云计算解决方案

热门文章

  1. 解决Maven打包报错:Failed to clean project: Failed to delete[亲测好用]
  2. 弘辽科技:做京东还不会开快车?教你怎么开快车把流量拉起飞
  3. flash player for linux 64,总算明白为什么Flash Player迟迟出不了64位版本了
  4. 乔布斯是如何形象解释 OOP 的
  5. 路径规划Dijkstra算法
  6. 智能电视TV开发---客户端和服务器通信
  7. 山地速降,玩的就是心跳
  8. 骨传导蓝牙耳机什么牌子,推荐几款比较热销的骨传导耳机
  9. WWW2021:细粒度城市流量预测(附论文链接)
  10. 中华人民共和国电信条例