iOSアプリのテーブルビューにネイティブ広告を表示するサンプル

iOSアプリのテーブルビューにネイティブ広告を表示するサンプルを作成しました。

下記にサンプルを公開していますので、実装の際のお役に立てば幸いです。

サンプルのダウンロード

サンプルの解説

1. ネイティブ広告の表示頻度と最大表示数を定義

まずネイティブ広告をリスト何件毎に表示するかと、画面に最大何個まで表示するかを定義しています。

下記の例では、リスト8件毎にネイティブ広告を表示し、画面に最大2個まで表示するよう指定しています。

1
2
int const NATIVE_ADS_PER  = 8; // ネイティブ広告をリスト何件毎に表示するか
int const NATIVE_ADS_NUM  = 2; // ネイティブ広告を最大何個表示するか

2. ネイティブ広告の表示数によってセルの総数を補正

ネイティブ広告を表示する分だけセルの総数も補正しなければならないので、まず下記の「nativeAdsNumPerScreen」メソッドから画面に表示するネイティブ広告の総数を取得します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 画面に表示するネイティブ広告の数を取得
- (int)nativeAdsNumPerScreen:(NSUInteger)comparisonNum
{
    if (!SHOW_NATIVE_ADS) {
        return 0;
    }

    int const maxDisplayPositionId = NATIVE_ADS_PER * NATIVE_ADS_NUM;
    if (comparisonNum >= maxDisplayPositionId) {
        return NATIVE_ADS_NUM;
    }

    return roundf(comparisonNum / NATIVE_ADS_PER);
}

そして本来のセルの総数にネイティブ広告の数を加え、テーブルビューのセル総数を定義しています。

1
2
3
4
5
// セルの総数を指定
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return CELL_NUM + [self nativeAdsNumPerScreen:CELL_NUM];
}

3. ネイティブ広告を表示するセルの識別子を通常のセルと分けて定義

セルの識別子は通常のセルとネイティブ広告とで分ける必要があります。

まず、下記の「showNativeAdsByIndexId」メソッドにセルのインデックス値を渡し、ネイティブ広告を表示するインデックス位置であるか取得します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// ネイティブ広告を表示するインデックス位置であるか取得
- (BOOL)showNativeAdsByIndexId:(NSUInteger)indexId
{
    if (!SHOW_NATIVE_ADS) {
        return NO;
    }

    NSUInteger const positionId = (indexId + 1);
    int const maxDisplayPositionId = NATIVE_ADS_NUM * NATIVE_ADS_PER;
    if (positionId > maxDisplayPositionId) {
        return NO;
    }

    return positionId % NATIVE_ADS_PER == 0;
}

次に、ネイティブ広告を表示する位置である場合と通常のセルの場合とでセルの識別子を分けます。

1
2
3
4
5
6
7
8
9
10
11
12
// セルの識別子定義
NSString *const CellIdentifier = [NSString stringWithFormat:@"Cell%lu", (unsigned long)index];
NSString *const NativeAdsCellIdentifier = [NSString stringWithFormat:@"NativeAds%lu", (unsigned long)index];

// ネイティブ広告を表示する位置であるか取得し、セルの識別子を渡す
UITableViewCell *cell;
BOOL const isNativeAdsPosition = [self showNativeAdsByIndexId:index];
if (isNativeAdsPosition) {
    cell = [tableView dequeueReusableCellWithIdentifier:NativeAdsCellIdentifier];
} else {
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
}

4. ネイティブ広告のセルと通常のセルとで描画処理を分ける

ネイティブ広告を表示するセルであれば広告を表示し、通常のセルであれば通常のセル内容を表示するよう処理を分けます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (cell == nil) {
    // ネイティブ広告を表示する位置であるか判定
    if (isNativeAdsPosition) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NativeAdsCellIdentifier];

        // TODO: ネイティブ広告表示

    } else {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

        // TODO: 通常のセル表示

    }
}

ここでセルのインデックス値を取得して処理を行う際、そのままの値を使用すると正しく処理できませんので、下記の「correctedIndexId」メソッドに本来のインデックス値を渡し、ネイティブ広告の表示によって生じるインデックス値を補正して受け取る必要があります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// ネイティブ広告の表示によって生じるインデックス補正値を取得
- (int)nativeAdsCorrectionValue:(NSUInteger)indexId
{
    if (!SHOW_NATIVE_ADS) {
        return 0;
    }

    NSUInteger const positionId = (indexId + 1);
    for (int i = NATIVE_ADS_NUM; i > 0; i--) {
        if (positionId > (i * NATIVE_ADS_PER)) {
            return i;
        }
    }

    return 0;
}

