私は、Instagramが起動して次の2つのオプションを提供するアプリの共有エクスペリエンスを作成しようとしています。
Facebookにはかなり 無駄のないドキュメント それについてあります。 UIDocumentInteractionControllerを使用して、考えられるすべての順列を試しました。 uti
com.instagram.photo
およびcom.instagram.video
としてig
拡張子を付けて使用してみましたが、Instagramを直接起動する代わりに、標準の共有ポップオーバーを取得し続けます。 igo
でcom.instagram.exclusivegram
も試しましたが、とにかく標準のポップオーバーをトリガーすることになっているようです。
最新のコード:
func shareVideo(_ filePath: String) {
let url = URL(fileURLWithPath: filePath)
if(hasInstagram()){
let newURL = url.deletingPathExtension().appendingPathExtension("ig")
do {
try FileManager.default.moveItem(at: url, to: newURL)
} catch { print(error) }
let dic = UIDocumentInteractionController(url: newURL)
dic.uti = "com.instagram.photo"
dic.presentOpenInMenu(from: self.view.frame, in: self.view, animated: true)
}
}
これを試して :-
私は現在、これによって最後に保存したビデオを共有しています:-
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
let fetchResult = PHAsset.fetchAssets(with: .video, options: fetchOptions)
if let lastAsset = fetchResult.firstObject {
let localIdentifier = lastAsset.localIdentifier
let u = "instagram://library?LocalIdentifier=" + localIdentifier
let url = NSURL(string: u)!
if UIApplication.shared.canOpenURL(url as URL) {
UIApplication.shared.open(URL(string: u)!, options: [:], completionHandler: nil)
} else {
let urlStr = "https://iTunes.Apple.com/in/app/instagram/id389801252?mt=8"
if #available(iOS 10.0, *) {
UIApplication.shared.open(URL(string: urlStr)!, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(URL(string: urlStr)!)
}
}
}
上記の画面にアクセスする唯一の方法は、最初にビデオをライブラリに保存してから、ドキュメント化されていないフックinstagram://library
を使用してアセットlocalIdentifier
を渡すことです。 info.plist
にinstagram
クエリスキームを追加することを忘れないでください。
if UIApplication.shared.canOpenURL("instagram://app") { // has Instagram
let url = URL(string: "instagram://library?LocalIdentifier=" + videoLocalIdentifier)
if UIApplication.shared.canOpenURL(url) {
UIApplication.shared.open(url, options: [:], completionHandler:nil)
}
}
- (void)postMedia:(NSString *)media Type:(BOOL)isVideo {
[SVProgressHUD showWithStatus:LS(@"Downloading...")];
//download the file in a seperate thread.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
NSURL *url = [NSURL URLWithString:media];
NSData *urlData = [NSData dataWithContentsOfURL:url];
if ( urlData ) {
NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:isVideo?@"instagramShare.mp4":@"instagramShare.jpg"];
NSURL *outputFileURL = [NSURL URLWithString:filePath];
dispatch_async(dispatch_get_main_queue(), ^{
if (![urlData writeToFile:filePath atomically:YES]) {
[SVProgressHUD showErrorWithStatus:LS(@"Failed. Please try again.")];
return;
}
// Check authorization status.
[PHPhotoLibrary requestAuthorization:^( PHAuthorizationStatus status ) {
if ( status == PHAuthorizationStatusAuthorized ) {
// Save the movie file to the photo library and cleanup.
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
// In iOS 9 and later, it's possible to move the file into the photo library without duplicating the file data.
// This avoids using double the disk space during save, which can make a difference on devices with limited free disk space.
PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptions alloc] init];
options.shouldMoveFile = YES;
PHAssetCreationRequest *changeRequest = [PHAssetCreationRequest creationRequestForAsset];
if (isVideo)
[changeRequest addResourceWithType:PHAssetResourceTypeVideo fileURL:outputFileURL options:options];
else
[changeRequest addResourceWithType:PHAssetResourceTypePhoto fileURL:outputFileURL options:options];
} completionHandler:^( BOOL success, NSError *error ) {
if ( success ) {
[SVProgressHUD dismiss];
PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]];
PHFetchResult *fetchResult;
if (isVideo)
fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:fetchOptions];
else
fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:fetchOptions];
PHObject *lastAsset = fetchResult.firstObject;
if (lastAsset != nil) {
NSString *localIdentifier = lastAsset.localIdentifier;
NSString *u = [NSString stringWithFormat:@"instagram://library?LocalIdentifier=%@", localIdentifier];
NSURL *url = [NSURL URLWithString:u];
dispatch_async(dispatch_get_main_queue(), ^{
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
} else {
NSString *urlStr = @"https://iTunes.Apple.com/in/app/instagram/id389801252?mt=8";
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlStr] options:@{} completionHandler:nil];
}
});
}
}
else {
[SVProgressHUD showErrorWithStatus:LS(@"Failed. Please try again.")];
}
}];
}
}];
});
}
else {
[SVProgressHUD showErrorWithStatus:LS(@"Failed. Please try again.")];
}
});
}