iOS用のTitaniumモジュールの開発

この記事では、 TitaniumのネイティブiOSモジュールの作成について説明します。 この記事の目的は、Titaniumモジュールを作成するときに基本的なことを示し、必要に応じてTitanium.SDKの基本的な機能を拡張/高速化することを恐れないことです。 モジュールの主なタスクは、ページの上部に画像をオーバーレイしてpdfファイルを保存することです。



そのようなモジュールが必要なのはソースコードだけです。



Titaniumでは、JavaScriptでモバイルアプリケーションを作成できます。 ただし、phonegapとは異なり、html5アプリケーションをWebViewでラップするだけでなく、nodeJSサーバーを起動します。 これはすべて良いことですが、JavaScriptはpdfにはあまり馴染みがありません。 レンダリングには、モバイルサファリがスムーズに進まないpdf.jsがあり、生成には、不十分なドキュメントに加えてメモリの問題があるjspdfがあります。 実際には、大きなファイルがRAMに生成されてから保存されるだけですが、多くの場合、OSはファイルを保存する前にアプリケーションを強制終了します。

そのため、アプリケーションを高速化する比較的単純な方法です。



Titanium SDKを3番目のバージョン以上で使用することになっています。 MacOSにチタンをインストールすると、コンソールで「チタン」コマンドが使用可能になりますが、これは必要なものではありません。 そして、「〜/ライブラリ/アプリケーション\サポート/ Titanium / mobilesdk / osx / [SDKバージョン] /」から「titanium.py」が必要です。 以前にエイリアスを追加していない場合は追加します。



$ cat ~/.bash_profile alias ios_builder="/Users/peinguin/Library/Application\ Support/Titanium/mobilesdk/osx/3.1.3.GA/iphone/builder.py" alias titanium.py="/Users/peinguin/Library/Application\ Support/Titanium/mobilesdk/osx/3.1.3.GA/titanium.py"
      
      





その後、モジュールスケルトンを作成できます。



 $ titanium.py create --platform=iphone --type=module --dir=/Volumes/yanpix_projects --name=pdfsaver --id=ti.pdfsaver
      
      





次のコマンドでモジュールを組み立てることができます:



 $ ./build.py
      
      





しかし、これまでのところ収集するものは何もありません。 手始めに、モジュールの使用方法を概説するのが最善です。 私の場合、マークされたページごとに元のPDFドキュメントとキャンバスがありました。 他の場合には、pdfドキュメントの最初のページのサムネイルが必要でした。



必要な機能を決定したら、「example / app.js」で説明します。



 // TODO: write your module tests here var pdfsaver = require('ti.pdfsaver'); Ti.API.info("module is => " + pdfsaver); var old = Titanium.Filesystem.getFile(Titanium.Filesystem.getTempDirectory(),'test.pdf'); var newpdf = Titanium.Filesystem.getFile(Titanium.Filesystem.getTempDirectory(),'export.pdf'); pdfsaver.saveInExportFileWithDrawings( old.resolve(), newpdf.resolve(), { 1: 'data:image/png;base64,[base64 image representation], 4: 'data:image/png;base64,[base64 image representation]' }, 1 ); var jpeg = Titanium.Filesystem.getFile(Titanium.Filesystem.getTempDirectory(),'export.jpeg'); pdfsaver.saveThumbnail( newpdf.resolve(), jpeg.resolve() );
      
      







アプリケーションで「リソースディレクトリ」を取得できる場合、この場合は、アプリケーションの「Tempディレクトリ」にファイルをドロップすることをお勧めします(〜/ライブラリ/アプリケーションサポート/ iPhoneシミュレータ/ 5.1 /アプリケーション/ [アプリケーションID] / tmp)。