ネイティブ広告を表示した分だけインデックス値に誤差が生じるため、通常は下記のようにインデックス値を補正して処理を行います。

1
NSUInteger const corretedIndexId = [self nativeAdsCorrectionValue:index];

5. セルタップ時のイベントを分ける

セルをタップした時のイベントも下記のように分けます。下記の例では、ネイティブ広告の背景がタップされると選択を解除するよう指定しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// セルタップ時のイベント
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // インデックス値の保持
    NSUInteger const index = [indexPath indexAtPosition:[indexPath length] - 1];

    // TODO: ネイティブ広告を表示した分だけインデックス値に誤差が生じるため、通常はこの値を使用して処理を行う
    NSUInteger const corretedIndexId = [self correctedIndexId:index];

    // ネイティブ広告を表示する位置であるか取得し、タップ時の処理を分ける
    BOOL const isNativeAdsPosition = [self showNativeAdsByIndexId:index];
    if (isNativeAdsPosition) {
        // TODO: ネイティブ広告セルの場合の処理

        // ネイティブ広告の背景はタップ禁止のため、セルの選択を解除する必要がある
        [tableView deselectRowAtIndexPath:indexPath animated:YES];

        // デバッグ出力
        NSLog(@"NativeAds");
    } else {
        // TODO: 通常セルの場合の処理

        // デバッグ出力
        NSLog(@"corretedIndexId: %lu", corretedIndexId);
    }
}

以上でテーブルビューへのネイティブ広告の導入は完了です。

まずネイティブ広告を表示する位置であるか判別し、通常のセルの描画を行う際には、ネイティブ広告の表示によって生じるインデックス値の誤差を埋めた補正値を使用して処理を行う点が重要です。

解り辛い説明となりましたが、下記にサンプルソースコードを記載いたしますので、導入の際のご参考になれば幸いです。

サンプルソースコード

ViewController.h

1
2
3
4
5
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

@end

ViewController.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#import "ViewController.h"

@interface ViewController ()

@property UITableView *sampleList; // サンプルリスト

@end

@implementation ViewController

CGFloat    const CELL_HEIGHT     = 80;  // セルの縦幅
NSUInteger const CELL_NUM        = 24;  // セルの総数

int        const NATIVE_ADS_PER  = 8;   // ネイティブ広告をリスト何件毎に表示するか
int        const NATIVE_ADS_NUM  = 2;   // ネイティブ広告を最大何個表示するか
BOOL       const SHOW_NATIVE_ADS = YES; // ネイティブ広告を表示するか

#pragma mark -

- (void)viewDidLoad {
    [super viewDidLoad];

    // サンプルリスト配置
    [self setSampleList];
}

#pragma mark - Sample List

