IOS開発者向けメモ:エクスペリエンスの共有、パート1

画像 こんにちは、Habrの親愛なる読者!



iOSおよびMac OS用のアプリケーションを開発しています。 私は約1年間フリーランスに携わっており、クライアントからクライアントに移り、問題を一度理解したことに気付き始めました。 そして、同様の注文が表示される場合、私は単に以前に開発されたモジュールを使用します。 「Notes iOS developer」という一連の記事で、注文でよく見られるいくつかの側面を強調してみます。 新しい技術をプロジェクトにすばやく簡単に導入できる、ある種のチートシートを読みます。 私のメモはプロセスを深く理解しているふりをするものではありませんが、時間通りに注文を完了する簡単な方法を説明しています。



内容:



  1. パート1:ファイルの操作。 シングルトンテンプレート。 オーディオを操作します。 ビデオを操作します。 アプリ内購入
  2. パート2:独自のポップアップ。 Navigation Controllerでモーダルセグエを使用する方法。 コアグラフィックス UIWebViewおよびScrollViewを使用する
  3. パート3:自動レイアウトのない生活。 スプラッシュスクリーン iOS 6以降でデバイスの向きを操作します。 UITextFieldコンテンツシフト
  4. パート4:Google Analytics; プッシュ通知 PSPDFKit; Facebook経由でアプリケーションにログインします。 友達に知らせる-Facebook、Twitter、メール
  5. パート5:コアデータ。 UITableViewおよびUICollectionView


ファイルを操作する



多くの初心者iOS開発者は、アプリケーションがシミュレータで正しく動作するが、実際のデバイスでは動作を拒否するか正しく動作しないという問題に出くわします。 考えられる問題の1つは、アプリケーションのドキュメントフォルダーに転送されないファイルリソースをアプリケーションが積極的に使用することです。 Appleのポリシーは次のとおりです。アプリケーションファイルは変更できません。 楽しむ唯一の場所はドキュメントフォルダーです。 (アプリケーション内の)どこからでも読むことができますが、ドキュメントフォルダーにのみ書き込むことができます。

したがって、最初の起動時には、すべてのドキュメントをドキュメントフォルダーに書き込むために転送する必要があります。 簡単! Config.hファイルの作成から始めましょう。Your_App_Name-Prefix.pchに次の行を追加します(このファイルはプロジェクト内のすべてのファイルに自動的に追加されます)。



#import "Config.h"
      
      





いいね! Config.hのすべてがプロジェクト全体に含まれるようになりました! このファイルに記入しましょう:



 #define pathToApplicationDirectory [[NSBundle mainBundle] bundlePath] //     #define pathToDocuments [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] //    #define pathToSettings [[pathToDocuments URLByAppendingPathComponent:@"settings.plist"] path] //     #define pathToPopups [[NSBundle mainBundle] pathForResource:@"popups" ofType:@"plist"] //      
      
      





これらはすべて、将来の利便性のためにのみ行われます(ファイルを頻繁に処理しますが、魔法の行を削除することをお勧めします)。

これで、ドキュメントフォルダーへのファイルのコピーを開始できます。 settings.plistおよびpopups.plistファイルは頻繁に変更されるため、コピー項目が必要です。 次のコードをアプリケーションに追加します:didFinishLaunchingWithOptions:



 //  ,   ,      ! [self placeResourcesToDocumentsDirectory:@{ @"settings" : @"plist", @"popups" : @"plist"}];
      
      





そして、もちろん、 placeResourcesToDocumentsDirectoryメソッド自体:



押して!
 /*! ,         /param     */ - (void)placeResourcesToDocumentsDirectory:(NSDictionary *)resources { //    ,    if (![[NSFileManager defaultManager] fileExistsAtPath:pathToSettings) { for (NSString *fileName in [resources allKeys]) { NSString *extension = resources[fileName]; NSURL *storeURL = [pathToDocuments URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", fileName, extension]]; NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:fileName ofType:extension]]; NSError *error = nil; [[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&error]; } } }
      
      





以上です! ファイルを目的のフォルダーに移動するのはどれだけ簡単でしたか? そして、ファイルにアクセスして、次のように操作できます。



 NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithContentsOfFile:pathToSettings]; settings[@"isThisAppCool"] = @YES; [settings writeToFile:pathToSettings atomically:YES];
      
      





シングルトンテンプレート



それはかなり小さな断片であり、独身者との作業を容易にします。

Singleton.h



押して!
 <...> //     #define coolSingleton [Singleton sharedSingleton] @interface Singleton : NSObject + (Singleton *)sharedSingleton; <...>
      
      





Singleton.m



押して!
 <...> @implementation Singleton + (Singleton *)sharedSingleton { static Singleton *sharedSingleton = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedSingleton = [[self alloc] init]; }); return sharedSingleton; } <...>
      
      





ここではすべてが簡単です。 最初に、シングルトンでの作業を1つの定義で単純化しました。 次に、Singletonクラスの静的オブジェクトが1つあります。 第三に、 sharedSingletonクラスメソッドを呼び出すことにより、既存のオブジェクトを取得するか、新しいオブジェクトを初期化します。 シングルトンオブジェクトは常に1つだけです。 4番目に、シングルトンはスレッドセーフです(ヒントについてはdanilNikAndrewShmigに感謝します!)。



