不用Xcode创建iPhone应用程序

20

可能吗?如果可能的话,我想尝试一下,只为了学习更多。Xcode似乎会自动完成很多工作,我想知道制作iPhone应用程序需要真正做些什么,而不是事先为我完成所有设置。

我意识到这可能要求过高,所以如果你觉得需要笼统地描述,那就随便说说吧。我只想初步了解需要做些什么。

理想情况下,我希望能在模拟器或我的手机上运行应用程序。(否则我怎么能测试和调试呢?)

谢谢!


编辑1

根据我们收到的一些回复,我认为我的意图需要澄清。我的想法是为了更好地了解开发iPhone应用程序时Xcode提供了什么。我不想绕过Xcode,我只是想知道它究竟做了什么。

也许可以从列表开始。类似于:避免使用Xcode,你需要找出如何创建目标,代码签名等。

希望这有所帮助。


1
注释而非答案:Xcode 会为所有东西创建大量的 plist 文件,还有一些我不知道是什么的文件。我会开始调查/学习所有这些东西的用途。从头开始对于这个平台来说真的没有意义,但也有机会。例如,删除所有目标并尝试从头开始制作它们。但要使用 git(或其他工具),因为很多时候你将无法前进 :) - Dan Rosenstark
1
使用xcodebuild来构建怎么样? - Matej
我想要绕过。 - mondaugen
11个回答

17

一切都错了...Xcode只是建立Nib的二进制属性列表并允许您将它们作为对象调用...使用GCC单独也可以做到这一点...

  1. 创建一个 main.m、RootControlViewer.h、RootControlViewer.m 和 AppNameApplication.h 文件。
  2. 委托...
  3. 创建一个 makefile 文件...
  4. 包括必要的编译器标志,框架和所需包含文件的目的地...
  5. 然后在命令行中输入 "make" 命令,应用程序就会生成...

  6. 将它们放在 payload 文件夹中...

  7. 压缩并将 zip 重命名为 IPA...
  8. 然后使用签名命令对包进行签名...

我一直在为Windows、Mac和Linux开发 Xcode 克隆版... :-) 所有控件都是纯代码生成的(没有 Nibs),我已经完成了界面构建器,可以创建可安装的工作应用程序...目前正在编写一个“解释器”,以便语法更类似于“BASIC”,当您按下构建按钮时,所有代码都将转换为 obj-c... 使用 GCC 构建... 并准备部署 :-)


8
你有计划发布这个小宝石吗? :) - Eric Brotto
4
你的项目听起来很有趣。你已经发布了吗? - Simon
这个有什么最新进展吗? - Neil

4

没有Xcode的生活的局限性

这实际上取决于你想要承受多少痛苦和做出多少妥协。基本上,如果没有Mac和Xcode,就无法进行AppStore的iOS开发。

没有Xcode的一些问题和例子

  • 代码签名codesign
  • AppStore上传
  • UIKit
  • 工具链clang

这并不是说问题不能在某种程度上被克服,但它开始将您推向越狱的世界,而不是AppStore。因此,如果您仍然想为设备、模拟器和AppStore适当地开发,那么在没有Xcode项目的情况下,您可以做很多事情。

调试器和IDE的选择

您可以使用viAppCode。任何文本编辑器都可以。您仍然需要在计算机上安装Xcode,以便具有编译器工具链和必要的库。真的无法避免这一点。然后,您可以在命令行中使用lldb进行调试。通过ios-deploy来安装和管理应用程序。

一种排序的Hello World - 未命名.app

Github项目

我将为iPhone模拟器构建一个(极其)基本的应用程序。应用程序的基本习惯用语是具有.app扩展名的文件夹,其中包含针对目标编译的Info.plist和二进制文件。 Info.plist包含显示名称、捆绑标识符和二进制名称。

Makefile

构建应用程序可能是最困难的部分。Makefile是不必要的,但它有助于保持您的理智。

default: main

.PHONY: clean

clean:
    rm main

SYSROOT:=$(shell xcrun --sdk iphonesimulator --show-sdk-path)
main: main.m
    clang -isysroot $(SYSROOT) -framework Foundation -framework UIKit -lobjc -o Untitled.app/$@ $<

Untitled.app文件夹和Info.plist

创建一个名为Untitled.app的文件夹,并添加一个Info.plist文件。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>en</string>
    <key>CFBundleDisplayName</key>
    <string>Untitled</string>
    <key>CFBundleExecutable</key>
    <string>main</string>
    <key>CFBundleIdentifier</key>
    <string>com.cameronpalmer.Untitled</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>Untitled</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0.0</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>1</string>
    <key>LSRequiresIPhoneOS</key>
    <true/>
    <key>UISupportedInterfaceOrientations</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
        <string>UIInterfaceOrientationPortraitUpsideDown</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
</dict>
</plist>

main.m

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(id)options {
    NSLog(@"%s", __PRETTY_FUNCTION__);
    CGRect mainScreenBounds = [[UIScreen mainScreen] bounds];
    self.window = [[UIWindow alloc] initWithFrame:mainScreenBounds];
    UIViewController *viewController = [[UIViewController alloc] init];
    viewController.view.backgroundColor = [UIColor whiteColor];
    viewController.view.frame = mainScreenBounds;
    self.window.rootViewController = viewController;

    [self.window makeKeyAndVisible];

    return YES;
}

@end