ドキュメントを信じるなら、「TiPdfsaverModuleAssets.h」と「TiPdfsaverModuleAssets.m」は変更しても意味がありません-それらはすべて同じように擦り切れています。 コードは「TiPdfsaverModule.m」で記述し、それに応じて「TiPdfsaverModule.h」で記述します。 これが私の関数のコードです:



 #pragma Public APIs -(void)saveThumbnail:(id)args{ NSString *pdf = [args objectAtIndex:0]; NSString *jpeg = [args objectAtIndex:1]; CFURLRef url = CFURLCreateWithFileSystemPath (NULL, (CFStringRef)pdf, kCFURLPOSIXPathStyle, 0); CGPDFDocumentRef templateDocument = CGPDFDocumentCreateWithURL(url); CFRelease(url); CGPDFPageRef templatePage = CGPDFDocumentGetPage(templateDocument, 1); // get the first page CGRect templatePageBounds = CGPDFPageGetBoxRect(templatePage, kCGPDFCropBox); UIGraphicsBeginImageContext(templatePageBounds.size); CGContextRef contextRef = UIGraphicsGetCurrentContext(); CGContextTranslateCTM(contextRef, 0.0, templatePageBounds.size.height); CGContextScaleCTM(contextRef, 1.0, -1.0); CGContextDrawPDFPage(contextRef, templatePage); UIImage *imageToReturn = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); CGPDFDocumentRelease(templateDocument); [UIImageJPEGRepresentation(imageToReturn, 1.0) writeToFile:jpeg atomically:YES]; } -(void)saveInExportFileWithDrawings:(id)args{ NSString *fresh = [args objectAtIndex:0]; NSString *exportpath = [args objectAtIndex:1]; NSDictionary *drawings = [args objectAtIndex:2]; NSNumber *all = [args objectAtIndex:3]; CFURLRef url = CFURLCreateWithFileSystemPath (NULL, (CFStringRef)fresh, kCFURLPOSIXPathStyle, 0); CGPDFDocumentRef templateDocument = CGPDFDocumentCreateWithURL(url); CFRelease(url); size_t count = CGPDFDocumentGetNumberOfPages(templateDocument); UIGraphicsBeginPDFContextToFile(exportpath, CGRectMake(0, 0, 612, 792), nil); for (int pageNumber = 1; pageNumber <= count; pageNumber++) { id image = [drawings objectForKey:[NSString stringWithFormat:@"%d",pageNumber ]]; if(image == nil && [all boolValue] == NO){ continue; } CGPDFPageRef templatePage = CGPDFDocumentGetPage(templateDocument, pageNumber); CGRect templatePageBounds = CGPDFPageGetBoxRect(templatePage, kCGPDFCropBox); UIGraphicsBeginPDFPageWithInfo(templatePageBounds, nil); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextTranslateCTM(context, 0.0, templatePageBounds.size.height); CGContextScaleCTM(context, 1.0, -1.0); CGContextDrawPDFPage(context, templatePage); CGContextTranslateCTM(context, 0.0, templatePageBounds.size.height); CGContextScaleCTM(context, 1.0, -1.0); if(image != nil){ NSURL *url = [NSURL URLWithString:image]; NSData *imageData = [NSData dataWithContentsOfURL:url]; UIImage *ret = [UIImage imageWithData:imageData]; [ret drawInRect:CGRectMake(0, 0, templatePageBounds.size.width, templatePageBounds.size.height)]; } } CGPDFDocumentRelease(templateDocument); UIGraphicsEndPDFContext(); }
      
      





好きなだけ引数を関数に渡し、「objectAtIndex」を通じて値を取得できます。 または、インデックスを確認してください。 すべてのパラメーターは、参照としてオブジェクトとして渡されます。



今、あなたがする必要があるモジュールの正しい動作をチェックするために:



 $ titanium.py run
      
      





すべてが正しく機能していることを確認します。 「build.py」でビルドし、モジュールのルートにあるzipファイルをプロジェクトのルートに解凍します。 また、プロジェクトの「tiapp.xml」ファイルのタグ「modules」にタグ「module」を追加します。



 <modules> <module platform="iphone">ti.pdfsaver</module> </modules>
      
      





この記事では、基本的なことのみを説明しています。 ViewとProxyについては一言も言われていません。 しかし、これは、顧客がJSで大幅に速度を落とすような何かを求めたときに落ち込んでしまわないようにするのに十分ですが、アプリケーションを最初から書き直すことはすでに認知的です。 JSでは、アプリケーション自体を迅速に開発し、例外をキャッチできますが、アプリケーションを迅速に動作させるにはネイティブコードを使用する価値があります。 やがて、アプリケーションのすべてのコードがObjective-Cに書き換えられ、最終的にTitaniumを完全に放棄する機会が与えられると思います。



All Articles