オーディオを操作する



ここでは、AVFoundationフレームワークのAVAudioPlayerクラスを操作する必要があります。 操作の原理は簡単です。特定のファイルの名前でAVAudioPlayerクラスのオブジェクトを作成し、再生の準備をし、必要に応じて起動します。 すべてのオーディオプレーヤーを含む単純なシングルトンを作成しましょう。 2つのオーディオプレーヤーがあります。1つはバックグラウンドミュージック用で、もう1つはボタンクリックのサウンドを再生するためのものです。



SimpleAudioPlayer.hを見てください



押して!
 #import <Foundation/Foundation.h> #import <AVFoundation/AVFoundation.h> #define audioPlayer [SimpleAudioPlayer sharedAudioPlayer] @interface SimpleAudioPlayer : NSObject @property (nonatomic, retain) AVAudioPlayer *backgroundMusicPlayer; @property (nonatomic, retain) AVAudioPlayer *buttonSoundPlayer; + (SimpleAudioPlayer *)sharedAudioPlayer; @end
      
      





そしてSimpleAudioPlayer.mで



押して!
 #import "SimpleAudioPlayer.h" @implementation SimpleAudioPlayer static SimpleAudioPlayer *sharedAudioPlayer; + (SimpleAudioPlayer *)sharedAudioPlayer { static SimpleAudioPlayer *sharedAudioPlayer = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedAudioPlayer = [[self alloc] init]; }); return sharedAudioPlayer; } - (id)init { self = [super init]; if (self) { [self initAudioPlayers]; } return self; } /*! ,   */ - (void)initAudioPlayers { NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:pathToBackgroundAudio]; self.backgroundMusicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil]; [self.backgroundMusicPlayer prepareToPlay]; self.backgroundMusicPlayer.numberOfLoops = -1; fileURL = [[NSURL alloc] initFileURLWithPath:pathToButtonAudio]; self.buttonSoundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil]; [self.buttonSoundPlayer prepareToPlay]; }
      
      





以上です。 オーディオファイルへのパスの定義はConfig.hに記述できます。 バックグラウンドミュージックの繰り返し回数に負の数を指定したことは注目に値します。 このプロパティに負の数を設定すると、オーディオファイルは無限に繰り返されます。 必要なもの! また、 prepareToPlayメソッドも忘れないでください。アプリケーションの起動直後にすべてのオーディオプレーヤーを準備する場合、オーディオファイルの最初の再生までにわずかな遅延はありません。 そして、次のようにオーディオプレーヤーを使用できます。



 [audioPlayer.backgroundMusicPlayer play]; <...> [audioPlayer.backgroundMusicPlayer stop];
      
      





ビデオで作業する



MediaPlayerフレームワークを少し使ってみましょう。 実際、次のコードをviewDidAppearメソッドに追加することもできます。



 NSURL *url = [[NSURL alloc] initFileURLWithPath:pathToMovie]; MPMoviePlayerViewController *movieController = [[MPMoviePlayerViewController alloc] initWithContentURL:url]; [self presentMoviePlayerViewControllerAnimated:movieController]; [movieController.moviePlayer play];
      
      





このコードは、指定されたURLのビデオファイルを表示するだけです。 Appleのビデオプレーヤーには、ビデオプレーヤーを閉じるために必要なすべてのボタンが既にあります。 したがって、上記の4行は、アプリケーションにビデオを組み込むための最小文字セットです。



アプリ内購入



さて、今日で最も興味深いのは、StoreKitフレームワークです! 確かに 、彼とは直接やり取りするのではなく、 MKStoreKitやり取りします。 すばらしいフレームワークを提供してくれたMugunthKumarに感謝します!



簡単です。MKStoreKitConfigs.plistファイルを必要に応じて編集し(すべてがそこに直観的です)、次のコードを使用して購入を確認します。



 if ([MKStoreManager isFeaturePurchased:@"me.identifier.coolapp.somesinglefeature"]) { //     !    ! } if ([MKStoreManager isSubscriptionActive:@"me.identifier.coolapp.somesubscription"]) { // !      , , !     ,     }
      
      





購入するには、次を使用します。



 [[MKStoreManager sharedManager] buyFeature:@"me.identifier.coolapp.somesinglefeature" onComplete:^(NSString* purchasedFeature, NSData* purchasedReceipt, NSArray* availableDownloads) { NSLog(@" : %@", purchasedFeature); } onCancelled:^ { NSLog(@"   :( ."); }];
      
      





おわりに



今日は以上です。 このパートは試験的なものでした。次の記事では、例をより興味深いものと考えます。 たとえば、ポップアップウィンドウを作成して、クライアントが参加せずに.xibファイルでその動作を直接変更できるようにする方法。



私のハブセンターで記事のすべての誤りと不正確について書いてください。



PSあなたが私と協力したいなら、私のプロフィールは主要なフリーランサー交換の 1つにあります。



一連の記事「Notes iOS developer」を継続する必要がありますか? コメントで意見を述べてください。



All Articles