// サンプルリスト配置
- (void)setSampleList
{
    CGFloat const sampleListWidth  = [[UIScreen mainScreen] bounds].size.width;
    CGFloat const sampleListHeight = [[UIScreen mainScreen] bounds].size.height;
    _sampleList = [[UITableView alloc] initWithFrame:CGRectMake(0.0, 0.0, sampleListWidth, sampleListHeight)
                                               style:UITableViewStylePlain];
    _sampleList.delegate        = self;
    _sampleList.dataSource      = self;
    _sampleList.backgroundColor = [UIColor whiteColor];
    _sampleList.separatorStyle  = UITableViewCellSeparatorStyleNone;

    [_sampleList registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
    [self.view addSubview:_sampleList];
}

#pragma mark - Table View

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // インデックス値の保持
    NSUInteger const index = [indexPath indexAtPosition:[indexPath length] - 1];

    // セルの識別子定義
    NSString *const CellIdentifier = [NSString stringWithFormat:@"Cell%lu", (unsigned long)index];
    NSString *const NativeAdsCellIdentifier = [NSString stringWithFormat:@"NativeAds%lu", (unsigned long)index];

    // ネイティブ広告を表示する位置であるか取得し、セルの識別子を渡す
    UITableViewCell *cell;
    BOOL const isNativeAdsPosition = [self showNativeAdsByIndexId:index];
    if (isNativeAdsPosition) {
        cell = [tableView dequeueReusableCellWithIdentifier:NativeAdsCellIdentifier];
    } else {
        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    }

    if (cell == nil) {
        // サンプルラベルの座標と寸法定義
        CGFloat const labelX      = 18;
        CGFloat const labelWidth  = [[UIScreen mainScreen] bounds].size.width - labelX;
        CGFloat const labelHeight = CELL_HEIGHT;

        // ネイティブ広告を表示する位置であるか判定
        if (isNativeAdsPosition) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NativeAdsCellIdentifier];

            // TODO: ネイティブ広告表示
            UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(labelX, 0.0, labelWidth, labelHeight)];
            label.text = @"NativeAds";
            label.textColor = [UIColor blackColor];
            label.textAlignment = NSTextAlignmentLeft;
            label.numberOfLines = 0;
            label.backgroundColor = [UIColor clearColor];
            [cell.contentView addSubview:label];
        } else {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

            // TODO: 通常のセル表示
            UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(labelX, 0.0, labelWidth, labelHeight)];
            label.text = [NSString stringWithFormat:@"List - %lu", [self correctedIndexId:index]];
            label.textColor = [UIColor blackColor];
            label.textAlignment = NSTextAlignmentLeft;
            label.numberOfLines = 0;
            label.backgroundColor = [UIColor clearColor];
            [cell.contentView addSubview:label];
        }
    }

    return cell;
}

// セルタップ時のイベント
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // インデックス値の保持
    NSUInteger const index = [indexPath indexAtPosition:[indexPath length] - 1];

    // TODO: ネイティブ広告を表示した分だけインデックス値に誤差が生じるため、通常はこの値を使用して処理を行う
    NSUInteger const corretedIndexId = [self correctedIndexId:index];

    // ネイティブ広告を表示する位置であるか取得し、タップ時の処理を分ける
    BOOL const isNativeAdsPosition = [self showNativeAdsByIndexId:index];
    if (isNativeAdsPosition) {
        // TODO: ネイティブ広告セルの場合の処理

        // ネイティブ広告の背景はタップ禁止のため、セルの選択を解除する必要がある
        [tableView deselectRowAtIndexPath:indexPath animated:YES];

        // デバッグ出力
        NSLog(@"NativeAds");
    } else {
        // TODO: 通常セルの場合の処理

        // デバッグ出力
        NSLog(@"corretedIndexId: %lu", corretedIndexId);
    }
}

// セルの総数を指定
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSUInteger const cellNum = [self cellNum];

    return cellNum + [self nativeAdsNumPerScreen:cellNum];
}

// セルの総数を返す
- (NSUInteger)cellNum
{
    return CELL_NUM;
}

// セルのセクション数を設定
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

// セル高さを設定
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return CELL_HEIGHT;
}

// セルの背景色指定
- (void)tableView:(UITableView *)tableView  willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.backgroundColor = [UIColor whiteColor];
}

#pragma mark - Native Ads

// ネイティブ広告を表示するインデックス位置であるか取得
- (BOOL)showNativeAdsByIndexId:(NSUInteger)indexId
{
    if (!SHOW_NATIVE_ADS) {
        return NO;
    }

    NSUInteger const positionId = (indexId + 1);
    int const maxDisplayPositionId = NATIVE_ADS_NUM * NATIVE_ADS_PER;
    if (positionId > maxDisplayPositionId) {
        return NO;
    }

    return positionId % NATIVE_ADS_PER == 0;
}

// ネイティブ広告の表示分を補正したインデックス値の取得
- (NSUInteger)correctedIndexId:(NSUInteger)indexId
{
    return indexId - [self nativeAdsCorrectionValue:indexId];
}

// ネイティブ広告の表示によって生じるインデックス補正値を取得
- (int)nativeAdsCorrectionValue:(NSUInteger)indexId
{
    if (!SHOW_NATIVE_ADS) {
        return 0;
    }

    NSUInteger const positionId = (indexId + 1);
    for (int i = NATIVE_ADS_NUM; i > 0; i--) {
        if (positionId > (i * NATIVE_ADS_PER)) {
            return i;
        }
    }

    return 0;
}

