当前位置:   article > 正文

xcode学习笔记_addtoembeddedbinaries

addtoembeddedbinaries

ins分享:

遇到很神奇的问题,游戏是横屏,用documentController处理分享,会出现 帖子没有键盘,快拍布局错误,按钮点不动的情况。
于是尝试使用 外链命令的方法,发现没有直接的图片上传命令可以用。
外链拉起后,默认选取相册第一张照片。 所以有了下面的尝试。

尝试了UIKit的方法

//UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), DocumentsPath);
  • 1

发现保存成功,但是相册看不见。

尝试了异步

//                PHPhotoLibrary *library = [PHPhotoLibrary sharedPhotoLibrary];
//                [library performChanges:^
//                {
//                    [PHAssetChangeRequest creationRequestForAssetFromImageAtFileURL:url];
//                }
//                completionHandler:^(BOOL success, NSError * _Nullable error) {
//                    if (success)
//                    {
//
//                        NSLog(@"保存成功");
//                    }
//                    else
//                    {
//                        NSLog(@"保存失败");
//                    }
//                }];
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

发现了问题, 第一次调用会卡住一会儿,看log发现openURL警告,没有在主线程调用。
所以使用了同步的方法。

   NSURL *instagramURL = [NSURL URLWithString:@"instagram://app"];
    if([[UIApplication sharedApplication] canOpenURL:instagramURL]) //check for App is install or not
    {
        NSLog(@"------ %s", imgUrl);
        
        NSString* strImgUrl = [NSString stringWithUTF8String:imgUrl];
        NSString * docPath = @"Documents";
        NSString * finalPath = [docPath stringByAppendingPathComponent:strImgUrl];
        NSString * DocumentsPath = [NSHomeDirectory() stringByAppendingPathComponent: finalPath];
        
        NSLog(@"------ %@", DocumentsPath);
        
        NSURL* url = [NSURL URLWithString:DocumentsPath];
        NSError *error = nil;
          [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
                [PHAssetChangeRequest creationRequestForAssetFromImageAtFileURL:url];
            } error:&error];
        
        if(error == nil)
        {
            NSString *str = [NSString stringWithFormat:@"instagram://library?AssetPath=%@", DocumentsPath];
            NSURL *instagramURL = [NSURL URLWithString:str];
            [[UIApplication sharedApplication] openURL:instagramURL];
            
            NSLog(@"保存成功");
        }
        else
        {
            NSLog(@"保存失败");
        }
    }
    else
    {
        NSLog(@"Instagram not found");
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

xcode静态链接 和 动态连接
测试没问题,上传testflight报错 ITMS-90205 或 ITMS-90206, 说 UnityFramework包含framework

这个是因为 静态包动态包 设置的不对。
新版的unity打包Xcode后会有 UnityFramework的子工程。
如果动态包放在这个子工程下,并且选择 Embed&Sign, 那么动态包最后输出.app的时候,就会出现 UnityFramework包含framework,下面是所有勾选 Embed&Sign的Framework。
然而 UnityFramework 本身也是动态包, 所以会出现 动态包 包含 动态包,这是不被允许的。

解决办法是 在unity里,选中.framework, 右侧面板,勾选“Add to Embedded Binaries”, 这样在输出Xcode的时候, 这些Unity里勾选的动态包和UnityFramework是在主工程下平级。
于是乎,上传成功
(出现这个问题,很大的原因,是第三方ios的SDK是手动裸接的。没用unity的一些后处理插件。问题不大,如此解决。)


Xcode Object-c 调用unity函数
UnitySendMessage( [字符串1 UTF8String], [字符串2 UTF8String], [字符串3 UTF8String]);
字符串都是 NSString* 类型

这个函数的定义是
void UnitySendMessage(const char* obj, const char* method, const char* msg);

第一个参数是 Unity里GameObject的名字
第二个参数是 函数名字
第三个参数是 参数

所以必须先有一个 MonoBehaviour的脚本挂在一个GameObject上,参数在定义上只给了一个,所以如果是多参,那么就自己组装一串带自定义分隔符的字符串,进到unity后,string.split就好了


unity调用Xcode object-c函数
using System.Runtime.InteropServices;

[DllImport("__Internal")] private static extern void 函数名(参数);
  • 1

调用Xcode OC函数,返回string给unity

- (char*)GetDocumentPath
{
    NSString * docPath = @"Documents";
    NSString * strDocumentsPath = [NSHomeDirectory() stringByAppendingPathComponent: docPath];   // 组装本地Url
    const char* cDocumentsPath = [strDocumentsPath UTF8String];
    
    char* result = (char*)malloc(strlen(cDocumentsPath) + 1);
    strcpy(result, cDocumentsPath);
    return result;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

extern "C" char* iosGetDocumentPath()
{
    return [对象 GetDocumentPath];
}
  • 1
  • 2
  • 3
  • 4
  • 5

返回出去的是char* 对应 unity里的string。 return前需要给返回值char*开内存,不然会报错。


程序学无止尽。
欢迎大家沟通,有啥不明确的,或者不对的,也可以和我私聊
我的QQ 334524067 神一般的狄狄

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/875649
推荐阅读
相关标签
  

闽ICP备14008679号