int main(int argc, char *argv[]) {
    NSLog(@"%s", __PRETTY_FUNCTION__);
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

在模拟器上构建和安装


# Build
make
# Boot
xcrun simctl boot <UUID_OF_DESIRED_SIMULATOR>
# Install
xcrun simctl install <UUID_OF_BOOTED_SIMULATOR> ./Untitled.app
# Open Simulator app
XCODE_PATH=$( xcode-select --print-path )
open "${XCODE_PATH}/Applications/Simulator.app"

现在只需启动应用程序,您将在模拟器中获得一个白色框。

2

请看这个

我自己没有使用过,但它看起来能做与Xcode相同的事情。


它需要Mac系统。但除此之外,它非常棒 :-) - MadBoy
是的,它确实可以(他没有提到想在其他平台上运行它)。而且看起来它使用了 iOS SDK 自身的 iOS 模拟器应用程序。 - Vin
IntelliJ 不需要 Mac。 - ihodonald

2
如果您越狱您的iOS设备,可以从Cydia安装gcc工具链,并直接在设备上开发和编译应用程序。您将无法将这些应用程序放在应用商店中,但这是学习苹果API的好方法。
如果您有兴趣,请评论,我将扩展此帖子并提供操作说明和一个小例子。

这听起来很有趣。虽然我不想越狱我的设备。但是,使用Cydia,我能在模拟器上运行应用程序吗? - Eric Brotto
你是指是否仍然可以运行使用Xcode开发的其他应用程序,还是想在模拟器上运行使用我上面提到的GCC工具链开发的应用程序?前者是可能的,而后者则不行。 - aerique

1

在iPhone上,您基本上可以创建两种应用程序:a)Web应用程序b)本地应用程序

a)Web应用程序可以仅使用Javascript创建,然后保存到iOS设备的主屏幕上。单击它们时,它们在浏览器中运行。

b)本地应用程序也有两种类型。

  1. 完全本地:完全使用Xcode制作。可以具有模板、插件、调用其他应用程序等。

  2. 从Web应用程序/SAP应用程序等开始,然后可以制作成本地应用程序。在此类别中,您有Sencha Touch、JQuery Mobile等。这些应用程序在手机上本地运行,通常在Xcode中使用phonegap或类似的插件,并可放置在AppStore上。

您可以按照此教程从头开始创建简单的XCode应用程序。 http://techtalktone.wordpress.com/2011/11/26/hello-world/

如果你想要不需要创建ADC账户或注册开发者,却仍然能够创建出惊艳的应用程序,那么可以尝试一下这个教程: http://techtalktone.wordpress.com/2011/12/05/testing-your-ios-apps-on-a-jailbroken-device-2/ 希望对你有所帮助 :)

0

没有使用Xcode是不可能开发本地iOS应用的。苹果不会允许这样做,你甚至需要苹果的操作系统来开发本地应用!

然而,使用框架和平台(如Phonegap)可以创建移动应用程序。使用它们,您可以使用HTML、CSS和Javascript创建移动应用程序,而不是使用本地的Objective C。如果您使用这些框架,您可以使用自己选择的软件。

编辑:

如果您愿意支付费用,甚至可以使用MonoTouch。我已经使用Mono开发了一个测试应用程序,并对其功能印象深刻。


我认为他想要从零开始构建一个应用程序,而不依赖于xcode在.xib文件、调试等方面的所有繁重工作。我以前在Palm OS开发中做过这个,但是iPhone上的复杂程度要大得多,这将需要很多工作,而收益却很少。 - Anya Shenanigans
@Petesh 我会说“暴露的复杂程度”。iOS真的比其他平台更复杂吗? - Dan Rosenstark
@Yar 从零开始做这项工作比我在评论中所能详细阐述的要复杂得多。当为模拟器和手机构建时,您需要为不同平台编译,您需要签署代码以供设备使用。我不知道如何从命令行运行调试器以连接到设备/模拟器(远程gdb?)。我不知道如何从xcode外部将应用程序传输到设备/模拟器。没有使用Interface Builder设计UI? - Anya Shenanigans
1
@Petesh,本质上你是对的。平台的构建方式,像AppCode这样的其他玩家实际上大多数情况下都依赖于Xcode,比如目标(但不包括方案)。 - Dan Rosenstark
使用MonoTouch/Xamarin,你仍然需要Xcode来构建iOS应用。 - David Glass

0

如果你选择使用其他语言编写代码,那么这是可能的,而不仅限于Objective-C。

你可以使用一些跨平台的SDK来开发应用程序,例如

CoronaUnity 或上面帖子中列出的PhoneGap。


至少使用PhoneGap,您仍需要Xcode来编译iOS。 - Seva Alekseyev
你可以选择在服务提供商的服务器上进行构建。 - Xuvi

0
你可以使用一个叫做theos的工具来创建可以在越狱设备上运行的应用程序。它允许你创建本地应用程序,可以在设备上运行(不使用HTML或其他任何东西)。你也不需要有代码签名身份来在你的设备上运行这些应用程序。 这里是一个关于如何安装的链接,不幸的是几乎没有文档说明。

-1

不是这样的。模拟Xcode所做的事情将涉及逆向工程大量苹果技术,并且无疑会招致苹果的愤怒,可能会引起法律诉讼。


Xamarin MonoTouch似乎做得非常好,允许使用c#/.Net进行编码。它不会是Objective-C编码,但可以使用这种技术生成iPhone的工作应用程序。 - MadBoy

-1

你可能想尝试Xamarin MonoTouch,声称允许用C#/.NET创建本机iOS应用程序。虽然它不完全相同,但它为您提供了在C#中创建iOS本机应用程序的选项(或者他们声称如此)。

我还没有测试过它,但人们似乎认为它有效(我看到了几篇关于它的文章)。

与正常方式下的XCode开发相比有多好呢?它是否会在某一天反弹回来?我不知道。但它似乎是一个不错的项目。


如果我正确阅读这个页面 (https://developer.xamarin.com/guides/ios/getting_started/installation/mac/) 的话,似乎 Xamarin 是一个库,但需要 Xcode 来编译原生 iOS 应用程序。 - Alexander Bird

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接