最近可能要涉及到一些 iOS 开发,想请教各位老司机一些基本的 iOS 开发问题。

2022-07-31 11:38:58 +08:00
 YSLucida
本人毫无移动端应用的开发经验,android iOS 都没有。平时主要是桌面端开发。由于现在需要快速支持 iOS SDK 专属的一些特性,原有的代码是 C++。也就是想通过 C++来包装 iOS SDK 的一些接口。这个 SDK 有 objective-c 和 swift 两种接口,我大概看了一下 objective-c 和 c++是比较好交互的。
第一个问题:想问一下 c++和 swift 在跨语言调用上有没有最佳实践方案?或者说我这种需求是不是直接用 objective-c 来做?
下面两个问题的前提都是想在前期免去学习 objc 和 swift 语言以及相应 SDK 的成本,只是想先把核心跑起来,在能跑起来的前提下再学 SDK 也不迟。
第二个问题:由于想先快速实现一个原型 app 用于测试,一个 iOS 应用能不能用纯 C++写?其实这个测试应用不需要多么复杂的功能,只需要能运行最终调用一下 SDK 的一些 api 就行了,哪怕交互的部分不上 UI 先硬编码也行。就像 windows 下的控制台应用一样。
第三个问题:由于集成这个功能需要访问文件系统,也就是需要像在桌面端打开某个路径下某个文件。大概了解了一下,iOS 也是 POSIX 兼容,目前打算如果先用 C++实现的话,可以调 posix 兼容的 fopen 等来暂时应对,不过据了解好像由于 iOS 的 app 是运行在沙箱环境里的,实际运行的时候 fopen 是打不开的。所以有没有办法暂时回避这个问题?这个 app 不发行,只用于在自己的手机上测试,能不能在不越狱的情况下搞定这个问题?

由于本人在这方面的经验为零,所以有些问题可能不专业,有问题的地方请指正。
9640 次点击
所在节点    iDev
18 条回复
zhangleshiye
2022-07-31 11:51:27 +08:00
我觉得 sdk 可以沿用 c++, 界面就别想了,老老实实用原生的吧,打开文件需要应用向系统授权,这个肯定要用 oc 或者 swift 来处理的
finab
2022-07-31 11:51:40 +08:00
1. swift 没调过 c++ 不太清楚,但 swift 可以无障碍调用 objc ,objc 写好后给 swift 调用也行
2. iOS 新建 APP 项目,就包含一个默认的可运行 APP ,之后你不用写界面,直接可以测试 SDK 了
3. 我没用过 fopen ,但沙河环境是只能打开沙河路径下的文件,不是不能打开文件。只要是沙盒目录下应该是可以打开的,你可以找一下怎么获取沙盒目录路径,然后测试一下。
YSLucida
2022-07-31 12:00:03 +08:00
@zhangleshiye 谢谢回答
YSLucida
2022-07-31 12:00:25 +08:00
@finab 谢谢,省去了查很多资料的时间。
agagega
2022-07-31 12:11:55 +08:00
Swift 和 C++的 interop 社区有实验选项,但还不成熟,所以还是用 Obj-C 或者用 C 封一层吧( Swift 和 C 是可以 interop 的)
Building
2022-07-31 12:15:09 +08:00
不知道你要支持的 iOS SDK 专属的一些特性是指什么? Foundation, ARKit, UIKit 还是 SwiftUI 或者其他框架?
大体分为两种:有 UI 和没有 UI
没有 UI 直接新建 Command Line 就可以跑,随便玩,可以封装成框架,C, C++, OC, Swift 完全可以互相调用
但是要跑在 iPhone/iPad 上必须包含 UI 框架,这个时候,沙盒系统和开发环境就很不一样,需要判断设备环境分别处理,但是沙盒机制决定了 App 只能在自己的一亩三分地里面玩,要想访问其他文件是不可能的
Innovatino
2022-07-31 13:54:12 +08:00
1.初学者建议通过 OC 封装一层 C++的调用。因为 Swift 和 OC 是基本无缝的,OC 和 C++是无缝的,但是 Swift 和 C++是鸿沟
2.不能用纯 C++写,趁早放弃这个想法。如果只是验证 SDK ,那 1 天的简单学习就可以让你搭建一个原生 iOS App 的 SDK 调试环境
3.不能搞定这个问题,在 iOS 里安全是第一位的,没有什么办法打开沙盒外的路径。
YSLucida
2022-07-31 14:41:56 +08:00
@agagega 那就可以,当然这里指的 c++其实指的就是 c 。而且一般默认说 c++和 其他语言互通一般指的就是 c 接口吧。
YSLucida
2022-07-31 14:45:45 +08:00
当然最终是要搞 UI 的,第一步就只是访问一下震动设备,让手机震动就行。
YSLucida
2022-07-31 14:46:53 +08:00
@Innovatino 其实我指的纯 c++就是想暂时用 c++( POSIX 那部分)读取文件,入口和框架这些不用 c++也没关系的。
Innovatino
2022-07-31 15:03:01 +08:00
@YSLucida 那可以,我个人感觉没啥问题
okakuyang
2022-07-31 16:08:03 +08:00
1.swift 应该不能直接调用 c++,我记得是 swift->oc->c->c++ 这么个过程。
2.App 基础必须用 swift 或者 oc ,代码不是很多。
3.可以用 fopen ,但是你访问的文件必须是在沙盒中的,会有借口返回沙盒路径给你。类似于
char output[256];
strcpy(output,getenv("HOME"));
strcat(output,"/Documents/");
icyalala
2022-07-31 16:53:39 +08:00
Swift 和 C++ 的交互目前没有成熟的方案,先不要考虑了。
OC 和 C++ 混编,只要把 OC 的 .m 文件改成 .mm 就可以嘞。简单调试的话,新建工程直接在 main 里面改就行。
文件访问的话,只要你访问的是沙箱路径下的内容,那些 POSIX 的 open fopen 之类的函数都正常用,Swift/OC 底层实际也是依赖这些函数的。
xtinput
2022-07-31 18:50:51 +08:00
swift 可以直接调用 C/C++的函数方法,桥接文件里面导入头文件就 OK
https://glumes.com/post/ios/swift-call-c-function/
xtinput
2022-07-31 18:52:16 +08:00
不对,C++的需要 OC 封装一层
YSLucida
2022-07-31 21:38:59 +08:00
谢谢大家的回答,能解决我大部分的疑惑。
yechentide
2022-07-31 22:25:15 +08:00
如果想打开沙盒外的文件,必须使用下面两个之一,来让用户选择文件。
uidocumentbrowserviewcontroller: 只能选择单个文件
uidocumentpickerviewcontroller: 可以选择文件夹
从用户那边获得访问权限后,你可以选择复制到自己 app 的沙盒里,或者直接编辑。
直接编辑沙盒外的文件,必须使用 Security-scoped URL 。
Security-scoped URL 可以保存为 bookmark ,这样下次启动 app 就不需要用户再次选择了
yechentide
2022-07-31 22:28:14 +08:00
UIDocumentBrowserViewController
UIDocumentPickerViewController

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/869746

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX