第一步,打开Xcode,选择左侧得 OSX 下的 Application,点击 Commond Line Tool,按下 next 键;
B. XCode是怎么把生成的app发布到ios设备上的
基础:ipa实际上就是一个zip压缩包!
首先,xcode工程其实是可以用命令行来build的,这样就可以用命令行编译出.app的文件,然后就可以打成ipa包。整个流程做到自动化后,就可以方便的做每日的daily build,便于产品和测试同事跟进进度,随时获得最新版本的ipa文件。
xcode工程的命令行Build命令是 xcodebuild,用 --help 可以看到一些有用的参数。常用的是用xcodebuild -configuration Release 指定用Release方式编译。
C. Xcode4.2编译Mac命令行程序时提示Xcode cannot run using the selected destination.
真巧,我昨天也正好遇到了相同的问题
我是这样解决的:
到 build setting 里面把architectures改了,有3种不同的architectures,总有一种可以run,多试一试
build setting 记得老版本在target下,我用的xcode5在project下,你可以去找找
D. iOS 编译报错怎么办
1.编译iPad真机时,选择了 Architetures:Standard(armv6) BaseSDK:iPhoneDevice3.2 TargetDeviceFamily:iPad.
若编译出现如下错误:
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1
则修改 GCC4.2CodeGeneral区域中的ComplieForThumb为非选中.
已经有了开发者证书及私钥后,可直接在越狱的手机上调试.
2. 编译链接时, "_OBJC_CLASS_$_xxx", referenced from:可能需要重新建立某个类的文件.
或者:选择项目名,在detail列表中的target列(显示为一个又圆圈),把这个文件的复选选中,或者再次选中.以把它加入到这个target里面来.
3.在sdk4.0及以上使用RegexKitLite报'captureCount' was not declared in this scope错误,是在非.m文件中使用了它的原因.
4.there is no sdk with the name or path.
从网上down的开源代码,结果运行的时候常出现这样的错,并且在deployment中没有iosdeploymenttarget选项.
尝试 Project/Edit Active Target/ 及 Set Active SDK菜单项,来回切换一下Active Configuration。
5. EXEC_BAD_ACCESS,EXC_BAD_INSTRUCTION错误,意味着这个app有内存管理的问题,一般是因为访问野指针对象造成的。
一个和内存相关的崩溃一般很难定位到源代码,因为这个恶魔可能很早就在程序中做了坏事了。假如一段有问题的代码混乱了内存结构,这样产生的蝴蝶效应可能会在之后很久才表现出来,并且总在不同的地方。所以,若有指针类型出现了不可能的变化,很可能就是因为内存结构被野指针调用混乱了。
修复一些警告后,可能就能预防一些内存错误。警告在左边靠近行号的黄色三角指出一个编译警告,你点击那个黄色的三角形,xcode可能会弹出一个“Fix-it”的建议。
EXC_BAD_ACCESS崩溃不像SIGABRT,将不会得到很明朗的错误消息。然而可以使用一个让人看到曙光的调试工具:Zombies!死亡对象工具。打开这个项目的scheme editor,选择Run 选项,然后选择Diagnosics标签。勾上Enable Zombie Objects选项。当这个zombie工具被启用之后,即使这个对象被释放了,这个对象的内存也不会被清理。所以,那块内存将会被标记为“长生不死的”。假如你试着之后又去使用这块内存,这个app能够意识到你的错误操作,并且app将会抛出“messagesent to daellocated instance”错误并且终止运行。
在工程中加入NSZombieEnabled 环境变量,并设为启用,则在 EXC_BAD_ACCESS 发生时,XCode 的 Console 会打印出问题描述中,设置方法:双击Executables 下的 可执行模组,在弹出窗口中,Variables to be set in the environment,添加 NSZombieEnabled,并设定为 YES,点击选中复选框启用此变量。
可以再加入 MallocStackLogging 来启用malloc记录,以获得更多的提示来帮助定位问题。
在gdb窗口输入 (格式: shell malloc_history <id> <address>) shellmalloc_history1436 0x5f7fcf0, 也可以在终端中去运行 就要去掉以上的shell 指令 如 malloc_history <id> <address>
应该仅当需要调试内存时,才设置上述环境变量。
注意一点:不应该一直启用zombie objects。因为这个工具将永远不会释放内存,只是简单标记一下这个内存是不死的,你最终将会在某个时候耗尽所有的内存,因为所有分配过的内存都不会得到重用。因此应该在排查内存相关的错误的时候才开启zombie objects,其他时候应该关闭它。
在xcode4中,To edit environment variables, go to Menu Proct / Edit Scheme…, select the desired configuration (you probably want 'Run') from the left sidebar first and then click on the Arguments tab. Environment variables are configurable there.
6.运行一个IPhone程序时,弹出窗口说“程序运行失败,预置描述文件已过期” 。 解决办法是,在Xcode中, window-> Orgnazier -> 你的iphone ->删除带有红*的该程序之前的Profile 。 然后从Xcode运行该程序.
7.真机编译时报 Code Sign error: The identity doesn't match any valid certificate/private key pair in the default keychain
修改工程和Targets的get infouild 中的code signing identity为空
8.调试打印
CFShow(coreFoundationThingy) will print out a description of coreFoundationThingy to the console. Output looks something like: {value = w:1186.000000 h:687.000000 type = kAXValueCGSizeType}
If NSLog() is printing something out as an NSCFType, try CFShow().
9. 编译时报 Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang failed with exit code 1,修改C/C++ Compiler Version为gcc4.2
10.this class is not key value coding-compliant for the key viewController
可能在创建了一个基于view的工程,而后把生成的viewcontroller删除了,但是在.xib中还有对它的引用,在IB中直接用delete键删除掉它就行了。
11.这台电脑上已经存在一个名为“embedded.mobileprovision”的预置文件,您是否要替换么?
http://blog.sina.com.cn/s/blog_6907b67f0100o2vw.html
12.真机调试时报failed to upload *.app
http://hi..com/%CB%E6%B7%E7_1989/blog/item/9649f49f805f05aec8eaf466.html
http://www.shouyanwang.org/thread-462-1-1.html
13.记的release时,先置delegate为nil。
一个节点不应该保留任何对不属于它的节点的引用。
14.模拟器
将xcode升级到4.3.1以后发现,ipad的模拟器,没有Home键了。Command+Shift+H就可以实现类似点击Home键的效果了。
E. ios sirikit 可以在oc下集成吗
下载 Xcode 8,配置 iOS 10 和 Swift 3
(可选)通过命令行编译
除非你想使用命令行编译,使用 Swift 3.0 的工具链并不需要对项目做任何改变。如果你想的话,打开 Xcode-beta,然后从顶部菜单栏中选择 Xcode > Preferences,接着选择 Location,在页面的底部,你会看到“Command Line Tool”这行设置,请在这里选择 Xcode 8.0。
现在,在 Terminal 使用命令行找到工程所在的文件夹,调用 xcodebuild 命令就可以编译工程了。
(可选)移植现有的 Swift 2 应用
如果你想对一个已使用 Swift 2.0 开发的工程引入 Siri 功能,需要点击工程,选择 Build Settings,在 Swift Compiler - Version 下面,找到 Use Legacy Swift Language Version 选项,设置成 No。这会造成编译器报错,然后你可以根据这些报错信息来修改代码,推荐你使用这个设置来更新代码,以适应 Swift 不断进化的语义。
开始使用 SiriKit
首先,在你的 App(或者是新建一个单视图的 Swift 模板工程),点击顶部的工程,然后点击左侧下方的 + 按钮,在这里(译者注:我在这里添加了一张图片,能够说的更明白)点击。
弹出的窗口中,选择 iOS > Application Extension,接着选择 Intents Extension。
这样就给工程添加了一个新的 intent,用于监听 Siri 的命令。其中的 Proct Name 应该和你的工程文件名字相似,比如,你的 App 名为 MusicMatcher,你可以把这个 intent 的名字命名为 MusicMatcherSiriIntent。一定要选中 Include UI Extension 选项,我们之后会用到,这也是添加额外扩展的最简单的方法。
我刚刚创建的两个新 target 可以从项目的文件层级上找到。找到 Intent 文件夹下的 IntentHandler.swift 文件,看一下这里面的样本代码。默认会提供一些示例代码,允许用户说一下诸如“用 MusicMatcher 开始锻炼”的命令,MusicMatcher 是 App 的名字。
像这样运行示例应用
这个时候最好编译一下代码,然后在 iOS 真机上试一下命令。继续,编译应用的 target,从 Scheme 下拉菜单里选择 MusicMatcher,然后选择真机,点击 Run。
你看你会看到一个空白的应用出现,你使用的扩展这时会在后台加载到设备的系统文件里,现在点击 Stop 按钮来关闭应用。
接下来,找到你的 scheme,选择 Intent target,点击 Run。
这时会出现一个弹出框,问你需要连接哪个应用,选择你刚刚运行的应用:MusicMatcher。这会让真机上再次出现这个应用(还是一个空白的应用),不过这次调试台(debugger)中会出现连接的 Intent 扩展。
现在点击 home 按钮回到首屏,或者应用可能自己就退出了,因为你正在运行的是 Intent,不是应用本身(这不是崩溃!!!)。
启用扩展
扩展都已安装就位了,但是作为一个 iOS 用户,仍然需要进行 Siri 设置才能使用扩展。点击测试设备里的 Settings,选择 Siri 菜单,你会看到 MusicMatcher 出现在清单里,激活允许使用 Siri。
测试我们第一个 Siri 命令
尝试一下 Siri 命令,长按 Home 键或者说出“Hey Siri”来激活 Siri(当然需要你已经激活“Hey Siri”功能)。
试一下命令,比如“使用 MusicMatcher 开始锻炼”。
“对不起,你需要在应用里继续。”
如果你像我一样遇到了这样的错误信息:“Sorry, you’ll need to continue in the app.”(不知道什么原因,偶尔会出现这么一个问题,什么鬼?)
在控制台中你可能会看到类似的信息:
[objc] view plain
dyld: Library not loaded: @rpath/libswiftCoreLocation.dylib
Referenced from: /private/var/containers/Bundle/Application/CC815FA3-EB04-4322-B2BB-8E3F960681A0/LockScreenWidgets.app/PlugIns/JQIntentWithUI.appex/JQIntentWithUI
Reason: image not found
Program ended with exit code: 1
再次选择工程根目录,选择 MusicMatcher target。在 General 底下找到 Linked Frameworks and Libraries。点击 + 按钮,添加 CoreLocation.framework。现在可以再次编译在真机上运行,接着照着上面相同的步骤再次编译运行 intent target。我们还需要在工程里添加 CoreLocation 库,确保能添加到我们编译过的 Swift 工程中。
最后,从手机桌面激活 Siri。
“Hey Siri!”
“Start my workout using MusicMatcher(使用 MusicMatcher 开始锻炼)”
Siri 这时候应该会回应:“OK. exercise started on MusicMatcher(OK,开始用 MusicMatcher 锻炼身体)”,然后会出现一个 UI 界面写着“Workout Started(锻炼开始)”。
它是如何工作的呢?
模板中的 IntentHandler 类使用了一长串的协议:
首先最主要的就是 INExtension,允许我们一开始就把类当作一个 intent extension 来用。剩下的协议都是 intent handler 类型,在类里能够回调:
[objc] view plain
INStartWorkoutIntentHandling
INPauseWorkoutIntentHandling
INResumeWorkoutIntentHandling
INCancelWorkoutIntentHandling
INEndWorkoutIntentHandling
按住 Command 键点击这些协议的名字,会看到苹果提供的文档:第一个就是我们刚刚测试过的,INStartWorkoutIntentHandling。
[objc] view plain
/*!
@brief Protocol to declare support for handling an INStartWorkoutIntent
@abstract By implementing this protocol, a class can provide logic for resolving, confirming and handling the intent.
@discussion The minimum requirement for an implementing class is that it should be able to handle the intent. The resolution and confirmation methods are optional. The handling method is always called last, after resolving and confirming the intent.
*/
这会根据用户使用语言的不同而不同,不过最终的目的都是开始一次锻炼。INStartWorkoutIntentHandling 协议调用的几个方法都在示例代码里实现了。如果你想创建一个锻炼应用,你可以自行了解其他的内容。不过在这篇教程的剩余部分,我会添加一个新的 intent handler,来处理发送消息。换句话说,这协议告诉 SiriKit 我们准备处理英文句子“Start my workout with AppName Here.”
添加一个新的消息 Intent
确认应用可以完美运行后,让我们继续,添加一个新的 intent 类型,用于发送消息,这里的文档说明了下列信息:
[objc] view plain
Send a message
Handler:INSendMessageIntentHandling protocol
Intent:INSendMessageIntent
Response:INSendMessageIntentResponse
在类里添加 INSendMessageIntentHandling 协议。首先要明确,我们把它添加到类协议清单里,也就是在 IntentHandler.swift 文件里。由于实际上我不想使用这些 intent,所以我会删除它们,只留下这一个:
[objc] view plain
class IntentHandler: INExtension, INSendMessageIntentHandling {
...
另外,如果你需要核对具体是哪些方法,只需要按住 Command 键然后鼠标点击 INSendMessageIntentHandling,然后看一下哪些方法前面没有 optional关键词即可。如果这时候编译,是不会通过编译的,因为我们还需要实现一些遵守 INSendMessageIntentHandling 协议所必需的方法。
F. IOS APP开发常用的几个命令行工具
xcodebuild
苹果官方提供的的Xcode项目和工作空间(workspace)编译工具,也就是xcode自带的非图形化命令行编译工具。详细的使用方法在命令行执行:
man xcodebuild
系统会告诉你所有的用法,这里就不详细介绍了。
xcpretty
xcpretty is a fast and flexible formatter for xcodebuild
其实就是用来格式化(美化)xcodebuild命令行工具输出日志的一个小工具,我们新建一个Single View的项目xcodebuilddemo,然后在命令行执行:
xcodebuild
输出日志如下图所示:
xcodebuild_snapshot.png
四个字“惨不忍睹”。
OK, xcpretty表现一下吧,执行如下命令:
xcodebuild | xcpretty
输出日志如下图所示:
xcpretty_snapshot.png
OK,不用过多解释了,不过执行上面的命令时先执行下面的命令安装xcpretty:
gem install xcpretty
更多使用方法见项目首页:https://github.com/supermarin/xcpretty
xctool
xctool是facebook推出的用于替换xcodebuild的更易于测试ios和mac应用程序的命令行工具,特别适用于ios app的持续集成。
注意,刚开始xctool不仅用于做单元测试,包括编译、打包等功能,但现在编译、打包等功能被放到facebook的另一个项目xcbuild中了,所以xctool目前主要是用于单元测试。
xctool的官方网址:https://github.com/facebook/xctool
安装:
brew install xctool
如果您的mac机器上连brew都没装,那你真落伍了,自己去研究吧。
使用:
xctool -project xcodebuilddemo.xcodeproj -scheme xcodebuilddemo test -test-sdk iphonesimulator9.3
更详细的使用方法自己到官方网站研究吧。可以指定只测试某个用例,某个方法哦。
xcbuild
xcbuild是一个兼容Xcode的编译工具,它能使编译更快快速,更友好的编译过程日志,可以运行在多个平台(主要指OS X和Linux)。
详细的使用方法可见官方网站:https://github.com/facebook/xcbuild
目前该项目还比较新,应该是刚从xctool中剥离出来,只能从源码安装。
自己去试一试吧。
G. 有谁知道ipad上怎么编译c吗
本iOSC/iOSC++适用于iPhone 5S、iPad 4。
经测试,本软件可以编译 复杂命令行程序、运用了各种Framework的IPA程序、cmake、SDL2库、运用了SDL2的程序、同时运用SDL2和UIKit的程序、纯算法程序。
1、请先安装必须软件包,从这个汇总贴子里下载:http://bbs.weiphone.com/read-htm-tid-5259660.html
如果您觉得不放心,这些软件包可以在code.google.com各自的项目里下载
(注:安装方法:)
(先在Cydia中安装Debian Packager)
(然后在终端模拟器或SSH中进入DEB文件夹以root权限运行dpkg -i *)
2、然后请用Mac OS安装Xcode,提取/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/到您的iPhone5s或者iPad4上。
3、在Cydia中安装class mp和classmp-dyld,这个工具可以在你需要Private Framework的头文件时,为你反编译出可用的头文件。(Private Framework本身是不提供头文件的)
4、最后把您需要的可执行文件复制到/usr/bin目录并设置可执行权限。
在iosc文件夹和iosc++文件夹中,各个版本目录下文件说明:
main.cpp ——此版本源代码
a.out,iosc,iosc++ ——此版本二进制可执行文件
config.txt ——此版本最佳配置文件。
注:配置文件一般自动生成。如果
希望iosc/iosc++尽量不提问,可以
把这个config.txt复制
到/var/mobile/.ioscpp/config.txt
5、iosc、iosc++在V1.3之后有一次渺小而重要的更新,运用此更新,用户第一次有把握在iPhone5S、iPad4设备上从复杂源代码搭建实用工具,例如cmake、SDL2。此更新保证开发者在iOS 7上可以编译任何C/C++代码。因此,自V1.3以后的代码暂不开源。
6、利用theos可以从源代码编译iOS IPA程序。貌似不支持Storyboard。
!注意!如果需要安装产生的IPA,需要AppSync补丁,因为没签名……
(编译方法:)
(从原帖子下载整个压缩包,仅提取其中的theos文件夹)
(从本目录安装好iosc/iosc++)
(把本目录中的ipa.nic.zip等nic.zip文件拷贝到theos/templates/iphone/)
(利用Nic建立项目,进入项目文件夹用make编译)
H. xcode命令行编译证书问题,xcode 编译可以成功
今天我也碰到这个问题了.改下这三个地方基本就能搞定.改一个地方就行的有过,改两个地方才行的也有过.根据自己的实际情况去修改.
I. 苹果MAC系统怎么编译C语言
在 Mac OS X 下学习C语言使用 Xcode。
在 Xcode 上运行C语言程序需要先创建工程,再在工程中添加源代码。
1、 打开 Xcode,选择“Create a new Xcode project”创建一个新工程,如下图所示:
左侧是工程目录,主要包含了工程所用到的文件和资源。单击“main.c”,即可进入代码编辑模
式,这里 Xcode 已经为我们创建好了一个“Hello World”小程序。点击上方的“运行”按钮,即
可在右下角的选项卡中看到输出结果。
拓展资料
Xcode是由Apple官方开发的IDE,支持C、C 、 Objective-C、Swift等,可以用来开发 Mac OS X 和 iOS上的应用程序。Xcode最初使用GCC作为 编译器,后来由于GCC的不配合,改用LLVM。
J. xcode 如何编译
Xcode 常用编译选项设置
在xcconfig文件中指定即可。
用标准库连接
LINK_WITH_STANDARD_LIBRARIES = YES如果激活此设置,那么编译器在链接过程中会自动使用通过标准库的链接器。
Info.plist 输出编码
INFOPLIST_OUTPUT_FORMAT = binary指定Info.plist文件的输出编码(默认情况下,输出与输入的编码保持不变),这个输出编码能指定“binary”或者“XML”。
生 成调试符号GCC_GENERATE_DEBUGGING_SYMBOLS = NO当启用的时候,详情等级能够通过build的’Level of Debug Symbols’设置去控制。 隐藏内联方法GCC_INLINES_ARE_PRIVATE_EXTERN = YES Objective-C GCGCC_ENABLE_OBJC_GC = Unsupported 优化级别GCC_OPTIMIZATION_LEVEL = Fastest, Smallest [-OS]
None: 不做优化使用这个设置,编译器的目标是减少编译成本,使调试产生预期的结果。
Fast:优化编译将为大函数占用更多的时间和内存使用这个设置,编译器将尝试减少代码的大小和执行时间,不进行任何优化,需要大量编译时间。
Faster:编译器执行几乎所有支持的优化,它不考虑空间和速度之间的平衡与“Fast”设置相比,该设置会增加编译时间和生成代码的性能。编译器不进行循环展开、内联函数和寄存器变量的重命名。
Fastest:开启“Faster”支持的所有的优化,同时也开启内联函数和寄存器变量的重命名选项
Fastest,smallest:优化代码大小这个设置启用“Faster”所有的优化,一般不增加代码大小,它还执行旨在减小代码大小的进一步优化。
C 语言方言GCC_C_LANGUAGE_STANDARD = C89 警告 检查Switch语句GCC_WARN_CHECK_SWITCH_STATEMENTS = YES 隐藏局部变量GCC_WARN_SHADOW = YES 隐式转换成32位的类型GCC_WARN_64_TO_32_BIT_CONVERSION = YES 未完成的Objective-C协议GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES 抑制所有的警告GCC_WARN_INHIBIT_ALL_WARNINGS = NO 初始化时没有完整的括号GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES例子(a没有完全的括号,b有):
int a[ 2 ][ 2 ] = { 0, 1, 2, 3 };
int b[ 2 ][ 2 ] = { { 0, 1 }, { 2, 3 } };
不匹配的返回类型
GCC_WARN_ABOUT_RETURN_TYPE = YES 缺少括号GCC_WARN_MISSING_PARENTHESES = YES例子:
{
if( a )
if( b )
foo();
else
bar();
}
{
if( a )
{
if( b )
foo();
else
bar();
}
}
在结构体初始化时缺少字段
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES
缺 少函数原型GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES 在文件结尾缺少新行GCC_WARN_ABOUT_MISSING_NEWLINE = YES 选择了多个定义的类型(@Selector)GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = NO 严格的Selector匹配GCC_WARN_STRICT_SELECTOR_MATCH = YES 把缺少函数原型当作错误GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES 把所有的警告当作错误GCC_TREAT_WARNINGS_AS_ERRORS = YES 未定义的SelectorGCC_WARN_UNDECLARED_SELECTOR = YES 未初始化的自动变量GCC_WARN_UNINITIALIZED_AUTOS = YES 未知的Pragma指令GCC_WARN_UNKNOWN_PRAGMAS = YES 未使用的函数GCC_WARN_UNUSED_FUNCTION = YES 未使用的标签GCC_WARN_UNUSED_LABEL = YES 未使用的参数GCC_WARN_UNUSED_PARAMETER = YES 未使用的值GCC_WARN_UNUSED_VALUE = YES当一个语句计算的结果显式的未使用的时候发出警告 未使用的变量GCC_WARN_UNUSED_VARIABLE = YES 警告-所有过时的函数GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES offsetof宏未定义使用的警告GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = YES
iphone 常用的<app>-info.plist设置
Application requires iPhone environment如 果应用程序不能在ipod touch上运行,设置此项为true;
Application uses Wi-Fi如果应用程序需要wi-fi才能工作,应该将此属性设置为true。这么做会提示用户,如果没有打开wi-fi的话,打开wi-fi。为了节省 电力,iphone会在30分钟后自动关闭应用程序中的任何wi-fi。设置这一个属性可以防止这种情况的发生,并且保持连接处于活动状态
Bundle display name这用于设置应用程序的名称,它显示在iphone屏幕的图标下方。应用程序名称限制在10-12个字符,如果超出,iphone将缩写名 称。
Bundle identifier这个为应用程序在iphone developer program portal web站点上设置的唯一标识符。(就是你安装证书的时候,需要把这里对应修改)。
Bundle version这个会设置应用程序版本号,每次部署应用程序的一个新版本时,将会增加这个编号,在app store用的。
Icon already includes gloss and bevel effects默认情况下,应用程序被设置了玻璃效果,把这个设置为true可以阻止这么做。
Icon file(这个不用多说了)设置应用程序图标的。
Main nib file base name应用程序首次启动时载入的xib文件 这个基本用不到。
Initial interface orientation 确定了应用程序以风景模式还是任务模式启动
Localizations多语言。应用程序本地化的一列表,期间用逗号隔开,例如 应用程序支持英语 日语,将会适用 English,Japanese. Status bar is initially hidden 设置是否隐藏状态栏。你懂的。
Status bar style选择三种不同格式种的一种。
URL types应用程序支持的url标识符的一个数组。
用URL Scheme进行程序跳转
打开info.plist,添加一项URL types
展开URL types,再展开Item1,将Item1下的URL identifier修改为URL Scheme
展开URL Scheme,将Item1的内容修改为myapp
其他程序可通过myapp://访问此自定义URL
参考:http://iphonedevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html
IOS后台播放音乐
OS后台播放只是在IOS4.0以后的版本支持。
1,设置后台播放会话
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setActive:YES error:nil];
[session setCategory: error:nil];
2,在info.plist里面添加
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
静态库没法包含category/分类?
如果你导入一个objc静态库,发现很多objc的category 不能调用,可以尝试在主工程中加入linker选项:
-all_load 加入这个一般就够了
-ObjC
让程序最小化再开启时,从头开始:
按下 “Home” 键以后程序可能并没有退出而是转入了后台运行。如果您想让应用直接退出,最简单的方法是:在 info-plist 里面找到 Application does not run in background 一项,勾选即可。
程序退出后任务栏还是有图标,但是程序原来的所有运行状态全部丢失,点击任务栏图标也不过相当于再次启动程序;如果允许后台运行,点击任务栏图标后会恢复程序中断时的界面。
本地化字符串:
在infoPlist.strings里面写
“string1″=”水果”
代码里面写 myLabel.text = NSLocalizedString(@”string1″, nil);
本地化的Bundle display name:
1)创建一个空文件,取名为InfoPlist.strings
2)对InfoPlist.strings进行本地化(Get Info -> Make Localization),然后设置需要的语言(如中文zh)
3)编辑不同的InfoPlist.strings文件,设置显示名字
CFBundleDisplayName = “名字”;
4)(这步不做貌似也可以)编辑Info.plist,添加一个新的属性Application has localized display name, 设置其类型为boolean,并将其value设置为选中状态
default图片的衔接问题:
程序开始后,手动加载default图片,然后进行过渡效果即可。
遍历目录:
NSString *appDocDir = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] relativePath];NSArray *contentOfFolder = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:appDocDir error:NULL];for (NSString *aPath in contentOfFolder) { NSLog(@"apath: %@", aPath); NSString * fullPath = [appDocDir :aPath]; BOOL isDir; if ([[NSFileManager defaultManager] fileExistsAtPath:fullPath isDirectory:&isDir] && !isDir) { [fileList addObject:aPath]; }}
IB:
不论写不写property的retain,由IBOutlet都会为对象加一个retainCount,所以只要连接了,就需要在viewDidUnload与dealloc中release并适当置为nil。
预先在IB里面加载好的文件(比如图片),即使释放了Controller,IB中的文件也不会被释放,直至内存警告,解决办法是较大的资源用代码加载。
UIWebView:
用代码加载UIWebView的内容,navigationType是UIWebViewNavigationTypeOther
CAAnimation:
一定要记得[self.view.layer removeAllAnimations];因为CAAnimation会retain它的delegate
设备型号识别,可通过审核:
+ (NSString*)getDeviceVersion{ size_t size; sysctlbyname("hw.machine", NULL, &size, NULL, 0); char *machine = (char*)malloc(size); sysctlbyname("hw.machine", machine, &size, NULL, 0); NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding]; free(machine); return platform;}
输出:
//@”iPad1,1″
//@”iPad2,1″
//@”i386″
逗号后面数字解释:(i386是指模拟器)
1-WiFi版
2-GSM/WCDMA 3G版
3-CDMA版
AppleTV(2G) (AppleTV2,1)
iPad (iPad1,1)
iPad2,1 (iPad2,1)Wifi版
iPad2,2 (iPad2,2)GSM3G版
iPad2,3 (iPad2,3)CDMA3G版
iPhone (iPhone1,1)
iPhone3G (iPhone1,2)
iPhone3GS (iPhone2,1)
iPhone4 (iPhone3,1)
iPhone4(vz) (iPhone3,3)iPhone4 CDMA版
iPhone4S (iPhone4,1)
iPodTouch(1G) (iPod1,1)
iPodTouch(2G) (iPod2,1)
iPodTouch(3G) (iPod3,1)
iPodTouch(4G) (iPod4,1)
判断ipad/iphone
12UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPadUI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone
或者
1[[[UIDevice currentDevice] model] isEqualToString:@"iPad"];
判断设备是否有摄像头
1[UIImagePickerController isSourceTypeAvailable:];