iOS开发者无需越狱安装破解App

其实这个方法或者说这个软件应该不少人都知道了的,以前叫做“iReSign”,不过后来改叫“iModSign”,不过最近发现imzdl这个网站一直无法正常使用所以如果想要用最新的自己去网上找吧。最新版的好像是4.0.1。实在是找不到下载的时候咱再放出下载。鉴于IMDL整个网站已经卖出,现提供最后的一个版本下载[iModSign-4.0.1]。

不过这个方法仅针对于iOS的付费开发者,也就是说你必须有Apple的iOS开发证书才能对ipa进行重签名,然后才能安装到自己的设备里(而且设备必须是登记在开发者名下的)。

这个是旧版的iReSign:
屏幕快照 2013-12-29 21.26.05
新版的iModSign:
屏幕快照 2013-12-29 21.29.27

使用方法也是很简单,iModSign的话:
1.在“Settings”的“Certificate Chooser”里选好开发证书,比如“iPhone Developer: Firstname Lastname (XXXXXXXXXX)”。
2.拖入ipa文件。
3.点击“Start Job”
然后应该会开始重签名ipa文件,完成之后应该会弹出已经重签名的ipa的位置。

iResign的话:
1.选好ipa文件。
2.从“钥匙串访问”里找到你的开发证书,比如“iPhone Developer: Firstname Lastname (XXXXXXXXXX)”,把完整的名称填到最后一个输入框。
3.点击“ReSign”
重签名完成之后同样应该会弹出文件所在位置(应该是源ipa文件旁)。

有了重签名的ipa文件,就可以通过iTunes或者iPhone配置实用工具甚至Apple Configurator来将app安装到自己的设备上。

这个方法可以重签名所有ipa文件,但是有效的仅有非加密的ipa,也就是:
1.开发者自行导出的ipa文件。
2.网上下载的已经破解了的ipa文件。
不适用的情况:
其他账号购买的ipa,未进行破解。(安装后仍然会弹出提示框需要输入AppleID进行验证)。

Xcode上制作系统偏好设置面板项目(Preference Panes)

翻了半天网上没有很多关于这方面的,虽然Apple开发文档里写有。
嘛咱也不是说要翻译这个文档,而是简单介绍一下。
使用prefPane就和iOS的Settings里面的那些第三方程序设置一样,只不过Mac是直接安装到系统偏好设置面板里。而主要的功能就是作为外部设置来设置app,好处就是能变相绕过Sandbox来开启程序内部的一些不被允许的功能,当然同时app因为本身没开启这些功能可以通过Apple的审核上架到MacAppStore。

首先来了解下prefPane的原理,其实prefPane就是一个bundle,和app差不多,同样需要h和m文件,也有info.plist,也需要icon,而UI的话只有一个nib(当然可以做得多个然后之前切换什么的,那些就比较高级了)。而prefPane根据需要可以分成独立的prefPane来执行功能,也可以通过修改目标程序的设置plist文件达到设置app的功能,也可以直接使用NotificationCenter来通知程序:设置已经更改了!快做出反应!
这次主要介绍修改目标程序的偏好设置plist文件,优点是非常简单,缺点就是设置并不能马上生效,必须重新加载读取UserDefault或者重新运行程序。

继续阅读“Xcode上制作系统偏好设置面板项目(Preference Panes)”

Unity 3D + Vuforia制作AR人物互动