// 画面に表示するネイティブ広告の数を取得
- (int)nativeAdsNumPerScreen:(NSUInteger)comparisonNum
{
    if (!SHOW_NATIVE_ADS) {
        return 0;
    }

    int const maxDisplayPositionId = NATIVE_ADS_PER * NATIVE_ADS_NUM;
    if (comparisonNum >= maxDisplayPositionId) {
        return NATIVE_ADS_NUM;
    }

    return roundf(comparisonNum / NATIVE_ADS_PER);
}

@end

関連記事

お薦めの参考書

本気ではじめるiPhoneアプリ作り Xcode 7.x+Swift 2.x対応
iOSアプリ開発をこれから始める方に最もお薦めな一冊です。解り辛い点は図解入りで解説されており、プログラミングの動作の仕組みから詳しく知ることができます。基本から通信処理まで押さえられており、アプリ公開の手順についても解説されています。

iOSアプリに AdMobネイティブ広告を表示するクラスを作成しました

iOSアプリに AdMobネイティブ広告を表示する「DCAdMobNativeAds」クラスを作成しました。

下記よりダウンロード出来ますので、実装の際のお役に立てば幸いです。

ダウンロード

使用方法

A. ネイティブ広告を指定したビューに配置

1
2
3
4
5
6
7
CGFloat const nativeAdsWidth  = [[UIScreen mainScreen] bounds].size.width;
CGFloat const nativeAdsHeight = 80.0;

UIView *nativeAdsView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, nativeAdsWidth, nativeAdsHeight)];
[[DCAdMobNativeAds sharedManager] showNativeAd:self targetView:nativeAdsView
                                         frame:CGRectMake(0.0, 0.0, nativeAdsWidth, nativeAdsHeight)];
[self.view addSubView:nativeAdsView];

B. ネイティブ広告を取得し配置

1
2
3
4
5
6
CGFloat const nativeAdsWidth  = [[UIScreen mainScreen] bounds].size.width;
CGFloat const nativeAdsHeight = 80.0;

UIView *nativeAdsView = [[DCAdMobNativeAds sharedManager] nativeAd:self
                                                             frame:CGRectMake(0.0, 0.0, nativeAdsWidth, nativeAdsHeight)];
[self.view addSubView:nativeAdsView];

ネイティブ広告の寸法について

AdMobネイティブ広告の縦幅は、80dp 以上である必要があります。それ未満のサイズを指定するとエラー取得時のデリゲートメソッドが呼ばれ、広告は表示されません。

横幅の最小値については未検証ですが、ネイティブ広告のユニット作成時にプレビューサイズを指定する際、280dp 以上である必要がありますので、恐らく 280dp が最小値だと思います。

iPhoneは 4-inch/ 4.7-inch/ 5.5-inch で横幅が異なりますので、今回のサンプルでは横幅一杯に指定する方法を取っています。

ネイティブ広告初期化の際、下記のように縦幅 80dp 以上のサイズを指定することで正常に表示されました。

1
2
3
CGSize const nativeAdsSize = CGSizeMake([[UIScreen mainScreen] bounds].size.width, 80.0);
self.nativeExpressAdView = [[GADNativeExpressAdView alloc] initWithAdSize:GADAdSizeFromCGSize(nativeAdsSize)
                                                                       origin:CGPointMake(0.0, 0.0)];

ソースコード

DCAdMobNativeAds.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#import <UIKit/UIKit.h>

@import GoogleMobileAds;

@interface DCAdMobNativeAds : NSObject <GADNativeExpressAdViewDelegate> {
    GADNativeExpressAdView *nativeExpressAdView;
}

#pragma mark - property
@property (nonatomic, strong) GADNativeExpressAdView *nativeExpressAdView;

#pragma mark - public method
+ (id)sharedManager;
- (void)showNativeAd:(UIViewController *)viewController targetView:(UIView *)targetView frame:(CGRect)frame;
- (UIView *)nativeAd:(UIViewController *)viewController frame:(CGRect)frame;

@end

DCAdMobNativeAds.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#import "DCAdMobNativeAds.h"

@implementation DCAdMobNativeAds

@synthesize nativeExpressAdView = nativeExpressAdView;

CGFloat const GAD_NATIVE_UNIT_ID = @"Your Unit ID here";
BOOL    const GAD_TEST_MODE      = YES;

#pragma mark - Shared Manager

static id sharedInstance = nil;

+ (id)sharedManager
{
    @synchronized(self) {
        if (!sharedInstance) {
            sharedInstance = [[self alloc] init];
        }
    }

    return sharedInstance;
}

#pragma mark - public method

- (void)showNativeAd:(UIViewController *)viewController targetView:(UIView *)targetView frame:(CGRect)frame
{
    self.nativeExpressAdView = [[GADNativeExpressAdView alloc] initWithAdSize:GADAdSizeFromCGSize(frame.size)
                                                                       origin:frame.origin];
    self.nativeExpressAdView.adUnitID = GAD_NATIVE_UNIT_ID;
    self.nativeExpressAdView.rootViewController = viewController;
    self.nativeExpressAdView.delegate = self;
    [targetView addSubview:self.nativeExpressAdView];

    GADRequest *request = [GADRequest request];
    if (GAD_TEST_MODE) {
        request.testDevices = @[kGADSimulatorID];
    }
    [self.nativeExpressAdView loadRequest:request];
}

- (UIView *)nativeAd:(UIViewController *)viewController frame:(CGRect)frame
{
    self.nativeExpressAdView = [[GADNativeExpressAdView alloc] initWithAdSize:GADAdSizeFromCGSize(frame.size)
                                                                       origin:frame.origin];
    self.nativeExpressAdView.adUnitID = GAD_NATIVE_UNIT_ID;
    self.nativeExpressAdView.rootViewController = viewController;
    self.nativeExpressAdView.delegate = self;

    GADRequest *request = [GADRequest request];
    if (GAD_TEST_MODE) {
        request.testDevices = @[kGADSimulatorID];
    }
    [self.nativeExpressAdView loadRequest:request];

    return self.nativeExpressAdView;
}

#pragma mark - delegate method

- (void)nativeExpressAdViewDidReceiveAd:(GADNativeExpressAdView *)nativeExpressAdView
{
    //NSLog(@"nativeExpressAdViewDidReceiveAd");
}

- (void)nativeExpressAdView:(GADNativeExpressAdView *)nativeExpressAdView didFailToReceiveAdWithError:(GADRequestError *)error
{
    //NSLog(@"nativeExpressAdView: didFailToReceiveAdWithError");
}

- (void)nativeExpressAdViewWillPresentScreen:(GADNativeExpressAdView *)nativeExpressAdView
{
    //NSLog(@"nativeExpressAdViewWillPresentScreen");
}

- (void)nativeExpressAdViewWillDismissScreen:(GADNativeExpressAdView *)nativeExpressAdView
{
    //NSLog(@"nativeExpressAdViewWillDismissScreen");
}

- (void)nativeExpressAdViewDidDismissScreen:(GADNativeExpressAdView *)nativeExpressAdView
{
    //NSLog(@"nativeExpressAdViewDidDismissScreen");
}

- (void)nativeExpressAdViewWillLeaveApplication:(GADNativeExpressAdView *)nativeExpressAdView
{
    //NSLog(@"nativeExpressAdViewWillLeaveApplication");
}

@end

関連記事

お薦めの参考書

本気ではじめるiPhoneアプリ作り Xcode 7.x+Swift 2.x対応
iOSアプリ開発をこれから始める方に最もお薦めな一冊です。解り辛い点は図解入りで解説されており、プログラミングの動作の仕組みから詳しく知ることができます。基本から通信処理まで押さえられており、アプリ公開の手順についても解説されています。

技術評論社「自律神経を整えるスマホアプリ100選」に掲載いただきました

技術評論社「自律神経を整えるスマホアプリ100選」

技術評論社様より1月22日に発行された「自律神経を整えるスマホアプリ100選」という書籍にて、iPhoneアプリ「リラックス・ヒーリングP 43)」と「望みが叶う!引き寄せの法則アプリP 75)」の両アプリをご紹介いただきました。

全体的にアプリの特長が分かりやすく解説されており、QRコードからストアへのアクセスも容易になっています。他にも実用的なアプリが多数紹介されていますので、ご興味のある方は是非お手にとってご覧ください。

書籍の詳細ページ

掲載アプリ

リラックス・ヒーリング

