damus是一个建立在去中心化网络上的社交软件,被称为“推特杀手”,现已在苹果应用商店上线。
1月31日,damus团队在推特上证实了这一消息,此前该团队称已经被苹果公司拒绝了至少三次。
不久之后,twitter联合创始人jack dorsey向他的650万粉丝分享了这一消息,这位企业家将其称为开源协议的“里程碑”时刻。
根据1月27日消息,damus还通过比特币第2层闪电网络内置了支付功能。
该应用自称是“可以让用户自己掌控的社交网络”,它是一款建立在去中心化网络nostr(支持加密的端到端私人消息传递等功能)上的应用软件。
nostr并不是基于服务器来运行网络,相反,它是利用去中心化中继器来分发消息。中继器(relay)是托管的服务器,所有人都可以运行中继器。获得其他用户,比如你好友的更新,需要研究询问多个中继站是否了解其他人的情况;而中继站所做的,就是接受人们的帖子并将其转发给其他人。
此外,nostr开发人员还专注于使用比特币和闪电网络来防止针对damus的垃圾邮件攻击。
ios版本的“damus”用户界面 来源:github
根据github上面的信息,已有44名软件开发人员为damus web应用程序贡献了代码。
不过,damus入驻苹果应用商店并非一帆风顺。
根据damus的官推,在最终上线之前,它已失败了至少三次:
nostr的核心开发者之一william casarin也在他的个人twitter账户上分享说,上架手机应用平台是非常坎坷的,他也说,如果苹果用户不能原生使用nostr将成为耻辱。
尽管尚不清楚jack dorsey和nostr之间的确切关系,但这位亿万富翁曾在去年12月中旬向nostr捐赠约14.17枚btc(约合 245,000 美元),以资助nostr的进一步开发。而他也一直在 nostr 上活跃。如果你看他的公钥,会发现 nostr 上的 jack 比 twitter 上的 jack 要活跃得多。
而其他知名人士也参与了damus应用程序的测试,其中包括以太坊联合创始人vitalik buterin,美国中央情报局(cia)前雇员edward snowden以及支持加密货币的美国参议员cynthia lummis。
操作指南
苹果版与安卓版名字不同,苹果应用商城搜索damus进行下载,谷歌应用商城搜索amethyst进行下载。登入后,两种版本操作界面基本一致,下文以damus操作为例。
一、登入
下载damus后可直接创建账号,阅读完各项协议,选择accept 接受,然后开始起名字创建账户,创建页面有两个密钥,一个是npub开头的公钥,另外一个是私钥,需要自己保存以便下次登入。
我们可以把公钥看作是你的用户名或者银行账户,把你的私钥看作是你的密码,因此切记千万不要将你的私钥发给别人!
二、设置
个人设置方面,damus 允许更换头像和背景图片(通过图片链接填写进avatar url)、添加自己的网站以及简介信息,还支持设置比特币闪电小费地址,这也是 damus 的一个核心亮点。
当前,damus 支持的闪电小费支付平台包括 strike、cash app、muun、blue wallet、wallet of satoshi、zebedee、zeus ln、lnlink、phoenix、breez、bitcoin beach、blixt wallet、river。
图片链接可通过以下方式获取:
1. 登陆 postimage.org,选择图片上传,点击start now
2. 生成图片链接,选择.jpg结尾的链接复制
3.回到damus,edit profile,头像的链接粘贴save即可
三、发帖
威尼斯人2299首页右下方「 」为发帖入口。与当前大多数社交网络类似,damus也设置了话题标签功能,我们在发布帖子时可以在 # 后加上主题或者话题单词。若发帖时要加图片,需要将图片先转换为链接才可发布。
四、好友
想要找到另一个用户,需要搜索他们的公钥,就像搜索推特@的用户名一样,会看到很多人在twitter上发布他们的信息。
五、群聊
目前,仅安卓版amethyst 有群聊功能。
整体而言,damus设计简约大方,但很多功能有些粗糙且不完善,例如发帖不支持样式编辑、发帖后不可删除、点赞或转推后不可撤销、图片需要转成链接才能发布,此外,趋势、过滤器等高级需求也亟待添加。
不过,damus 和作为基础设施的 nostr 目前还处于早期阶段,与比特币和 web3 的结合给了我们很多想象空间。jack dorsey 的去中心化社交愿景能否大规模实现,让我们拭目以待。
以下为大家整理了一些名人账户:
jack(推特创始人)
npub1sg6plzptd64u62a878hep2kev88swjh3tw00gjsfl8f237lmu63q0uf63m
web3 cn
npub16qak7w068hgyu4xmsq0sxwurq74dj7u09afypxrevxed8ayl89zq439sgh
达姆斯damus志愿者:
npub10jas5z30fypezqd4q3kkp8d4739z44t2khcemktycrqyutj7x2ws9wrzf3
ale @lnbc1p911driver
npub1pjvvr9we639fn6kp9aqnf4rua5suwe8mdvfygr0gegadhuxrwwnsz5jf67
熊越
npub1rsg3xkte3zyrn3m0jg0gwh2jpfszry0kfzew7q9tq5yq8sqjh9nquuas8t
超级君
npub16a7m863zhkzpd5ezzkz08rlr900eateap5dwamynssysdv6hhhqsctuk9g
神鱼
npub1ppgr0lsnx5l7hqulw4kcrhgctd3jqkuaxh6d0lftpd4alj2rct2qshk0zr
陈默
npub1zv5zhy0f83kgqz99eqfya4f4wveznkx3aa86lxcvllpcrrc9qvdsz65dtd
余弦
npub1n2prk4drfh570tc7qzvlcaa3pnj2fud7vu4jshymfp3w8sx2evpqx866nz
头雁
npub1ks5hclkksh7ghd8v2058wkut3k35xucs372u96csl4mhsm29e7gsy9cs5r
民道
npub15r9dfrldhzwu0s86dd6qmy6e8pka9pmncq29xxcmc0drg89dcqrqsk968a
郭宇
npub1ztmzpw9w4ta375wktvj98lwt6y2jjc78spg60kwyvkhjty3cr8ysengahm
大姨妈
npub1ana3ft0s7kznrjzu8maffwpfqd0lxj0nkv39gaqvwue7sse3w5uqmqdymm
defi3w
npub19786pedeqk8mpj9favvzxrz44h6d3d3c6ur2fe9592cgqljm9g7qcz8jjs
tumblebit
npub156etfp73lfc2ax0ekj557sezuag0sjzdqhljm4v9tmda62nev4rqrtug7y
参考:cointelegraph、foresightnews
编辑:dali@web3cn.pro、bowen@web3cn.pro
声明:web3中文编译作品,内容仅代表作者立场,且不构成投资建议,请谨慎对待,如文章/素材有侵权,请联系官方客服处理。
这篇文章主要介绍了苹果手机怎么用蓝牙传照片到安卓手机,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。
2019独角兽企业重金招聘python工程师标准>>>?
让你的ios应用程序支持运行javascript脚本:javascriptcore框架详解
? ? 说到javascript脚本,ios开发者都会想到一个名叫javascriptcore的框架。这个框架的确十分强大,其中封装了一套javascript运行环境以及native与js数据类型之间的转换桥梁快码论文。本篇博客主要讨论如何使用此框架来在ios应用中运行javascript脚本。
一、javascriptcore框架结构
? ? 在学习一个框架时,首先应该先了解整个框架的结构,拿ios开发来举例,对于一个陌生的框架,第一步需要先搞清楚这里面都包含哪些类,个各类之间是怎样的关系,这个框架和其他的框架间有无联系以及怎样产生的联系。将些问题搞清楚,有了大体上的认识后,我们再来学习其中的每个类即其他细节的应用将非常容易。我们先来看一张javascriptcore框架的结构图:
这张图是我手工画的,不是那么美观并且没有文字的解释,但是我觉得它能非常直观的表达javascriptcore中包含的类之间的关系。下面我来向你解释这张图究竟表达了什么意思,首先原生的ios应用是支持多线程执行任务的,我们知道javascript是单线程,但这并不代表我们不能在native中异步执行不同的javascript代码。
1.jsvirtualmachine——javascript的虚拟机
????javascriptcore中提供了一个名为jsvirtualmachine的类,顾名思义,这个类可以理解为一个js虚拟机。在native中,只要你愿意,你可以创建任意多个jsvirtualmachine对象,各个jsviretualmachine对象间是相互独立的,他们之间不能共享数据也不能传递数据,如果你把他们放在不同的native线程,他们就可以并行的执行无关的js任务。
2.jscontext——javascript运行环境
? ? jscontext上下文对象可以理解为是js的运行环境,同一个jsvirtualmachine对象可以关联多个jscontext对象,并且在webview中每次刷新操作后,此webview的js运行环境都是不同的jscontext对象。其作用就是用来执行js代码,在native和js间进行数据的传递。
3.jsvalue——javascript值对象
? ? javascript和objective-c虽然都是面向对象语言,但其实现机制完全不同,oc是基于类的,js是基于原型的,并且他们的数据类型间也存在很大的差异。因此若要在native和js间无障碍的进行数据的传递,就需要一个中间对象做桥接,这个对象就是jsvalue。
4.jsexport
? ? jsexport是一个协议,native中遵守此解析的类可以将方法和属性转换为js的接口供js调用。
5.一些用于c语言的结构
? ? 你一定注意到了,上图的右下角还有一块被虚线包围的区域,其中的"类"都是c语言风格,javascriptcore框架是支持在objective-c、swift和c三种语言中使用的。
二、在native中运行javascript脚本代码
? ? 我们先来编写一个最简单的例子,使用oc代码来执行一段js脚本。首先新建一个文件,将其后缀设置为.js,我这里将它命令为main.js,在其中编写如下代码:
(function(){
console.log("hello native");
})();
上面是一个自执行的函数,其中打印了“hello native”字符串。在native中编写如下代码:
- (void)viewdidload {
[super viewdidload];
nsstring * path = [[nsbundle mainbundle] pathforresource:@"main" oftype:@"js"];
nsdata * jsdata = [[nsdata alloc]initwithcontentsoffile:path];
nsstring * jscode = [[nsstring alloc]initwithdata:jsdata encoding:nsutf8stringencoding];
self.jscontext = [[jscontext alloc]init];
[self.jscontext evaluatescript:jscode];
}
需要注意,其实这里我将创建的jscontext对象作为了当前视图控制器的属性,这样做的目的仅仅是为了方便调试,不过不对此context对象进行引用,当viewdidload函数执行完成后,js运行环境也将被销毁,我们就无法在safari中直观的看到js代码的执行结果了。
? ? 运行工程,记得要打开safari浏览器的自动显示jscontent检查器,如下图:
当ios模拟器跑起来后,safari会自动弹出开发者工具,在控制台里面可以看到来自javascript的真挚问候:
刚才我们只是简单了通过原生调用了一段js代码,但是如果native在调js方法时无法传参那也太low了,我们可以直接将要传递的参数格式化到字符串中,修改main.js文件如下:
function put(name){
console.log("hello " name);
};
put(%@);
再封装一个oc方法如下:
-(void)runjs_hello:(nsstring *)name{
nsstring * path = [[nsbundle mainbundle] pathforresource:@"main" oftype:@"js"];
nsdata * jsdata = [[nsdata alloc]initwithcontentsoffile:path];
nsstring * jscode = [[nsstring alloc]initwithdata:jsdata encoding:nsutf8stringencoding];
nsstring * finistring = [nsstring stringwithformat:jscode,name];
[self.jscontext evaluatescript:finistring];
}
在viewdidload中进行调用,如下:
- (void)viewdidload {
[super viewdidload];
self.jscontext = [[jscontext alloc]init];
[self runjs_hello:@"'阿凡达'"];
}
运行再看safari控制台的结果,编程了hello 阿凡达~:
其实evaluatescript函数执行后会将js代码的执行结果进行返回,是jsvalue类型的对象,后面会再介绍。
三、在javascript中调用native方法
? ? 有来无往非君子,同样也可以在原生中编写方法让js来调用,示例如下:
- (void)viewdidload {
[super viewdidload];
void(^block)() = ^(){
nslog(@"hello javascript");
};
self.jscontext = [[jscontext alloc]init];
[self.jscontext setobject:block forkeyedsub:@"oc_hello"];
}
上面setobject:forkeyedsub:方法用来向jscontext环境的全局对象中添加属性,这里添加了一个函数属性,取名为oc_hello。这里javascriptcore会自动帮我们把一些数据类型进行转换,会将oc的函数转换为js的函数,运行工程,在safari的控制台中调用oc_hello函数,可以看到在xcode控制台输出了对javascript的真挚问候,如下:
同样,如果声明的block是带参数的,js在调用此oc方法时也需要传入参数,如果block有返回值,则在js中也能获取到返回值,例如:
bool (^block)(nsstring *) = ^(nsstring *name){
nslog(@"%@", [nsstring stringwithformat:@"hello %@",name]);
return yes;
};
self.jscontext = [[jscontext alloc]init];
[self.jscontext setobject:block forkeyedsub:@"oc_hello"];
四、深入jscontext类
? ? 看到这,你已经学会最基础的oc与js互相问好(交互)。下面我们再来深入看下jscontext中的属性和方法。
? ? 创建jscontext对象有如下两种方式:
//创建一个新的js运行环境
- (instancetype)init;
//创建一个新的js运行环境 并关联到某个虚拟机对象上
- (instancetype)initwithvirtualmachine:(jsvirtualmachine *)virtualmachine;
? ? 执行js代码有如下两个方法:
//执行js代码 结果将封装成jsvalue对象返回
- (jsvalue *)evaluatescript:(nsstring *);
//作用同上
- (jsvalue *)evaluatescript:(nsstring *) withsourceurl:(nsurl *)sourceurl ns_available(10_10, 8_0);
? ? 下面的属性和方法可以获取到js运行环境中的一些信息:
//当前的js运行环境 当js调用oc方法时,在oc方法中可以用此方法获取到js运行环境
(jscontext *)currentcontext;
//获取当前执行的js函数,当js调用oc方法时,在oc方法中可以用此方法获取到执行的函数
(jsvalue *)currentcallee;
//获取当前执行的js函数中的this指向的对象
(jsvalue *)currentthis;
//获取当前执行函数的参数列表,当js调用oc方法时,在oc方法中可以用此方法获取到执行的函数的参数列表
(nsarray *)currentarguments;
//获取当前js运行环境的全局对象
@property (readonly, strong) jsvalue *globalobject;
//当运行的javascript代码抛出了未捕获的异常时,这个属性会被赋值为抛出的异常
@property (strong) jsvalue *exception;
//设置为一个异常捕获的block,如果异常被此block捕获,exception属性就不再被赋值了
@property (copy) void(^exceptionhandler)(jscontext *context, jsvalue *exception);
//当前运行环境所关联的虚拟机
@property (readonly, strong) jsvirtualmachine *virtualmachine;
//当前运行环境名称
@property (copy) nsstring *name;
//获取当前js运行环境全局对象上的某个属性
- (jsvalue *)objectforkeyedsub:(id)key;
//设置当前js运行环境全局对象上的属性
- (void)setobject:(id)object forkeyedsub:(nsobject
//将c语言环境的js运行环境转换为oc环境的js运行环境
(jscontext *)contextwithjsglobalcontextref:(jsglobalcontextref)jsglobalcontextref;
//c语言环境的js运行上下文
@property (readonly) jsglobalcontextref jsglobalcontextref;
五、深入jsvalue类
? ? jsvalue是javascript与objective-c之间的数据桥梁。在objective-c中调用js脚本或者js调用oc方法都可以使用jsvalue来传输数据。其中属性和方法示例如下:
//所对应的js运行环境
@property (readonly, strong) jscontext *context;
//在指定的js运行环境中创建一个jsvalue对象
(jsvalue *)valuewithobject:(id)value incontext:(jscontext *)context;
//创建布尔值
(jsvalue *)valuewithbool:(bool)value incontext:(jscontext *)context;
//创建浮点值
(jsvalue *)valuewithdouble:(double)value incontext:(jscontext *)context;
//创建32位整型值
(jsvalue *)valuewithint32:(int32_t)value incontext:(jscontext *)context;
//创建32位无符号整形值
(jsvalue *)valuewithuint32:(uint32_t)value incontext:(jscontext *)context;
//创建空的js对象
(jsvalue *)valuewithnewobjectincontext:(jscontext *)context;
//创建空的js数组
(jsvalue *)valuewithnewarrayincontext:(jscontext *)context;
//创建js正则对象
(jsvalue *)valuewithnewregularexpressionfrompattern:(nsstring *)pattern flags:(nsstring *)flags incontext:(jscontext *)context;
//创建js错误信息
(jsvalue *)valuewithnewerrorfrommessage:(nsstring *)message incontext:(jscontext *)context;
//创建js null值
(jsvalue *)valuewithnullincontext:(jscontext *)context;
//创建js undefined值
(jsvalue *)valuewithundefinedincontext:(jscontext *)context;
javascript中的数据类型和objective-c的数据类型还是有着很大的差异,其中对应关系如下:
objective-c?javascriptnilundefinednsnullnullnsstringstringnsnumbernumber booleannsdictionary ??objectnsarrayarraynsdatedate? ?blockfunctionidobjectclassobject
下面这些方法可以将jsvalue值转换为objective-c中的数据类型:
//将jsvalue转换为oc对象
- (id)toobject;
//将jsvalue转换成特定oc类的对象
- (id)toobjectofclass:(class)expectedclass;
//将jsvalue转换成布尔值
- (bool)tobool;
//将jsvalue转换成浮点值
- (double)todouble;
//将jsvalue转换成32位整型值
- (int32_t)toint32;
//将jsvalue转换成32位无符号整型值
- (uint32_t)touint32;
//将jsvalue转换成nsnumber值
- (nsnumber *)tonumber;
//将jsvalue转换成nsstring值
- (nsstring *)tostring;
//将jsvalue转换成nsdate值
- (nsdate *)todate;
//将jsvalue转换成nsarray值
- (nsarray *)toarray;
//将jsvalue转换成nsdictionary值
- (nsdictionary *)todictionary;
//获取jsvalue对象中某个属性的值
- (jsvalue *)valueforproperty:(nsstring *)property;
//设置jsvalue对象中某个属性的值
- (void)setvalue:(id)value forproperty:(nsstring *)property;
//删除jsvalue对象中的某个属性
- (bool)deleteproperty:(nsstring *)property;
//判断jsvalue对象中是否包含某个属性
- (bool)hasproperty:(nsstring *)property;
//定义jsvalue中的某个属性 这个方法和javascript中object构造函数的defineproperty方法一致
/*
第2个参数设置此属性的描述信息 可以设置的键值如下:
nsstring * const jspropertydeorwritablekey;//设置布尔值 是否可写
nsstring * const jspropertydeorenumerablekey;//设置布尔值 是否可枚举
nsstring * const jspropertydeorconfigurablekey;//设置布尔值 是否可配置
nsstring * const jspropertydeorvaluekey;//设置此属性的值
nsstring * const jspropertydeorgetkey;//设置此属性的get方法
nsstring * const jspropertydeorsetkey;//设置此属性的set方法
以上set、get方法的键和value、可写性的键不能同时存在,其语法是javascript保持一致
*/
- (void)defineproperty:(nsstring *)property deor:(id)deor;
//获取js数组对象某个下标的值
- (jsvalue *)valueatindex:(nsuinteger)index;
//设置js数组对象某个下标的值
- (void)setvalue:(id)value atindex:(nsuinteger)index;
//判断此对象是否为undefined
@property (readonly) bool isundefined;
//判断此对象是否为null
@property (readonly) bool isnull;
//判断此对象是否为布尔值
@property (readonly) bool isboolean;
//判断此对象是否为数值
@property (readonly) bool isnumber;
//判断此对象是否为字符串
@property (readonly) bool isstring;
//判断此对象是否为object对象
@property (readonly) bool isobject;
//判断此对象是否为数组
@property (readonly) bool isarray;
//判断此对象是否为日期对象
@property (readonly) bool isdate;
//比较两个jsvalue是否全相等 对应javascript中的===
- (bool)isequaltoobject:(id)value;
//比较两个jsvalue对象的值是否相等 对应javascript中的==
- (bool)isequalwithtypecoerciontoobject:(id)value;
//判断某个对象是否在当前对象的原型链上
- (bool)isinstanceof:(id)value;
//如果jsvalue是function对象 可以调用此方法 和javascript中的call方法一致
- (jsvalue *)callwitharguments:(nsarray *)arguments;
//如果jsvalue是一个构造方法对象 可以调用此方法 和javascript中使用new关键字一致
- (jsvalue *)constructwitharguments:(nsarray *)arguments;
//用此对象进行函数的调用 当前对象会被绑定到this中
- (jsvalue *)invokemethod:(nsstring *)method witharguments:(nsarray *)arguments;
//将cgpoint转换为jsvalue对象
(jsvalue *)valuewithpoint:(cgpoint)point incontext:(jscontext *)context;
//将nsrange转换为jsvalue对象
(jsvalue *)valuewithrange:(nsrange)range incontext:(jscontext *)context;
//将cgrect转换为jsvalue对象
(jsvalue *)valuewithrect:(cgrect)rect incontext:(jscontext *)context;
//将cgsize转换为jsvalue对象
(jsvalue *)valuewithsize:(cgsize)size incontext:(jscontext *)context;
//转换成cgpoint数据
- (cgpoint)topoint;
//转换成nsrange数据
- (nsrange)torange;
//转换成cgrect数据
- (cgrect)torect;
//转换为cgsize数据
- (cgsize)tosize;
//将c风格的jsvalueref对象转换为jsvalue对象
(jsvalue *)valuewithjsvalueref:(jsvalueref)value incontext:(jscontext *)context;
其实在javascriptcore框架中还有一个jsmanagervalue类,这个的主要作用是管理内存。虽然我们在编写objective-c代码时有强大的自动引用技术(arc技术),我们一般无需关心对象的内存问题,在编写javascript代码时也有强大的垃圾回收机制(这种机制下甚至连循环引用都不是问题),但是在oc和js混合开发时,就很容易出现问题了,比如一个js垃圾回收机制释放掉的对象oc中却还在用,反过来也是一样。jsmanagervalue对jsvalue进行了一层包装,它可以保证在适合时候使用这个对象时对象都不会被释放,其中方法如下:
//创建jsvlaue对象的包装jsmanagervalue
(jsmanagedvalue *)managedvaluewithvalue:(jsvalue *)value;
(jsmanagedvalue *)managedvaluewithvalue:(jsvalue *)value andowner:(id)owner;
- (instancetype)initwithvalue:(jsvalue *)value;
//获取所包装的jsvalue对象
@property (readonly, strong) jsvalue *value;
六、objective-c与javascript复杂对象的映射
? ? 我们在使用javascript调用objective-c方法的实质是将一个oc函数设置为了js全局对象的一个属性,当然我们也可以设置非函数的属性或者任意jsvalue(或者可以转换为jsvalue)的值。例如:
self.jscontext = [[jscontext alloc]init];
//向js全局对象中添加一个获取当前native设备类型的属性
[self.jscontext setobject:@"ios" forkeyedsub:@"devicetype"];
但是如果我们想把oc自定义的一个类的对象设置为js全局对象的某个属性,js和oc有着完全不同的对象原理,如果不做任何处理,js是接收不到oc对象中定义的属性和方法的。这时就需要使用到前面提到的jsexport协议,需要注意,这个协议不是用来被类遵守的,它里面没有规定任何方法,其是用来被继承定义新的协议的,自定义的协议中约定的方法和属性可以在js中被获取到,示例如下:
oc中新建一个自定义的类:
@protocol myobjectprotocol
@property(nonatomic,strong)nsstring * name;
@property(nonatomic,strong)nsstring * subject;
@property(nonatomic,assign)nsinteger age;
-(void)sayhi;
@end
@interface myobject : nsobject
@property(nonatomic,strong)nsstring * name;
@property(nonatomic,strong)nsstring * subject;
@property(nonatomic,assign)nsinteger age;
@end
@implementation myobject
-(void)sayhi{
nslog(@"hello javascript");
}
@end
添加到js全局对象中:
myobject* object = [myobject new];
object.name = @"jaki";
object.age = 25;
object.subject = @"oc";
[jscontext setobject:object forkeyedsub:@"deviceobject"];
在js运行环境中可以完整的到deviceobject对象,如下:
七、c语言风格的api解释
? ? javascriptcore框架中除了包含完整的objective-c和swift语言的api外,也提供了对c语言的支持。
? ? 与js运行环境相关的方法如下:
//创建一个jscontextref组
/*
jscontextref相当于jscontext,同一组中的数据可以共享
*/
jscontextgroupref jscontextgroupcreate(void);
//内存引用
jscontextgroupref jscontextgroupretain(jscontextgroupref group);
//内存引用释放
void jscontextgrouprelease(jscontextgroupref group);
//创建一个全局的运行环境
jsglobalcontextref jsglobalcontextcreate(jsclassref globalobjectclass);
//同上
jsglobalcontextref jsglobalcontextcreateingroup(jscontextgroupref group, jsclassref globalobjectclass);
//内存引用
jsglobalcontextref jsglobalcontextretain(jsglobalcontextref ctx);
//内存引用释放
void jsglobalcontextrelease(jsglobalcontextref ctx);
//获取全局对象
jsobjectref jscontextgetglobalobject(jscontextref ctx);
//获取jscontextref组
jscontextgroupref jscontextgetgroup(jscontextref ctx);
//获取全局的运行环境
jsglobalcontextref jscontextgetglobalcontext(jscontextref ctx);
//获取运行环境名
jsstringref jsglobalcontextcopyname(jsglobalcontextref ctx);
//设置运行环境名
void jsglobalcontextsetname(jsglobalcontextref ctx, jsstringref name);
? ? 与定义js对象的相关方法如下:
//定义js类
/*
参数jsclassdefinition是一个结构体 其中可以定义许多回调
*/
jsclassref jsclasscreate(const jsclassdefinition* definition);
//引用内存
jsclassref jsclassretain(jsclassref jsclass);
//释放内存
void jsclassrelease(jsclassref jsclass);
//创建一个js对象
jsobjectref jsobjectmake(jscontextref ctx, jsclassref jsclass, void* data);
//定义js函数
jsobjectref jsobjectmakefunctionwithcallback(jscontextref ctx, jsstringref name, jsobjectcallasfunctioncallback callasfunction);
//定义构造函数
jsobjectref jsobjectmakeconstructor(jscontextref ctx, jsclassref jsclass, jsobjectcallasconstructorcallback callasconstructor);
//定义数组
jsobjectref jsobjectmakearray(jscontextref ctx, size_t argumentcount, const jsvalueref arguments[], jsvalueref* exception);
//定义日期对象
jsobjectref jsobjectmakedate(jscontextref ctx, size_t argumentcount, const jsvalueref arguments[], jsvalueref* exception);
//定义异常对象
jsobjectref jsobjectmakeerror(jscontextref ctx, size_t argumentcount, const jsvalueref arguments[], jsvalueref* exception);
//定义正则对象
jsobjectref jsobjectmakeregexp(jscontextref ctx, size_t argumentcount, const jsvalueref arguments[], jsvalueref* exception);
//定义函数对象
jsobjectref jsobjectmakefunction(jscontextref ctx, jsstringref name, unsigned parametercount, const jsstringref parameternames[], jsstringref body, jsstringref sourceurl, int startinglinenumber, jsvalueref* exception);
//获取对象的属性
jsvalueref jsobjectgetprototype(jscontextref ctx, jsobjectref object);
//设置对象的属性
void jsobjectsetprototype(jscontextref ctx, jsobjectref object, jsvalueref value);
//检查对象是否包含某个属性
bool jsobjecthasproperty(jscontextref ctx, jsobjectref object, jsstringref propertyname);
//获取对象属性
jsvalueref jsobjectgetproperty(jscontextref ctx, jsobjectref object, jsstringref propertyname, jsvalueref* exception);
//定义对象属性
void jsobjectsetproperty(jscontextref ctx, jsobjectref object, jsstringref propertyname, jsvalueref value, jspropertyattributes attributes, jsvalueref* exception);
//删除对象属性
bool jsobjectdeleteproperty(jscontextref ctx, jsobjectref object, jsstringref propertyname, jsvalueref* exception);
//获取数组值
jsvalueref jsobjectgetpropertyatindex(jscontextref ctx, jsobjectref object, unsigned propertyindex, jsvalueref* exception);
//设置数组值
void jsobjectsetpropertyatindex(jscontextref ctx, jsobjectref object, unsigned propertyindex, jsvalueref value, jsvalueref* exception);
//获取私有数据
void* jsobjectgetprivate(jsobjectref object);
//设置私有数据
bool jsobjectsetprivate(jsobjectref object, void* data);
//判断是否为函数
bool jsobjectisfunction(jscontextref ctx, jsobjectref object);
//将对象作为函数来调用
jsvalueref jsobjectcallasfunction(jscontextref ctx, jsobjectref object, jsobjectref thisobject, size_t argumentcount, const jsvalueref arguments[], jsvalueref* exception);
//判断是否为构造函数
bool jsobjectisconstructor(jscontextref ctx, jsobjectref object);
//将对象作为构造函数来调用
jsobjectref jsobjectcallasconstructor(jscontextref ctx, jsobjectref object, size_t argumentcount, const jsvalueref arguments[], jsvalueref* exception);
//获取所有属性名
jspropertynamearrayref jsobjectcopypropertynames(jscontextref ctx, jsobjectref object);
//进行内存引用
jspropertynamearrayref jspropertynamearrayretain(jspropertynamearrayref array);
//内存释放
void jspropertynamearrayrelease(jspropertynamearrayref array);
//获取属性个数
size_t jspropertynamearraygetcount(jspropertynamearrayref array);
//在属性名数组中取值
jsstringref jspropertynamearraygetnameatindex(jspropertynamearrayref array, size_t index);
//添加属性名
void jspropertynameaccumulatoraddname(jspropertynameaccumulatorref accumulator, jsstringref propertyname);
? ? js数据类型相关定义在jsvalueref中,如下:
//获取值的类型
/*
枚举如下:
typedef enum {
kjstypeundefined,
kjstypenull,
kjstypeboolean,
kjstypenumber,
kjstypestring,
kjstypeobject
} jstype;
*/
jstype jsvaluegettype(jscontextref ctx, jsvalueref);
//判断是否为undefined类型
bool jsvalueisundefined(jscontextref ctx, jsvalueref value);
//判断是否为null类型
bool jsvalueisnull(jscontextref ctx, jsvalueref value);
//判断是否为布尔类型
bool jsvalueisboolean(jscontextref ctx, jsvalueref value);
//判断是否为数值类型
bool jsvalueisnumber(jscontextref ctx, jsvalueref value);
//判断是否为字符串类型
bool jsvalueisstring(jscontextref ctx, jsvalueref value);
//判断是否为对象类型
bool jsvalueisobject(jscontextref ctx, jsvalueref value);
//是否是类
bool jsvalueisobjectofclass(jscontextref ctx, jsvalueref value, jsclassref jsclass);
//是否是数组
bool jsvalueisarray(jscontextref ctx, jsvalueref value);
//是否是日期
bool jsvalueisdate(jscontextref ctx, jsvalueref value);
//比较值是否相等
bool jsvalueisequal(jscontextref ctx, jsvalueref a, jsvalueref b, jsvalueref* exception);
//比较值是否全等
bool jsvalueisstrictequal(jscontextref ctx, jsvalueref a, jsvalueref b);
//是否是某个类的实例
bool jsvalueisinstanceofconstructor(jscontextref ctx, jsvalueref value, jsobjectref constructor, jsvalueref* exception);
//创建undefined值
jsvalueref jsvaluemakeundefined(jscontextref ctx);
//创建null值
jsvalueref jsvaluemakenull(jscontextref ctx);
//创建布尔值
jsvalueref jsvaluemakeboolean(jscontextref ctx, bool boolean);
//创建数值
jsvalueref jsvaluemakenumber(jscontextref ctx, double number);
//创建字符串值
jsvalueref jsvaluemakestring(jscontextref ctx, jsstringref string);
//通过json创建对象
jsvalueref jsvaluemakefromjsonstring(jscontextref ctx, jsstringref string);
//将对象转为json字符串
jsstringref jsvaluecreatejsonstring(jscontextref ctx, jsvalueref value, unsigned indent, jsvalueref* exception);
//进行布尔值转换
bool jsvaluetoboolean(jscontextref ctx, jsvalueref value);
//进行数值转换
double jsvaluetonumber(jscontextref ctx, jsvalueref value, jsvalueref* exception);
//字符串值赋值
jsstringref jsvaluetostringcopy(jscontextref ctx, jsvalueref value, jsvalueref* exception);
//值与对象的转换
jsobjectref jsvaluetoobject(jscontextref ctx, jsvalueref value, jsvalueref* exception);
? ? 在c风格的api中,字符串也被包装成了jsstringref类型,其中方法如下:
//创建js字符串
jsstringref jsstringcreatewithcharacters(const jschar* chars, size_t numchars);
jsstringref jsstringcreatewithutf8cstring(const char* string);
//内存引用于释放
jsstringref jsstringretain(jsstringref string);
void jsstringrelease(jsstringref string);
//获取字符串长度
size_t jsstringgetlength(jsstringref string);
//转成utf8字符串
size_t jsstringgetutf8cstring(jsstringref string, char* buffer, size_t buffersize);
//字符串比较
bool jsstringisequal(jsstringref a, jsstringref b);
bool jsstringisequaltoutf8cstring(jsstringref a, const char* b);
八、hybird app 构建思路
? ? hybird app是指混合模式移动应用,即其中既包含原生的结构有内嵌有web的组件。这种app不仅性能和用户体验可以达到和原生所差无几的程度,更大的优势在于bug修复快,版本迭代无需发版。3月8日苹果给许多开发者发送了一封警告邮件,主要是提示开发者下载脚本动态更改app原本行为的做法将会被提审拒绝。其实这次邮件所提内容和hybird app并无太大关系(对reactnative也没有影响),苹果警告的是网络下发脚本并且使用runtime动态修改native行为的应用,hybird app的实质并没有修改原native的行为,而是将下发的资源进行加载和界面渲染,类似webview。
? ? 关于混合开发,我们有两种模式:
????1.native内嵌webview,通过js与oc交互实现业务无缝的衔接。
? ? 无论是uiwebview还是wkwebkit,我们都可以在其中拿到当前的jscontext,然是使用前面介绍的方法便可以实现数据互通与交互。这种方式是最简单的混合开发,但其性能和原生相比要差一些。示意图如下:
? ? 2.下发js脚本,使用类似reactnative的框架进行原生渲染
? ? 这是一种效率非常高的混合开发模式,并且reactnative也本身支持android和ios公用一套代码。我们也可以使用javascriptcore自己实现一套解析逻辑,使用javascript来编写native应用,要完整实现这样一套东西太复杂了,我们也没有能力完成一个如此庞大的工程,但是我们可以做一个小demo来模拟其原理,这样可以更好的帮助我们理解hybird app的构建原理。
我们打算实现这样的功能:通过下发js脚本创建原生的uilabel标签与uibutton控件,首先编写js代码如下:
(function(){
console.log("progectinit");
//js脚本加载完成后 自动render界面
return render();
})();
//js标签类
function label(rect,text,color){
this.rect = rect;
this.text = text;
this.color = color;
this.typename = "label";
}
//js按钮类
function button(rect,text,callfunc){
this.rect = rect;
this.text = text;
this.callfunc = callfunc;
this.typename = "button";
}
//js rect类
function rect(x,y,width,height){
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
//js颜色类
function color(r,g,b,a){
this.r = r;
this.g = g;
this.b = b;
this.a = a;
}
//渲染方法 界面的渲染写在这里面
function render(){
var rect = new rect(20,100,280,30);
var color = new color(1,0,0,1);
var label = new label(rect,"hello world",color);
var rect2 = new rect(20,150,280,30);
var color2 = new color(0,1,0,1);
var label2 = new label(rect2,"hello native",color2);
var rect3 = new rect(20,200,280,30);
var color3 = new color(0,0,1,1);
var label3 = new label(rect3,"hello javascript",color3);
var rect4 = new rect(20,240,280,30);
var button = new button(rect4,"我是一个按钮",function(){
var randcolor = new color(math.random(),math.random(),math.random(),1);
globle.changebackgroundcolor(randcolor);
});
//将控件以数组形式返回
return [label,label2,label3,button];
}
创建一个objective-c类绑定到js全局对象上,作为oc方法的桥接器:
//.h
#import
#import
#import
@protocol globleprptocol
-(void)changebackgroundcolor:(jsvalue *)value;
@end
@interface globle : nsobject
@property(nonatomic,weak)uiviewcontroller * ownercontroller;
@end
//.m
#import "globle.h"
@implementation globle
-(void)changebackgroundcolor:(jsvalue *)value{
self.ownercontroller.view.backgroundcolor = [uicolor colorwithred:value[@"r"].todouble green:value[@"g"].todouble blue:value[@"b"].todouble alpha:value[@"a"].todouble];
}
@end
在viewcontroller中实现一个界面渲染的render解释方法,并建立按钮的方法转换,如下:
//
// viewcontroller.m
// javascriptcoretest
//
// created by vip on 17/3/6.
// 威尼斯人2299 copyright ? 2017年 jaki. all rights reserved.
//
#import "viewcontroller.h"
#import
#import "globle.h"
@interface viewcontroller ()
@property(nonatomic,strong)jscontext * jscontext;
@property(nonatomic,strong)nsmutablearray * actionarray;
@property(nonatomic,strong)globle * globle;
@end
@implementation viewcontroller
- (void)viewdidload {
[super viewdidload];
//创建js运行环境
self.jscontext = [jscontext new];
//绑定桥接器
self.globle = [globle new];
self.globle.ownercontroller = self;
self.jscontext[@"globle"] = self.globle;
self.actionarray = [nsmutablearray array];
[self render];
}
//界面渲染解释器
-(void)render{
nsstring * path = [[nsbundle mainbundle] pathforresource:@"main" oftype:@"js"];
nsdata * jsdata = [[nsdata alloc]initwithcontentsoffile:path];
nsstring * jscode = [[nsstring alloc]initwithdata:jsdata encoding:nsutf8stringencoding];
jsvalue * jsvlaue = [self.jscontext evaluatescript:jscode];
for (int i=0; i
jsvalue * subvalue = [jsvlaue objectatindexedsub:i];
if ([[subvalue objectforkeyedsub:@"typename"].tostring isequaltostring:@"label"]) {
uilabel * label = [uilabel new];
label.frame = cgrectmake(subvalue[@"rect"][@"x"].todouble, subvalue[@"rect"][@"y"].todouble, subvalue[@"rect"][@"width"].todouble, subvalue[@"rect"][@"height"].todouble);
label.text = subvalue[@"text"].tostring;
label.textcolor = [uicolor colorwithred:subvalue[@"color"][@"r"].todouble green:subvalue[@"color"][@"g"].todouble blue:subvalue[@"color"][@"b"].todouble alpha:subvalue[@"color"][@"a"].todouble];
[self.view addsubview:label];
}else if ([[subvalue objectforkeyedsub:@"typename"].tostring isequaltostring:@"button"]){
uibutton * button = [uibutton buttonwithtype:uibuttontypesystem];
button.frame = cgrectmake(subvalue[@"rect"][@"x"].todouble, subvalue[@"rect"][@"y"].todouble, subvalue[@"rect"][@"width"].todouble, subvalue[@"rect"][@"height"].todouble);
[button settitle:subvalue[@"text"].tostring forstate:uicontrolstatenormal];
button.tag = self.actionarray.count;
[button addtarget:self action:@selector(buttonaction:) forcontrolevents:uicontroleventtouchupinside];
[self.actionarray addobject:subvalue[@"callfunc"]];
[self.view addsubview:button];
}
}
}
//按钮转换方法
-(void)buttonaction:(uibutton *)btn{
jsvalue * action = self.actionarray[btn.tag];
//执行js方法
[action callwitharguments:nil];
}
@end
运行工程,效果如下图所示,点击按钮即可实现简单的界面颜色切换:
上面的示例工程我只实现了uilabel类与uibutton类的js-oc转换,如果将原生控件和js对象再进行一层绑定,并且实现大部分js类与原生类和他们内部的属性,则我们就开发了一套hybird app开发框架,但并没有这个必要,如果你对更多兴趣,可以深入学习下reactnative。
? ? 文中的示例demo我放在了github上,地址如下:github - zyhshao/demo-hybird: 混合开发在ios中的构建思路demo。
前端学习新人,有志同道合的朋友,欢迎交流与指导,qq群:541458536
转载于: my.oschina /u/2340880/blog/856321
入手iphone必看!!!!!!!!!!? 此文出自iphone中文论坛,为chokko 原创?
1. /private/var/mobile 新刷完的机器,要在这个文件夹下建一个documents的目录,很多程序都要用到。? 2. /private/var/mobile/applications 通过appstore和itunes安装的程序都在里面。? 3. /private/var/stash 这个文件夹下的applications目录里面是所有通过cydia和app安装的程序,ringtones目录里是所有的手机铃音,自制铃音直接拷在里面即可,themes目录里是所有winterboard主题,可以手工修改。? 4. /var/mobile/media/roms/gba gpsphone模拟器存放rom的目录。? 5. /var/mobile/media/textreader textreader看书软件读取的电子书的存放路径。(我这里修正了原帖说明上的错误)? 6. /applications/wedictpro.app或/applications/wedict.app(wedict目录,wedict字典放在该目录下,权限644不变)? 7.??/system/library/fonts/cache(系统字体目录,要替换的字体放在该目录下,权限644不变) 8.??/private/var/mobile/media/maps(离线地图目录,把地图文件夹放到该目录下,文件夹赋予777权限)? 9.??/private/var/mobile/library/downloads (ipa文件存放目录,把下载来的ipa文件放到此目录下,用installous安装,后文会讲到)? 10.??/private/var/mobile/library/keyboard (系统拼音字库文件位置)? 11.??/var/stash/themes.xxxxxx??(winterboard主题文件存放路径)? 12.??/private/var/mobile/media/dcim/999apple??(系统自带截屏文件存放路径,截屏方法:按住power并快速按一下home键)? 13.??/private/var/mobile/media/wikipedia/??(wiki百科文件夹存放路径)? 14.??/system/library/frameworks/uikit.framework和/system/library/privateframeworks/appsupport.framework(这两个都是电话号码显示规则文件存放路径)? 15: /private/var/mobile/library/addressbook??(这个是电话本的存放路径)? 16:/private/var/mobile/library/sms (这个是短信的存放路径)? 17:/private/var/mobile/library/notes??(这个是记事本的存放路径)?
完美解决iphone的划痕? 我想,广大疯友在小i的外壳上最大的烦恼就是不断增加的细小划痕是吧,有的tx说用牙膏,呵呵,那个不行的,是能够减小划痕,但是呢,会使小i的背壳看上去就没那么亮了哦 。通过我的试验,终于找到方法可以让小i的背壳的细小划痕消失,而且不会使小i的光亮度减小哦。。。? 方法如下:? 首先是工具:1、买小i时赠送的擦机布或者麂皮,其他的布料会引起划痕。2、这是关键,就是3m镜面蜡!这是个好东西哦!? 操作步骤:1、少量3m镜面蜡涂在小i背壳上。2、用擦机布使劲来回擦。3、这步也关键,当蜡变干以后,逐步减小手的力量,轻轻快速来回擦。? 注意事项:擦的时候力道要使在手指的手肚上,不要用指甲使劲哦,不然会产生新的划痕!? 大家去试试吧,不会让你失望的!!? 3m镜面蜡在汽车美容店就可以找到哦。? 此方法同样适用于air jacket等透明保护壳。我已经试验过的,大家放心的去做吧!还小i一个崭新的面容!(太深的划痕不起作用!不过我想太深的划痕是不是可以先用3m粗蜡擦,然后细蜡擦,最后再用镜面蜡,或者不用粗蜡,因为粗蜡确实太粗了。我没试验过,划痕多且深且愿意试的同学可试一下。)? 看贴记得回帖哦。?
教你节省iphone的运行内存? iphone,在破解或多装了一些应用程序后,都存在反应慢、很卡或者无故退出等问题。这都是因为运行内存不足造成的,下面的教程可以解决这个问题。 1.首先我们需要安装bossprefs,也可以从cydia上下载。? 2.其次我们还需要下载一些服务开关插件。下载后解压,并上传至iphone的/private/var/stash/applications.xxxxxx/bossprefs.app/services文件夹中。? 3.运行bossprefs,可以看到多了fairplaydsvr、syslogdsvr、updatesvr、wefitsvr、pandademonsvr、pdanetsvr、wiki2touchsvr等7个选项(图1),选择开启或关闭即可。? 4.大家可以按需要随时启动或关闭上述服务,无需重启iphone,效果等同于windows的服务管理器——当你在bossprefs关闭上述任一服务时,会立即从内存中卸载该项服务,并把占用的内存释放出来。当选择打开该服务时,则会立即启动该项服务。? 这些服务是什么意思呢?下面给大家说明一下:? syslogdsvr:iphone日志服务,占用13m内存;? updatesvr:iphone更新服务,占用12m内存;? fairplaydsvr:fairplayd服务,占用17m内存;(注意:这个不能关闭,否则有些程序运行不了)? pandademonsvr:网龙91助手的守护程序,占用20m内存;? wefitsvr:wefit输入法服务,占用41.6m内存;? wiki2touchsvr:wiki服务,占用20m内存。? 5.上述服务,平时都可关掉,当要用到网龙91助手、wefit等服务时,只需到bossprefs中启动相应服务即可,无需重启手机。? 优化以后,反应慢、卡、无故退出等情况,基本上彻底消失。?
主题安装,美化你的iphone? 首先在安装主题之前,需要安装软件winterboard,该软件在cydia和91手机助手中,都可以找到并安装? 1.操作界面主题:? 使用91手机助手打开“媒体娱乐”? 点选“手机主题”? 然后就可以从网络上下载主题了,我们任意选择其中一款主题点击下载,下载完成后91手机助手会提示是否立即启用,选择是,则使用该主题,touch会注销界面进入锁屏界面,解锁之后就可以看到你所安装的主题了? 如果你是从网页上下载的主题包,一样可以通过91手机助手安装,点选“iphone上的主题”? 选择最下方的“添加主题”? 然后找到你下载并已经解压的主题文件夹,无需打开,直接右下的确定即可? 导入之后,点击左下的“启用主题”就可以了? 2.美化锁屏界面:? 很多新手朋友破解之后,可能对锁屏主题的安装还不太了解,我在这里也介绍下使用方法? 首先从网页上下载你喜欢的锁屏界面主题? 使用91手机助手,点击“文件管理”? 打开路径/library/themes,选择右上角的"上传"选择其中的“上传目录”? 找到你需要使用的锁屏主题文件夹,上传,权限设置775? 然后打开ip上所安装的winterboard,找到你刚刚上传的锁屏主题,勾选,(不要取消本来的界面主题)home键退出,等待小菊花转完,锁屏主题就安装成功了? 3.锁屏天气主题:? 有不少朋友可能希望为锁屏界面上显示天气信息,论坛上下载的可能与你所在城市的信息不符,自己改代码可能又有些困难,推荐一个网站制作锁频天气主题? joyiphone /? 打开网站,点击上方的“自制农历天气主题”? 将会出现15个模块,有主界面显示天气的,有锁屏显示,这里我们就制作锁屏显示的,点击其中一个? 然后出现制作页面,非常简单下方有选择省份,城市? 选择你所在的省份和城市,点击“下一步”? 然后完成制作,点击“立即下载”? 下载好压缩包,解压之后,按照前面所说的方法将主题导入路径/library/themes,权限设置775,然后进入winterboard选择你所上传的锁屏天气主题,home键退出,等待小菊花转完就可以看见了? 4.电池图标更换:? 看腻了系统自带的电池图标?想换一个又不知道该怎么办?请继续看下去? 从网页论坛等地下载你所喜欢的电池图标,解压之后打开找到里面电池图标的图片? 然后使用91手机助手打开路径/system/library/coreservices/springboard.app? 点击“上传”,选择“上传文件”? 将你刚刚解压的电池图标全部上传至/system/library/coreservices/springboard.app文件夹下,替换同名文件,设置用户为root,权限为644? 然后重启ip即可? 关键词:山寨? 准备入手iphone的朋友都怕会买到山寨的iphone吧.现在来说几个最基本的鉴别方法:山寨的后盖可以轻易打开.sim卡在机后面,可以插内存,有内置收音机,可以轻易换手机电池,当然.我的意思是.真的iphone这些都不可以....?
关键词:翻新机? 相信各位买iphone最担心的还是买到翻新机吧,这里教大家几招.??非翻新机特点:三码合一(一定会有人问什么是三码合一了吧?就是说卡托.-装sim卡的地方??机器里??设置-通用-关于本机-序列号??iphone盒子下面.??这三个地方的号码一样,就说明不是翻新机.另外还有一码.是电子fapiao上的..除了8797威尼斯老品牌官网买的外.这一码是没有的.这个无关紧要.另外有些朋友问盒子下面的码对不上,这个是有可能的,但绝非翻新,因为有些商家从香港带过来盒子乱了...但如果机器和卡托的不一样,,,那就不好意思了..翻新机.!! 另外还可以看iphone的金属边,新机是不会有刮痕的. 还可以看我刚刚说的那个序列号. 像我的序列号是8281781ny7h.从左往由数第3位是生产年4.5位是星期.我的序列号就可以看出,我的机是08年17周生产,大家可以以此推算是否翻新.说一句.1代市面上没有全新的了.全是翻新和二手,2代也快断产了.最后,大家买手机总得看价格吧.?便宜没好货.? 关键词8827? 上节说到序列号.现在说的这个88827就是表示序列号的前5位.88827的机一般是一些商家为了暴利.将美版iphone通过程序修改成港版,使机器能被itunes识别成港版..现在88827的机一般存在于2代iphone中.大家买2代的时候一定要擦亮眼睛...? 关键词:版本? iphone的众多版本使得iphone价钱不一.这里面的差价高达1000.我把各种版本发上来供大家参考市面上最多的美版编号:? mb046ll/a ,mb048ll/a ,mb499ll/a ,mb702ll/a ,mb704ll/a ,mb705ll/a apple官方无锁版编码:? 香港/澳门行货: mb489zp/a mb496zp/a mb500zp/a? 新西兰vodafone: mb489x/a mb496x/a mb500x/a? 新加坡行货: mb489za/a mb496za/a mb500za/a? 意大利tim/vodafone:mb489t/a mb496t/a mb500t/a? 捷克行货: mb489cz/a mb496cz/a mb500cz/a? mb490cz/a mb497cz/a mb501cz/a? 希腊行货: mb489gr/a mb496gr/a mb500gr/a? 卢森堡行货: mb489nf/a mb496nf/a mb500nf/a? 俄罗斯行货: mb489rs/a mb496rs/a mb500rs/a? 南非行货: mb489so/a mb496so/a mb500so/a? 有些朋友不知道怎么查看自己手机的型号? ? 设置-通用-关于本机-型号? 关键词:有锁.无锁? 大家一定奇怪为什么有锁无锁版本差价会这么大..原因就是有锁的不可以随便升级固件.无锁的可以随便升级,如果你还不明白.那我简单点说,意思就是如果要升级..无锁可能只用几分钟.而有锁就要半个小时..很是折腾...? 关键词:刷固件(有锁版慎重)? 论坛里很多朋友都是第一次用iphone.不知道拿到iphone后如何升级固件.我来说下基本步骤??下载要升级的固件-打开itunes按住shift鼠标点恢复-选取固件-激活(连接itunes按提示操作)? ? 有锁版的一定要控制好自己的手,不要随便按更新和恢复。? 关键词:越狱? 港版的可以不越狱(但你就得忍受软件收费制).但美版一定要越.??越狱有什么好处.?这是大家会问的.越狱后,你就可以下载免费软件...就可以随心所欲.当然.一部分人用无锁的会不考虑越狱.这属个人喜好,不予讨论.越狱的前提是刷了固件..另外有些朋友不清楚自己是否越狱...最简单的方法..安装91手机助手.看能不能识别iphone.提示!!!!越狱后的机器不可以按恢复原厂设置。。 关键词:越狱.激活? 很多朋友会把这两个名词混为一谈.我来作下解释..激活,是指激活iphone.使iphone可以使用sim卡.越狱.是为了安装免费游戏软件所要做的...? 关键词:91手机助手.itunes.? 很多朋友也会混淆这两个.会问安装哪个好..如果你是新手的话.我建议你两个都安装,不过91手机助手需越狱才可以使用..重要提醒!!!!!!!itunes连接iphone后.请取消??自动同步.??不然你会发现一连接就少很多东西的.? 关键词:配件.? 买了这么好的iphone.大家肯定会买点配件来保护它.现在我来以过来人的身份推荐几款. arm的膜.solo的保护套.??严重提醒!!!!别买磨砂膜.防指纹膜.它会使屏幕不清晰.??还有aj的壳.也千万别买...又贵又差..? 关键词:装机必备.? iphone拿到了.?迫不及待想装点东西了吧.?在这里给你推荐几款.??蓝牙 qq 进程管理 关机助手??来电秀 飞信??熊猫防火q1ang 专业万年历 金山词霸 cycorder??uc浏览器? 关键词:省电诀窍.? 有些朋友会发现电用的飞快.有时待机一个晚上电就没了.其实是你开了没必要而又费电的东西??设置-wifi-关闭??设置-邮件-获取新数据-关闭??设置-通用-定位服务-关闭??设置-通用-蓝牙-关闭??设置-亮度-自动亮度调节-关闭??另外 每个月至少保证一次电循环??电循环:指把手机电用到自动关机.再连续冲6-8个小时..另外很多朋友会问刚买回来的iphone第一次充电要充多久,这里再重申一遍:充满就行。充多了对iphone电池有害。? 关键词:显歌词.? 一些朋友喜欢边听歌边看歌词..在这里介绍个软件:青苹果??可以从里面下歌.然后传入itunes.再传入iphone.? 关键词:白苹果.8。24更新? 白苹果,是用iphone的最忌讳的一个名词了。。呵呵。 白苹果的意思就是开机时停在白苹果界面无法进入。属于软件冲突造成手机无法正常使用,一般解决方法就是用91手机助手里的工具看能不能修复。不能就只有刷机了。? 关键词:2g。3g。4g。8g。16g.? 很多新手会把这几个数字混淆。。这里来做个解释。2g和3g分别代表iphone的版本2g为我们常说的一代。3g呢就是2代。。当然不能依次类推说3代就是4g。?呵呵。3代叫3gs。。关于4g。8g16g。为iphone的容量。目前1代有的是4g和8g。2代有的就是8g和16g。。注意!!!有些朋友说自己买的iphone只有内存只有2g。。那不好意思。恭喜了。买到山寨了。? 关键词:购买iphone渠道。.? 有些新手准备买iphone。但是又不知道什么途径买最便宜,这里给您推荐下。如果你不嫌时间久。可以选择8797威尼斯老品牌官网买。用信用卡刷,因为这是目前最便宜的途径,如果买现货,都会贵上几百上千。iphone香港8797威尼斯老品牌官网: apple /hk。? 关键词:上网.8。25更新。? 今天发现一个新问题。很多iphone新手不知道如何上网,这里告诉下,设置-通用-网络-蜂窝数据网apn填cmnet??其他不填, 又有新问题来了。很多人又会问,怎么开通了gprs还收了流量的钱。就像这个帖 forum.iphone /showtopic-1250.aspx? ? 这里再次作下解释。因为有些人开通的gprs只包含cmwap。而iphone一般是cmnet上网的,自然会收钱。。有人会问那就没办法了吗。有。。肯定有拉。有你们伟大的版主在,有什么问题不能解决,?呵呵。开个玩笑。我发了破解cmwap的压缩文件在下面,有兴趣的去下载吧。?
关键词:iphone的所有配件。.? 今天又看到一个帖子说自己的数据线坏了,想买条,呵呵,这里告诉大家,iphone里所有配件都是很贵的,丢了或坏了都是买不到正品的,网上那些全是国内生产的货色,iphone原装耳机大概是220rmb。 数据线180rmb,充电器300。在这里请大家爱惜自己的原装配件。。。!!? 关键词:iphone邮件推送功能。.8。26更新? 有些朋友会发现可以打出电话,但别人打过来却是 你拨打的电话暂时无法接通。是因为你开了邮件推送功能,如果你不信你现在可以把推送打开然后打电话。。解决的办法就是把推送关闭或者改为手动。? 关键词:itunes帐号注册.? 我前面说到itunes里有付费软件下载。当然也有免费。具体的方法我现在发上,? 1.首先确定你的电脑中安装了itunes,8.0以上版本,我不知道其他版本可不可以,本人是v8.0。打开itunes,单击itunes store出现未登录的8797威尼斯老品牌主页,拉到最后,“my store:”选择“china”,再选择“top free apps”下的任意一个apps,我点的是webmessenger,其他的都一样。? 2.然后点击“get app”? 3.再选择“创建新帐户”? 4.出现“欢迎光临itunes 商店”,点击“continue”后继续,? 4.出现“itunes store terms 使用条款”的欢迎界面,先看条款,同意后选择“我已经阅读并同意此条款”,不同意选择“cancel”,当然你一定要同意,要不写这文章还有什么用呢?后点击,再点击“continue”继续? 6.之后出现“create itunes store account(apple id)”,填写你的邮件地址,你的密码,重复你的密码,安全问题,回答安全问题,你的生日等,但是不能有中文,完了后选择“continue”? 7.出现“provide a payment method”页面。注意:“payment method”选择“none”,这样才能免费下载app程序及其他的资料。还要注意,填写账号信息时,不能有中文字符。? surname 和 first name??这2项随意填,只要任意英文字母就可以了? address(地址):填写任意数字 空格 再任意英文字母 如:888 jiikj? city(城市): beijin? ? 你也可以写 shanghai? postcode(邮政编码): 100032??这个也可随意 如:100011 只要是6位数字就行? province(省份): 城市那里填写了beijin ,此处可以怱略不填? phone(电话): 前面写 010 后面填写任意7位数字??如:1234567? 大家可以看到,“country”一行,出现“china”,接着点击“continue”? 8.出现了“verify you account”画面,表示已经注册ok了,点击“done”? 9.ok,现在打开你注册时的邮箱,你已经收到由“itunes store (
还没有评论,来说两句吧...