话说之前说过了咱与本地漫展商合作推出AR app,虽然他们之前也已经做过了但是只有Android版,后来因为某些问题于是准备是让咱来接手后续的开发。(其实本来只是打算说iOS可以咱来做…而已…
不过在还没开始谈的时候就已经通过某种渠道获得了人物模型和动画,花了差不多4天时间从零开始完成了AR识别到人物展示以及人物动作这几个过程,而经过一段时间的“放假”之后最近则是直接完成了人物的交互。可以说目前以及可以达到上架的地步了。
嘛其实整个流程做完之后回头看其实还是很简单的,于是打算做本教程,当然因为没征得同意所以人物模型什么的是没办法放出的,源代码也是。但是看完整个流程下来不需要源码也行啦~

OK废话不多说赶紧开始吧~ 继续阅读“Unity 3D + Vuforia制作AR人物互动”

iOS 7上进行Per App VPN设置(未能实验成功)

iOS7的新特性:支持Per-App-VPN,但是几个测试版下来都没发现有相关的设置。不过最后在开发文档里找到了相关的说明,但是这个其实是作为配置文件的API,并不能直接在设备上进行设置。而且操作极其繁琐,如果各位不愿意花时间去折腾的话可以等正式版iOS7放出后相关工具更新了再去设置。

再次说明一下本方法及其繁琐而且目前处于测试阶段没办法保证100%成功。另外本文仅作为技术研究,不提供任何代理服务。如需翻墙,请出门左转购买VPS不用谢。

目前是不明原因iOS7无法安装配置文件,应该是文件内容有错误。还需慢慢进行实验调整,不过思路应该是对的。

Per-App-VPN的官方说法:
屏幕快照 2013-09-12 23.22.15

Per-App-VPN有两种模式:
1.任何App包括Safari访问特定网址触发就打开VPN(也可以设置成手动提前打开)。
2.针对单个App进行代理,即App运行后自动开启VPN。
两个模式基本都差不多,就是设置的内容有些区别。其实你也可以把它理解为是一种路由表。

建议系统为Mac,需要工具:
1.Xcode任意版本(或者单独去找plist编辑器也可以)。
2.iPhone配置实用工具(Mac版本下载地址,目前版本3.5(289))。
3.iOS7设备一台。
4.可用VPN一个。
5.终端命令行。

制作方法: 继续阅读“iOS 7上进行Per App VPN设置(未能实验成功)”

萌电波可以说话了

虽然很早就想制作这个功能了,之前都在想有没有cooca现成的方法,发现都是只有针对文本的…没有后台的语音。
然后昨天突然想到…既然iOS和Mac程序都可以通过调用system()参数来执行命令行命令,然后命令行又能直接使用say这个调用系统语音….不就能让程序说话了么!∑(゚Д゚)咱果然是Genius!(拖走

初版只用十几分钟就完成了,能够读出各种操作以及歌曲名+演唱着名称。
不过之后花了不少时间(至少超过2小时)来优化…要知道原本可是同步操作,也就是系统在朗读的时候程序根本就无法操作,当遇到歌曲名或者演唱者名称特别长的…那会是非常痛苦的等待啊233
于是解决方法….这还是咱第一次使用NSTherd…简单说就是新开一个线程然后丢语音到另外一个线程去..
最后得到的效果…和iPod Shuffle内置的VoiceOver类似,不过感觉有点像是一般的音乐电台呢~

话说现在可以下载体验了:地址

默认这个功能是关闭的,需要在调教面板里打开:
屏幕快照 2013-06-26 14.38.50

当然光开启这个还是不行的,毕竟Mac系统默认的是英文/中文的嗓音,这样是没办法正常读日文的歌曲名的。需要手动去调整为日文的系统嗓音:
打开系统偏好设置面板,找到“听写与语音”,然后在“文本至语音”下有个“系统嗓音”,点开之后有个“自定…”可选:
屏幕快照 2013-06-26 16.03.41
之后找到日文的,勾上之后点“好”,后台会自动下载安装。装好之后就能正常读日文了:
屏幕快照 2013-06-26 16.03.54
咱现在用的是10.9 beta2,所以日文多个男声的Otoya可选,10.8以及以下的应该只有女声的Kyoko可选,个人觉得Otoya声音更大一些…Kyoko的声音太容易被淹没了(囧rz
朗读速率的话建议设置稍快一些…这样不至于等读完等太久…

话说咱玩这个玩上瘾了连歌曲都懒得听了光想听它读歌曲名称了_(:з」∠)_

整页面可变高度UIScrollView和可变高度UITableViewCell的方法

经常做程序会有需要一页显示不完的东西要滚动,而且又正好碰上比如里面的UITextView里文字字数不确定而如果字太多要做滚动的方式,虽然UITextView自带了UIScrollView但是还是觉得不如一整页滚动的效果好?
于是解决方法就是使用单独的UIScrollView,这货在程序中应该算是最不智能的东西吧?而且又正好碰上一些高度不确定的东西比如刚才说的UITextView里的文字,似乎不能不用代码来解决了。
但是作为非老开发者来说,非常不希望完全使用代码来写界面,那么应该如何配合StoryBoard或者nib文件来制作UIScrollView呢?
解决方法的思路是这样的,首先要根据文本来确定UITextView的高度,然后再加上界面上其他东西的高度(应该说是总高度),来绘制ScrollView。
可参考这个
于是第一步:确定UITextView的高度,而这需要根据文本来运算,既然文本长度不确定,自然要从文本上下功夫了:

NSString *text = self.textview.text;
CGSize stringSize = [text sizeWithFont:[UIFont boldSystemFontOfSize:14] constrainedToSize:CGSizeMake(320, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];

代码分解第一步获取到textview里的文本,然后根据文本来确定文本的大小(宽度和高度),其中需要根据你自己实际情况修改的:
1.boldSystemFontOfSize是textview里文本的字体大小。
2.CGSizeMake里的320这个要根据textview的宽度来修改,比如在这里宽度占完整个屏幕就是320(不是640哦,iOS后台会自动算Retina的)。
得到的stringSize就是实际文本的大小(包括宽度和高度,而下面我我们直接只用高度所以实际用的时候就直接:stringSize.height),接下来要把UITextView设置成这个尺寸,这样可以显示完全部的字:

[self.textview setFrame:CGRectMake(78, 0, 320, stringSize.height + 100)];

我为什么在后面会有个+ 100呢?因为实际调试的时候发现如果直接设置高度为stringSize.height会出现最下面两行被挡住了。总之这个数字可以根据自己实际情况进行调整。
而前面的78和0这两个对应的是textview所在界面的x,y值,这个可以直接在Storyboard或者nib里textview的size inspector里的View里看到,直接照用就行了。

高深人士应该能看得出其实这里已经是手动来绘制textview了,其实本来咱是想用setContentSize单独设定高度的,但是似乎没用…

设置完了UITextView之后来设置UIScrollView:

[self.scrollview setContentSize:CGSizeMake(320, stringSize.height + 200)];

这次后面+200是因为要包含界面上其他的东西。

于是这样应该就能达到效果了,如果有误差的话稍微调整以上提到的几个数值,应该能达到你想要的效果了。

另外还有一种解决方案就是使用静态的UITableView,因为其内置已经做好UIScrollView了,只要根据UITextView来决定cell的高度就可以了。
不过可变高度的cell又是如何做到的呢?上面已经知道了如何根据文本来确定高度,那么直接将高度应用在cell里不就好了~
于是:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSUInteger row = [indexPath row];
NSArray *array = arraylist[row];
NSString *text = [array valueForKey:@"message"];
CGSize stringSize = [text sizeWithFont:[UIFont boldSystemFontOfSize:12] constrainedToSize:CGSizeMake(292, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];
return stringSize.height +50;
}

咱根据当前cell直接从array中直接读message,接下来的就和上面一样进行文本的长度确定,而到了最后则是返回stringSize.height,外加上自行调整的误差。

而至于当文本字体大小改变或者界面尺寸改变的时候,重新修改上面代码的对应变量即可(比如横屏等),重新运算过后就可以了。

最后附赠一个多点触控捏合缩小放大字体的代码(代码效果不是很好…参考):

- (void)viewDidLoad{
UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)];
[self.textview addGestureRecognizer:pinchGesture];
}


- (IBAction)handlePinchGesture:(UIGestureRecognizer *)sender {
static int fontSize = 20;
if (sender.state == UIGestureRecognizerStateBegan)
{
// initialBounds = _view.bounds;
}
CGFloat factor = [(UIPinchGestureRecognizer *)sender scale];
if(factor > 1.0)
{
fontSize += 1;
}
else
{
fontSize -= 1;
}
if (fontSize >50) {
fontSize =50; return;
}
if (fontSize <5) { fontSize = 5; return; } [self.textview setFont:[UIFont fontWithName:@"Helvetica" size:fontSize]]; return; }

[Obj-c]匹配字段&NSArray里的Null问题&消除HTML转义字符

首先是监测字段匹配,假设要监测字符串string里是否含”a”这个字符:

if ([string rangeOfString:@"a"].location != NSNotFound) {
//do something
}

当NSArray为空或者里面某项为null的时候,在TableView或者其他什么界面经常会出现崩溃的问题。
解决方法:检测是否为空。但是普通的if (array != nil)是没用的,得这样操作:

if (array != [NSNull null]) {
//array not empty
}

尽管可能编译时会有警告…不过工作是正常的,至少程序不会再崩溃了。

最后,HTML输出的时候经常会连比如”&”或者空格之类的都转换成了“&amp;”或者“&nbsp;”这样的字符。
解决方法:手动转换回来。
加入以下代码:(为了防止被转换,咱已经将英文标点”;”更换成了全角的“;”,使用前请先手动更换回来)

-(NSString *)htmlEntityDecode:(NSString *)string{
string = [string stringByReplacingOccurrencesOfString:@"";" withString:@"\""];
string = [string stringByReplacingOccurrencesOfString:@"&apos;" withString:@"'"];
string = [string stringByReplacingOccurrencesOfString:@"&;" withString:@"&"];
string = [string stringByReplacingOccurrencesOfString:@"<;" withString:@"<"]; string = [string stringByReplacingOccurrencesOfString:@"&gt;" withString:@">"];
string = [string stringByReplacingOccurrencesOfString:@" ;" withString:@" "];
return string;
}

然后这么用:
string = [self htmlEntityDecode:string];
得到的string就是正常的了~

让Mac程序支持键盘iTunes控制和AppleRemote控制

对于iPod的话方法实在是太简单了,因为iOS都内置有完整的remote控制(耳机线控)API,直接使用
- (void)remoteControlReceivedWithEvent:(UIEvent *)event就可以了。
但是Mac上并没有给出这个API(NSEvent并没有这方面的说明,看起来是私有API),所以必须另外想办法。
为了这个咱查找了很多资料,非常恶心的是网上居然几乎都没有这方面的教程。
最后从Mac上比较强大的播放软件VLC的源代码入手,终于找到了remote控制的方法。

如果开启了ARC的话会报错,那么就在Xcode的project的Target里的Build Phases,在下面的Compile Sources里面找到提示ARC报错的文件,双击他们并填上-fno-objc-arc。然后重新编译即可~

AppleRemote也就是红外线遥控器部分比较简单,但是代码似乎是VLC针对自己而写的,虽然可以直接移植过去之后使用,但是需要修改过才可以,于是咱自行进行修改,屏蔽掉了VLC自有的部分(似乎是为了错误提示做的log,并没有太大用途)。于是文件下载在这里:戳我啊!来戳啊!
下载之后将2个文件导入到project,并#import “AppleRemote.h”。
接下来在头文件里创建AppleRemote *appleremote;
然后在m文件里进行初始化并且设置其开始监听:

appleremote = [[AppleRemote alloc] init];
[appleremote setClickCountEnabledButtons: kRemoteButtonPlay];
[appleremote setDelegate:self];
[appleremote startListening: self];

然后就到了重点:接收到按键操作之后

- (void) appleRemoteButton: (AppleRemoteEventIdentifier)buttonIdentifier
pressedDown: (BOOL) pressedDown
clickCount: (unsigned int) count
{
switch( buttonIdentifier )
{
case k2009RemoteButtonFullscreen:
//似乎是进入全屏模式
break;
case k2009RemoteButtonPlay:
//开始播放
break;
case kRemoteButtonPlay:
//开始播放
break;
case kRemoteButtonVolume_Plus:
//上按键,同音量+
break;
case kRemoteButtonVolume_Minus:
//下按键,同音量-
break;
case kRemoteButtonRight:
//右按键,同下一曲
break;
case kRemoteButtonLeft:
//左按键,同上一曲
break;
case kRemoteButtonRight_Hold:
//右按键一直按,同快进
break;
case kRemoteButtonLeft_Hold:
//左按键一直按,同快退
break;
case kRemoteButtonVolume_Plus_Hold:
//上按键一直按
break;
case kRemoteButtonVolume_Minus_Hold:
//下按键一直按,同静音
break;
case kRemoteButtonMenu:
//目录(menu)按键按下
break;
case kRemoteButtonPlay_Sleep:
//播放键一直按,同进入睡眠模式
break;
default:
/* Add here whatever you want other buttons to do */
break;
}
}

到这里AppleRemote已经可以正常工作了,剩下的就看自己的需要修改代码了。

而键盘上的iTunes播放控制键虽然同样没有API,但是却有公开的代码实现,可访问Media keys hook in Mac OS X来下载代码和例子。
使用方法和上面的remote差不多,同样是import之后设置为SPMediaKeyTap *keyTap;接着init:

[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:[SPMediaKeyTap defaultMediaKeyUserBundleIdentifiers], kMediaKeyUsingBundleIdentifiersDefaultsKey,nil]];
keyTap = [[SPMediaKeyTap alloc] initWithDelegate:self];
if([SPMediaKeyTap usesGlobalMediaKeyTap])
[keyTap startWatchingMediaKeys];
else
NSLog(@"Media key monitoring disabled");

而方法官方也在例子中给出了:

-(void)mediaKeyTap:(SPMediaKeyTap*)keyTap receivedMediaKeyEvent:(NSEvent*)event;
{
NSAssert([event type] == NSSystemDefined && [event subtype] == SPSystemDefinedEventMediaKeys, @"Unexpected NSEvent in mediaKeyTap:receivedMediaKeyEvent:");
int keyCode = (([event data1] & 0xFFFF0000) >> 16);
int keyFlags = ([event data1] & 0x0000FFFF);
BOOL keyIsPressed = (((keyFlags & 0xFF00) >> 8)) == 0xA;
//int keyRepeat = (keyFlags & 0x1);
if (keyIsPressed) {
switch (keyCode) {
case NX_KEYTYPE_PLAY:
//播放键按下
break;
case NX_KEYTYPE_FAST:
//下一首按下
break;
case NX_KEYTYPE_REWIND:
//上一首按下
break;
default:
break;
}
}
}

如果对上面2个方法有问题的可以留言或者单独联系咱~

Mac OS X Server Mountain Lion 10.8下配置VPN并开启数据转发

好吧,其实这个早就应该解决了的才对,不过直到最近重新尝试才发现之前没做成功是因为完全没按照文档操作,所以当然会失败!
现在根据我的经验重新写一下做法,比原文好的是关于私有IP部分。至于图的话直接看原文就好了,不再进行转贴。
原文地址:http://www.macminicolo.net/mountainlionvpn

OS X Server自带的VPN原本是提供外网接入内网访问的,并不提供数据转发。如果不需要走数据的直接设置就行了,不需要看本教程。而如果想要拿来挂代理要走数据的话怎么办呢?
继续看下去吧~

首先先确认iCloud的Back to my Mac已关闭,根据官方说明:“在 NAT 模式下配置 AirPort 基站或 Time Capsule 上的“回到我的 Mac”会妨碍与 NAT 模式下的 OS X Server VPN 服务的连接“。所以必须关掉Back to my Mac以防止对VPN进行干扰。

然后建立一个VLAN,设置其为手动设置IPv4。
IP地址和路由为你的本机IP,子网掩码255.255.255.0。比如咱的服务器被路由器分配的IP是192.168.0.100的话,那么VLAN里填写的IP和路由都应该为192.168.0.100。
原文中博主是使用10.0.0.1是因为他本机的IP就为这个。而至于10.0.0.0/24则是CIDR,具体可以查看wiki关于CIDR。如果子网掩码不是255.255.255.0的话需要自己去重新计算喔。

设置好VLAN之后就去设置Server.app里的DNS,添加几个常用的就好,比如8.8.8.8之类的,然后开启DNS服务(默认都应该开启的)。

然后是开启NAT就是转发功能,需要修改到系统文件。先说明咱使用的都是vim,如果连最简单的操作都不熟悉的话自己去学,连这个都不会别想去管服务器了。

开终端,然后按照咱说的做:
输入sudo vim /etc/pf.anchors/com.apple
在文件里找到:scrub-anchor "100.InternetSharing/*"
然后在它的前面加上个#号,也就是注释掉。
接着找到文件最末尾。将最后一行改成:(倒数第二行不要动)
load anchor "400.AdaptiveFirewall" from "/Applications/Server.app/Contents/ServerRoot/private/etc/pf.anchors/400.AdaptiveFirewall"
其实也就是开头的load anchor “400.AdaptiveFirewall/”多了个”/”,是10.8.2的bug。需要手动清除。
最后在文件里添加三行东西:

nat-anchor "100.customNATRules/*"
rdr-anchor "100.customNATRules/*"
load anchor "100.customNATRules" from "/etc/pf.anchors/customNATRules"

保存退出。
接着运行:sudo touch /etc/pf.anchors/customNATRules
然后运行:sudo vim /etc/pf.anchors/customNATRules
接着添加以下两行:

nat on en0 from 192.168.0.0/24 to any -> (en0)
pass from {lo0, 192.168.0.0/24} to any keep state

注意和上面说的一样,原文10.0.0.0/24代表10.0.0.1~254,而我们的网络如果是192.168.0.1~254的话,则需要修改成192.168.0.0/24。
保存并退出,继续输入以下命令:(都是一行)
sudo /usr/libexec/PlistBuddy -c 'add :ProgramArguments:3 string -e' /System/Library/LaunchDaemons/com.apple.pfctl.plist

echo 'net.inet.ip.forwarding=1' | sudo tee -a /etc/sysctl.conf
当返回是:net.inet.ip.forwarding=1的时候说明配置成功了。这时候需要重启一下电脑让这些改动生效。

重启之后接着就是去设置VPN了,填写好域名和共享密匙之后在DNS设置里将原有的DNS全部清空,输入192.168.0.100也就是本机的IP地址。
然后到客户端地址,设置起始IP为192.168.0.150(只要是IP段内就好)。正确的话在点OK之后是不会弹出IP地址段错误的提示的。
最后开启VPN服务,理论上应该就能走数据了。

客户端的配置就不多说了。网上教程到处都是,而且这么简单的设置不用教程应该都能配置好的。
不过经过咱的测试,PPTP似乎是无法连接,L2TP倒是一切正常,所以目前全部切换到L2TP了。

Mac下讓XLD支持CUE+TAK

前一陣因為手動解密硬盤導致3個wine都失效了:CrossOver、MikuInstaller以及MacPorts的。
於是在沒有wine的情況下XLD是沒辦法讀取CUE+TAK文件的,會提示一個錯誤…(可惜忘記截圖下來了..

解決方法就是裝wine,但是MikuInstaller是最簡單的方法可惜並不被XLD所支持..而CrossOver是收費軟件。於是就用MacPorts最好了。
安裝wine前的準備,首先需要一個Xcode,Lion之後的系統應該都是去AppStore裡下載了。目前最新版本應該是4.4.1。如果不想裝大體積的Xcode也可以只裝命令行工具(Command Line Tools),LionML都有(地址是Aug,7,2012的,以後肯定會有新的,建議去開發者中心下載會比較好,網上也應該能搜索到下載地址)。
安裝好Xcode之後打開應用程序裡的實用工具裡的終端。接著修改Xcode的地址,因為Xcode3的時候都是默認的/Developer,而現在Xcode已經是單獨一個app文件了。於是終端裡輸入sudo /usr/bin/xcode-select -switch /Applications/Xcode.app/Contents/Developer
然後輸入sudo xcodebuild -license,會出現條款,按空格鍵到最後輸入agree即可..
接著去macports.org下載MacPorts,並且安裝,雖然安裝文件比較小但是耗時倒挺長…
安裝完MacPorts之後再回到終端,輸入sudo port -v selfupdate,進行一次更新檢測。完成之後輸入sudo port install wine即可。

而我在這之後就提示各種文件已存在的Error,之後XLD還是無法讀取CUE+TAK,而關閉掉XLD再重新打開則就能讀取了…
因為經過wine的緣故所以讀取的時候電腦會卡好一陣…不過也正說明正在運行著了..(解碼的時候速度倒是和別的文件一樣)。
話說貌似多少年前就說TAK支持要C了?至今還是在用坑爹的wine+exe真心不夠Mac化啊!!
而且也奇怪為啥那麼多人喜歡TAK而不用APE…

嘛…總的來說操作不算繁瑣,希望有所幫助~
如果上述操作之後還有問題可以留言提出….

后记:另外个更简单的方法就是使用homebrew。安装只需要一条命令行(不过同样需要先安装Command Line Tools)ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
安装完毕之后直接执行brew install wine即可。