α波発生に効果的なヒーリング音楽、雨音や森の中の小鳥のさえずりなどのサウンドを聴きながら、リラックスして深い眠りに。勉強や仕事に打ち込む時の集中力アップ目的での活用もできます。

望みが叶う!引き寄せの法則アプリ

「恋愛」「就活」「美容」「復縁」… 1日たったの3分で望みが叶う、あの「引き寄せの法則」を実践できる無料アプリです。豊富なサンプル文を組み合わせて、簡単にあなただけの「望み」を作成。プッシュ通知で引き寄せの「習慣化」ができます。

About

Masaki Hirokawa (@dolice_apps)

デザインエンジニア 廣川政樹の開発ブログ。Objective-Cや Javaなど iPhone/Androidアプリ開発に関する技術情報を掲載しています。

iPhone apps

  • リラックス・ヒーリング(無料)
  • 望みが叶う!引き寄せの法則アプリ(無料)
  • ミステリー - 怖い話や不思議な体験、都市伝説まとめ
  • 浮世絵壁紙 - 美しい日本画ギャラリー(無料)
  • アート壁紙HD(無料)
  • 綺麗な壁紙HD iPhone 7/7 Plus/SE & iPod対応(無料)
  • クールな壁紙HD iPhone 7/7 Plus/SE & iPod対応(無料)

Android apps

  • 浮世絵壁紙 - 美しい日本画ギャラリー
  • 綺麗な高画質壁紙

Objective-C Classes

Tag Cloud

ActionScript(9) ActionScript3(7) Ad(4) Adfurikun(2) AdMob(9) Android(10) Animation(17) AppDelegate(3) ARC(1) ArrayList(1) AVAudioPlayer(4) AVAudioSession(1) AVFoundation(3) Banner(2) Bitmap(1) Camera(4) CGAffineTransform(4) CGBlendMode(2) CGContextRef(1) CGImageRef(1) Classes(44) CLLocationManager(1) ConnectivityManager(1) ContentResolver(1) CoreLocation(2) Delegate(3) Device(7) Display(1) DisplayMetrics(1) Download(101) Facebook(6) Foundation(72) Framework(2) Google Analytics(1) Handler(1) iAd(6) ImageView(1) In-AppPurchase(1) iOS(12) iOS 7(15) iOS 7.1(3) iOS 8(1) iPad(7) iPhone(21) iPhone 6(4) Java(7) JavaScript(2) LINE(4) Localize(1) Magazine(1) MediaStore(1) MFComposeViewController(1) Nend(1) NetworkInfo(1) NSArray(23) NSCalendar(3) NSData(2) NSDate(7) NSDateComponents(2) NSDateFormatter(2) NSDictionary(12) NSEnumerator(1) NSIndexSet(1) NSInteger(6) NSMutableArray(17) NSMutableDictionary(5) NSMutableOrderedSet(7) NSMutableString(4) NSMutableURLRequest(1) NSNotificationCenter(1) NSNumber(1) NSObject(1) NSOrderedSet(7) NSRange(2) NSSelectorFromString(1) NSSet(6) NSString(19) NSTimer(4) NSTimeZone(1) NSURL(7) NSURLConnection(1) NSURLRequest(2) NSUserDefaults(7) NSXMLParser(2) Objective-C(222) PHP(1) Products(14) QuartzCore(3) RSS(2) Runnable(1) Sample(51) Screensaver(9) SDK(2) ShareCompat(1) Social(10) StoreKit(1) Twitter(6) UIAccelerometer(3) UIActionSheet(1) UIActivityIndicator(1) UIActivityIndicatorView(3) UIActivityViewController(1) UIAlertView(5) UIApplication(7) UIButton(4) UIColor(3) UIDatePicker(5) UIDevice(6) UIDeviceOrientation(1) UIEvent(6) UIImage(15) UIImagePickerController(4) UIImageView(12) UIKit(58) UILabel(7) UINavigationBar(4) UINavigationItem(1) UIPasteboard(4) UIScreen(1) UIScrollBar(1) UIScrollView(1) UISlider(3) UIStoryboardSegue(3) UISwitch(1) UITabBar(3) UITableView(4) UITextField(2) UIView(11) UIViewAnimationTransition(1) UIViewController(4) UIWebView(5) WindowManager(1) Xcode(48) Xcode 5(8) Xcode 5.1(2)