- 浏览: 3515515 次
- 性别:
- 来自: 大连
博客专栏
-
使用Titanium Mo...
浏览量:37509
-
Cordova 3.x入门...
浏览量:604425
-
常用Java开源Libra...
浏览量:678233
-
搭建 CentOS 6 服...
浏览量:87357
-
Spring Boot 入...
浏览量:399894
-
基于Spring Secu...
浏览量:69092
-
MQTT入门
浏览量:90534
文章分类
最新评论
-
afateg:
阿里云的图是怎么画出来的?用什么工具?
各云服务平台的架构图 -
cbn_1992:
博主,采用jdbctoken也就是数据库形式之后,反复点击获取 ...
Spring Security OAuth2 Provider 之 数据库存储 -
ipodao:
写的很是清楚了,我找到一份中文协议:https://mcxia ...
MQTT入门(6)- 主题Topics -
Cavani_cc:
还行
MQTT入门(6)- 主题Topics -
fexiong:
博主,能否提供完整源码用于学习?邮箱:2199611997@q ...
TensorFlow 之 构建人物识别系统
使用Titanium来开发iPhone应用,不使用Object-C而是使用JavaScript,这看起来是不可思议的事情,那么Titanium又是如何来执行JavaScript文件的呢?我们来跟踪一下自应用启动开始到执行到入口js(app.js)的TItanium代码吧!
要跟踪代码的前提是需要有生成好的代码,所以我们需要新建一个Titanium工程,然后编译生成iPhone代码。编译后在/build/iphone/下就能够找到源代码了。
由于版本的不一样,编译出来的代码有可能也不一样,我使用的版本是1.7.1。而且,代码有可能会很长,在一些地方我会省去没有关系的代码。
1、/build/iphone/main.m
这里从代码UIApplicationMain(argc, argv, nil, @"TiApp")可以看出来我们需要进一步进入到TiApp.mm中查看代码。
TiApp是应用在启动的时候被调用的,所以继续看application:didFinishLaunchingWithOptions方法。
2、/build/iphone/Classes/TiApp.mm
这里可以看出是通过[self boot]来启动的,所以继续看[self boot]。
3、/build/iphone/Classes/TiApp.mm
注意这里的代码[kjsBridge boot:self url:nil preload:nil];
kjsBridge是KrollBridge类的变量,所以继续查看KrollBridge的boot方法。
4、/build/iphone/Classes/KrollBridge.mm
继续查看[context start];。
5、/build/iphone/Classes/KrollContext.mm
继续查看通过@selector(main)指定的方法。
6、/build/iphone/Classes/KrollContext.mm
继续查看[delegate performSelector:@selector(didStartNewContext:) withObject:self]。关于KrollBridge的boot的delegate、是通过以下方法的context.delegate设定的内容:
7、/build/iphone/Classes/KrollBridge.mm
self类型就是KrollBridge类,继续查看KrollBridge的didStartNewContext方法。
8、/build/iphone/Classes/KrollBridge.mm
在这里读入app.js文件。
继续看[self evalFile:[startURL absoluteString] callback:self selector:@selector(booted)] 这段代码。
这里@selector(evalFileOnThread:context:)指定的方法代码如下:
通过TiCheckScriptSyntax对JavaScript的语法进行验证,然后利用TiEvalScript来执行JavaScript代码。
TiEvalScript是在/build/iphone/headers/TiCore/TiBase.h中定义的。
JS_EXPORT是下边这样的,通过共享Library读入的。
9、/build/iphone/headers/TiCore/TiBase.h
关于TiEvalScript的代码在/build/iphone下不存在、查找https://github.com/appcelerator/titanium_mobile 之后,在
titanium_mobile/iphone/SConstruct 中有如下的说明:
http://github.com/appcelerator/tijscore 里有实际的源代码。
10、/TiCore/API/TiBase.cpp
在tijscore的README中,有如下的说明,可见Titanium Mobile对于JavaScript的执行使用了WebKit的KJS。
****传统上,WebKit包含一个网页引擎WebCore和一个脚本引擎JavaScriptCore,它们分别对应的是KDE的KHTML和KJS。
代码很长,大家慢慢消化吧!
要跟踪代码的前提是需要有生成好的代码,所以我们需要新建一个Titanium工程,然后编译生成iPhone代码。编译后在/build/iphone/下就能够找到源代码了。
由于版本的不一样,编译出来的代码有可能也不一样,我使用的版本是1.7.1。而且,代码有可能会很长,在一些地方我会省去没有关系的代码。
1、/build/iphone/main.m
25:int main(int argc, char *argv[]) { 26: NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 27: 28:#ifdef __LOG__ID__ 29: NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 30: NSString *documentsDirectory = [paths objectAtIndex:0]; 31: NSString *logPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%s.log",STRING(__LOG__ID__)]]; 32: freopen([logPath cStringUsingEncoding:NSUTF8StringEncoding],"w+",stderr); 33: fprintf(stderr,"[INFO] Application started\n"); 34:#endif 35: 36: int retVal = UIApplicationMain(argc, argv, nil, @"TiApp"); 37: [pool release]; 38: return retVal; 39:}
这里从代码UIApplicationMain(argc, argv, nil, @"TiApp")可以看出来我们需要进一步进入到TiApp.mm中查看代码。
TiApp是应用在启动的时候被调用的,所以继续看application:didFinishLaunchingWithOptions方法。
2、/build/iphone/Classes/TiApp.mm
350:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions_ 351:{ 352: started = [NSDate timeIntervalSinceReferenceDate]; 353: NSSetUncaughtExceptionHandler(&MyUncaughtExceptionHandler); 354: 355: // nibless window 356: window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 357: 358: [self initController]; 359: (省略) 384: if (notification!=nil) 385: { 386: [self generateNotification:notification]; 387: } 388: 389: [self boot]; 390: 391: return YES; 392:}
这里可以看出是通过[self boot]来启动的,所以继续看[self boot]。
3、/build/iphone/Classes/TiApp.mm
281:- (void)boot 282:{ 283: NSLog(@"[INFO] %@/%@ (%s.1293a6d)",TI_APPLICATION_NAME,TI_APPLICATION_VERSION,TI_VERSION_STR); 284: 285: sessionId = [[TiUtils createUUID] retain]; 286: TITANIUM_VERSION = [[NSString stringWithCString:TI_VERSION_STR encoding:NSUTF8StringEncoding] retain]; 287: 288: NSString *filePath = [[NSBundle mainBundle] pathForResource:@"debugger" ofType:@"plist"]; 289: if (filePath != nil) { 290: NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; 291: NSString *host = [params objectForKey:@"host"]; 292: NSString *port = [params objectForKey:@"port"]; 293: if (host != nil && ![host isEqual:@""] && ![host isEqual:@"__DEBUGGER_HOST__"]) 294: { 295: [self setDebugMode:YES]; 296: TiDebuggerStart(host,[port intValue]); 297: } 298: } 299: 300: kjsBridge = [[KrollBridge alloc] initWithHost:self]; 301: 302: [kjsBridge boot:self url:nil preload:nil]; 303:#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 304: if ([TiUtils isIOS4OrGreater]) 305: { 306: [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 307: } 308:#endif 309:}
注意这里的代码[kjsBridge boot:self url:nil preload:nil];
kjsBridge是KrollBridge类的变量,所以继续查看KrollBridge的boot方法。
4、/build/iphone/Classes/KrollBridge.mm
315:- (void)boot:(id)callback url:(NSURL*)url_ preload:(NSDictionary*)preload_ 316:{ 317: preload = [preload_ retain]; 318: [super boot:callback url:url_ preload:preload_]; 319: context = [[KrollContext alloc] init]; 320: context.delegate = self; 321: [context start]; 322:}
继续查看[context start];。
5、/build/iphone/Classes/KrollContext.mm
747:-(void)start 748:{ 749: if (stopped!=YES) 750: { 751: @throw [NSException exceptionWithName:@"org.test3.kroll" 752: reason:@"already started" 753: userInfo:nil]; 754: } 755: stopped = NO; 756: [NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil]; 757:}
继续查看通过@selector(main)指定的方法。
6、/build/iphone/Classes/KrollContext.mm
942:-(void)main 943:{ 944: NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 945: [[NSThread currentThread] setName:[self threadName]]; 946: pthread_rwlock_rdlock(&KrollGarbageCollectionLock); 947:// context = TiGlobalContextCreateInGroup([TiApp contextGroup],NULL); 948: context = TiGlobalContextCreate(NULL); 949: TiObjectRef globalRef = TiContextGetGlobalObject(context); 950: 951: 952: // TODO: We might want to be smarter than this, and do some KVO on the delegate's 953: // 'debugMode' property or something... and start/stop the debugger as necessary. 954: if ([[self delegate] shouldDebugContext]) { 955: debugger = TiDebuggerCreate(self,globalRef); 956: } (省略) 1042: loopCount = 0; 1043: #define GC_LOOP_COUNT 5 1044: 1045: if (delegate!=nil && [delegate respondsToSelector:@selector(didStartNewContext:)]) 1046: { 1047: [delegate performSelector:@selector(didStartNewContext:) withObject:self]; 1048: } 1049: pthread_rwlock_unlock(&KrollGarbageCollectionLock); 1050: 1051: BOOL exit_after_flush = NO;
继续查看[delegate performSelector:@selector(didStartNewContext:) withObject:self]。关于KrollBridge的boot的delegate、是通过以下方法的context.delegate设定的内容:
7、/build/iphone/Classes/KrollBridge.mm
315:- (void)boot:(id)callback url:(NSURL*)url_ preload:(NSDictionary*)preload_ 316:{ 317: preload = [preload_ retain]; 318: [super boot:callback url:url_ preload:preload_]; 319: context = [[KrollContext alloc] init]; 320: context.delegate = self; 321: [context start]; 322:}
self类型就是KrollBridge类,继续查看KrollBridge的didStartNewContext方法。
8、/build/iphone/Classes/KrollBridge.mm
523:-(void)didStartNewContext:(KrollContext*)kroll 524:{ 525: // create test3 global object 526: NSString *basePath = (url==nil) ? [TiHost resourcePath] : [[[url path] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"."]; 527: _test3 = [[test3Object alloc] initWithContext:kroll host:host context:self baseURL:[NSURL fileURLWithPath:basePath]]; (省略) 563: else 564: { 565: // now load the app.js file and get started 566: NSURL *startURL = [host startURL]; 567: [self injectPatches]; 568: [self evalFile:[startURL absoluteString] callback:self selector:@selector(booted)]; 569: } 570:}
在这里读入app.js文件。
继续看[self evalFile:[startURL absoluteString] callback:self selector:@selector(booted)] 这段代码。
437:- (void)evalFile:(NSString*)path callback:(id)callback selector:(SEL)selector 438:{ 439: [context invokeOnThread:self method:@selector(evalFileOnThread:context:) withObject:path callback:callback selector:selector]; 440:}
这里@selector(evalFileOnThread:context:)指定的方法代码如下:
346:- (void)evalFileOnThread:(NSString*)path context:(KrollContext*)context_ 347:{ 348: NSError *error = nil; 349: TiValueRef exception = NULL; 350: 351: TiContextRef jsContext = [context_ context]; (省略) 395: const char *urlCString = [[url_ absoluteString] UTF8String]; 396: 397: TiStringRef jsCode = TiStringCreateWithCFString((CFStringRef) jcode); 398: TiStringRef jsURL = TiStringCreateWithUTF8CString(urlCString); 399: 400: // validate script 401: // TODO: we do not need to do this in production app 402: if (!TiCheckScriptSyntax(jsContext,jsCode,jsURL,1,&exception)) 403: { 404: id excm = [KrollObject toID:context value:exception]; 405: NSLog(@"[ERROR] Syntax Error = %@",[TiUtils exceptionMessage:excm]); 406: [self scriptError:[TiUtils exceptionMessage:excm]]; 407: } 408: 409: // only continue if we don't have any exceptions from above 410: if (exception == NULL) 411: { 412: if ([[self host] debugMode]) { 413: TiDebuggerBeginScript(context_,urlCString); 414: } 415: 416: TiEvalScript(jsContext, jsCode, NULL, jsURL, 1, &exception); 417: 418: if ([[self host] debugMode]) { 419: TiDebuggerEndScript(context_); 420: } 421: 422: if (exception!=NULL) 423: { 424: id excm = [KrollObject toID:context value:exception]; 425: NSLog(@"[ERROR] Script Error = %@.",[TiUtils exceptionMessage:excm]); 426: [self scriptError:[TiUtils exceptionMessage:excm]]; 427: } 428: else { 429: evaluationError = NO; 430: }
通过TiCheckScriptSyntax对JavaScript的语法进行验证,然后利用TiEvalScript来执行JavaScript代码。
TiEvalScript是在/build/iphone/headers/TiCore/TiBase.h中定义的。
105:/* Script Evaluation */ 106: 107:/*! 108:@function TiEvalScript 109:@abstract Evaluates a string of Ti. 110:@param ctx The execution context to use. 111:@param script A TiString containing the script to evaluate. 112:@param thisObject The object to use as "this," or NULL to use the global object as "this." 113:@param sourceURL A TiString containing a URL for the script's source file. This is only used when reporting exceptions. Pass NULL if you do not care to include source file information in exceptions. 114:@param startingLineNumber An integer value specifying the script's starting line number in the file located at sourceURL. This is only used when reporting exceptions. 115:@param exception A pointer to a TiValueRef in which to store an exception, if any. Pass NULL if you do not care to store an exception. 116:@result The TiValue that results from evaluating script, or NULL if an exception is thrown. 117:*/ 118:JS_EXPORT TiValueRef TiEvalScript(TiContextRef ctx, TiStringRef script, TiObjectRef thisObject, TiStringRef sourceURL, int startingLineNumber, TiValueRef* exception);
JS_EXPORT是下边这样的,通过共享Library读入的。
9、/build/iphone/headers/TiCore/TiBase.h
72:/* Ti symbol exports */ 73: 74:#undef JS_EXPORT 75:#if defined(BUILDING_WX__) 76: #define JS_EXPORT 77:#elif defined(__GNUC__) && !defined(__CC_ARM) && !defined(__ARMCC__) 78: #define JS_EXPORT __attribute__((visibility("default"))) 79:#elif defined(_WIN32_WCE) 80: #if defined(JS_BUILDING_JS) 81: #define JS_EXPORT __declspec(dllexport) 82: #elif defined(JS_IMPORT_JS) 83: #define JS_EXPORT __declspec(dllimport) 84: #else 85: #define JS_EXPORT 86: #endif 87:#elif defined(WIN32) || defined(_WIN32) 88: /* 89: * TODO: Export symbols with JS_EXPORT when using MSVC. 90: * See http://bugs.webkit.org/show_bug.cgi?id=16227 91: */ 92: #if defined(BUILDING_TiCore) || defined(BUILDING_WTF) 93: #define JS_EXPORT __declspec(dllexport) 94: #else 95: #define JS_EXPORT __declspec(dllimport) 96: #endif 97:#else 98: #define JS_EXPORT 99:#endif
关于TiEvalScript的代码在/build/iphone下不存在、查找https://github.com/appcelerator/titanium_mobile 之后,在
titanium_mobile/iphone/SConstruct 中有如下的说明:
引用
10:# NOTE: this is simply a pre-built version of the source at http://github.com/appcelerator/tijscore
11:# since this is so freaking complicated to setup and build in an stable environment, and since
12:# it takes like an hour to build the library, we have, as a convenience, pre-built it from the
13:# exact same source and are providing the pre-compiled versions for i386/arm
11:# since this is so freaking complicated to setup and build in an stable environment, and since
12:# it takes like an hour to build the library, we have, as a convenience, pre-built it from the
13:# exact same source and are providing the pre-compiled versions for i386/arm
http://github.com/appcelerator/tijscore 里有实际的源代码。
10、/TiCore/API/TiBase.cpp
52:TiValueRef TiEvalScript(TiContextRef ctx, TiStringRef script, TiObjectRef thisObject, TiStringRef sourceURL, int startingLineNumber, TiValueRef* exception) 53:{ 54: TiExcState* exec = toJS(ctx); 55: APIEntryShim entryShim(exec); 56: 57: TiObject* jsThisObject = toJS(thisObject); 58: 59: // evaluate sets "this" to the global object if it is NULL 60: TiGlobalObject* globalObject = exec->dynamicGlobalObject(); 61: SourceCode source = makeSource(script->ustring(), sourceURL->ustring(), startingLineNumber); 62: Completion completion = evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), source, jsThisObject); 63: 64: if (completion.complType() == Throw) { 65: if (exception) 66: *exception = toRef(exec, completion.value()); 67: return 0; 68: } 69: 70: if (completion.value()) 71: return toRef(exec, completion.value()); 72: 73: // happens, for example, when the only statement is an empty (';') statement 74: return toRef(exec, jsUndefined()); 75:}
在tijscore的README中,有如下的说明,可见Titanium Mobile对于JavaScript的执行使用了WebKit的KJS。
****传统上,WebKit包含一个网页引擎WebCore和一个脚本引擎JavaScriptCore,它们分别对应的是KDE的KHTML和KJS。
引用
This is a Titanium Mobile fork of WebKit KJS. All changes are made available
under the Apache Public License (version 2).
under the Apache Public License (version 2).
代码很长,大家慢慢消化吧!
发表评论
-
VisualUI for Titanium Studio
2014-01-13 09:02 1487VisualUI for Titanium Studio is ... -
Google Auth (OAuth 2.0) for Titanium
2013-03-19 11:49 2006Google OAuth 2.0 for Titanium i ... -
Appcelerator Titanium: Up and Running
2013-03-19 08:40 46Appcelerator Titanium: Up and R ... -
Titanium SDK/Studio 3.0.0 Beta版发布
2012-11-07 09:36 463Titanium SDK/Studio 3.0.0 Beta版 ... -
Titanium SDK 3.0.0 Developer Preview
2012-10-29 16:15 303Titanium SDK 3.0.0 Developer Pr ... -
Appcelerator Partners With Largest Chinese Software Developer Network
2012-10-29 12:01 225(Marketwire - Oct 19, 2012) -Ap ... -
Titanium 3.0 预定10月份发布
2012-09-27 09:12 733Appcelerator CEO Jeff Haynie和 C ... -
Titanium SDK 2.1.3 RC is released – Support for iOS 6
2012-09-21 13:51 241---以下官方原文--- We understand the ... -
国内Ti开发者Winson的CBMVC框架
2012-08-06 15:55 1206目前关注Titanium的开发 ... -
Titanium的MVC框架"Alloy"的介绍
2012-07-18 14:37 4208Alloy(合金)是Appcelerator公司为Titani ... -
TCAD免费考试延长至7月末
2012-07-17 16:09 327Appcelerator延长这次TCAD免费考试的时间到7月末 ... -
TCAD认证考试
2012-07-13 11:31 2494Appcelerator从7/7开始免费开放TCAD(Tita ... -
【转】Appcelerator Cloud Push Notification in iPhone
2012-07-12 08:49 2704Push Notification in iOS Using ... -
【转】Appcelerator Cloud Push Notification in Android
2012-07-12 08:38 2435What is Push Notification? Push ... -
Appcelerator Titanium: Patterns and Best Practices
2012-07-10 10:58 373Appcelerator Titanium: Patterns ... -
Appceleator Cloud Services使用指南(3) - API Reference V1 (chm版本)
2012-05-28 15:22 1799Appceleator Cloud Services API ... -
Appceleator Cloud Services使用指南(2) - 创建第一个应用
2012-05-24 21:57 1684一步一步的创建一个最简单的,使用了ACS服务的应用。 1、新 ... -
Appceleator Cloud Services使用指南(1) - ACS介绍
2012-05-24 10:19 3205Appceleator Cloud Services( ... -
Titanium Mobile基础教程视频
2012-05-23 10:38 639dotinstall.com提供的一套在线Titanium M ... -
Jeff Haynie在GMIC2012表示应用开发者应注意本土化问题
2012-05-22 16:56 3355月10日-11日,2012全球移 ...
相关推荐
使用 Titanium 3.2 + 为 iOS 扩展 TiUIWebView 模块此模块不支持。用法参见example/app.js 。特征更改滚动速度(相同的 Ti.UI.TableView / Ti.UI.ScrollView) 移除滚动弹跳阴影 (iOS 6) 移除滚动延迟WebView 和 ...
在Appcelerator Titanium中使用iOS 12+ CarPlay框架。 要求 Titanium SDK 7.3.0以上 iOS 12以上 Xcode 10以上 特征 从您的CarPlay实例接收事件 当前特定于CarPlay的用户界面 使用地图模板从CarPlay开始旅程 ...
要从 JavaScript 访问此模块,您需要执行以下操作: var webserver = require("com.0x82.webserver"); The webserver variable is a reference to the Module object. 文档 见。 用法 请参阅 examples/app.js 以...
Titanium的编译器会将您的应用程序代码编译为每个目标移动平台的有效本机可执行文件。 使用JavaScript构建的本机应用程序(无混合功能,无嵌入式WebView) 应用程序经过编译并在本地运行并具有完整的脱机支持 ...
Titanium iOS通知 在Titanium中使用iOS Notifications API(本地,远程,静默和丰富),包括基于Swift的通知扩展!要求7.3.0或更高版本(在GA之前使用appc ti sdk install -b 7_3_X特征 本地通知 远程推送通知 静默...
Appcelerator Titanium中的本机GoogleMaps iOS SDK 概括 Ti.GoogleMaps是一个开源项目,旨在支持Appcelerator的Titanium Mobile中的Google Maps iOS-SDK。 该模块当前支持以下API: 地图检视 注解 瓷砖覆盖 ...
TiXml2Json iOS 模块允许将大型 XML 字符串转换为 JSON 对象的转换卸载到本机代码,从而确保高水平的性能,这是通过 DOM API 在 JavaScript 中无法实现的。构建和安装模块为了构建模块,您必须安装 XCode 和 ...
Android-titanium_mobile.zip,带有javascript的本地ios、android和windows应用程序,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有安全性优势。
精准定时器模块 version 1.2, 2015, jan: open ... 但是,请记住,一旦执行了 Titanium 回调函数,性能就取决于 Javascript 运行时机器,因此取决于函数的复杂性。 保持你的回调函数轻量级,之前加载到内存资源中,比
使用Appcelerator Titanium中的本机Fabric Crashlytics iOS / Android SDK。 支持这项工作 @hansemannn的整个Firebase支持由社区( @hansemannn和@m1ga )开发和维护。 为了保持该项目的正常运行并能够使用最新的...
这是一个适用于 iOS (iPhone/iPad) 的 Titanium Mobile 模块,允许在 Titanium 项目上使用官方 Dropbox SDK 的全部功能。 可以在找到官方 Dropbox SDK。 基本安装说明 请遵循提供的指南。 此外,请遵循以下附加...
要从JavaScript访问此模块,您需要执行以下操作: var tiapprestart = require("info.rborn.tiapprestart"); tiapprestart变量是对Module对象的引用。 用法 tiapprestart.restartApp() 作者 丹尼尔·塔马斯...
使用基于javascript的Titanium Mobile 技术跨平台开发原生iOS和Android 应用培训教程
Titanium 的 iOS UIBezierPath 包装器。安装Git 克隆存储库,解压缩guy.mcdooooo.tibezier-iphone-1.0.0.zip包并将modules/iphone/guy.mcdooooo.tibezier放入项目的modules/iphone文件夹中。 要从 JavaScript 访问此...
ActivityIndicator_Titanium-JS 可在iOS和Android上用于Titanium应用程序的活动指示器用法如何为Titanium应用程序使用ANActivityIndicator。 该示例假定您将文件导入到根文件夹中。 var ANActivityIndicator...
点菜生产密钥:GL31wN1hpgj3eEv1UM53mQqADG1CyBN9 开发密钥:GyBq3og1IDyQzLowsBj2UN2IuucWl7w1 如果您导入自己的钛工作室,则必须在 TiApp 编辑器中添加 ti.cloud 模块。 模块:ti.cloud
这是Titanium Mobile的CoreMotion模块,涵盖了CoreMotion框架的iOS 7+ API。 这是钛合金的地图模块。 请使用报告问题或向我们的寻求帮助! :rocket: 贡献者 请参阅 有兴趣贡献吗? 阅读指南。 建造 cd iphone ...
这是Adjust:trade_mark:的Titanium SDK。 您可以在阅读有关Adjust:trade_mark:的更多信息。 目录 Google Play商店意图 华为Refererer API iOS框架 附加的功能 AppTrackingTransparency框架应用程序跟踪授权包装 ...
cuacfm-ios-appcelerator-iphone IOS应用程序可收听ACoruña的CUAC FM社区广播并从电台播客 该应用程序的屏幕截图
描述tiws是一个非常简单的Titanium模块(iOS / Android),用于创建本地websocket。 也可以将tiws与Socket.IO和Now.js一起使用快速开始得到它 下载最新的分发ZIP文件,并查阅以了解如何安装,或直接使用 : $ gittio...