V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
YSLucida
V2EX  ›  iDev

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

  •  
  •   YSLucida · 2022-07-31 11:38:58 +08:00 · 9597 次点击
    这是一个创建于 831 天前的主题,其中的信息可能已经有所发展或是发生改变。
    本人毫无移动端应用的开发经验,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 不发行,只用于在自己的手机上测试,能不能在不越狱的情况下搞定这个问题?

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