2021年3月31日 星期三

如何在應用程式利用Google發通知郵件

1.申請1個Google的信箱。

2.使用應用程式密碼登入帳戶

使用應用程式密碼。

    1. 前往您的 Google 帳戶
    2. 選取 [安全性]。
    3. 選取「登入 Google」底下的 [應用程式密碼]。您可能需要登入。如果您沒有看到這個選項,可能原因如下:
      1. 您的帳戶並未設定兩步驟驗證。
      2. 您目前只設定使用安全金鑰進行兩步驟驗證。
      3. 您使用的是公司、學校或其他機構專用的帳戶。
      4. 您已啟用進階保護功能。
    4. 選擇底部的 [選取應用程式] 並選擇您所使用的應用程式 下一步 選擇 [選取裝置] 並選擇您所使用的裝置 下一步 選取 [產生]。
    5. 按照操作說明輸入應用程式密碼。應用程式密碼是指裝置上黃色列中的 16 位數代碼。
    6. 輕觸 [完成]。
3.參數設定參考
<configuration>
  <system.net>
    <mailSettings>
      <smtp deliveryMethod="Network" from="xxxxx@gmail.com">
        <network defaultCredentials="false" host="smtp.gmail.com" port="587" userName="xxxxx@gmail.com" password="xxxxxxxxxxxxxxxx" enableSsl="true" />
      </smtp>
    </mailSettings>
  </system.net>


2021年3月24日 星期三

關於 RxJS 裡的 BehaviorSubject 可以怎麼用!

 RxJS 裡的 Subject 有 4 種類型,Subject、BehaviorSubject、ReplaySubject 和 AsyncSubject,每一種類型的 Subject 都有各自的特性及使用時機,這次會使用 BehaviorSubject來管理使用者的登入狀態


BehaviorSubject

BehaviorSubject 與一般的 Subject 有什麼不一樣,差別有兩個

  1. BehaviorSubject 可以給予初始值
  2. 每一個 Observer 都可以在註冊的當下,立刻取得目前 BehavoirSubject 的值 (以下皆簡稱為 Subject)

這兩種特性,就非常適合用在使用者登入狀態管理的這種情境

使用情境

使用者登入基本上,狀態就兩種,登入與尚未登入,而每一個頁面都可以在取得該使用者目前的登入狀態。也可以即時知道已登入的使用者登出的時間點。

根據上列的描述,我們會實作一個 UserService,用來執行跟管理使用者的登入,登出行為及狀態。

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
import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from "rxjs";

@Injectable()
export class UserService {
isLoginSubject = new BehaviorSubject<boolean>(this.hasToken());

/**
* 如果有取得token,表示使用者有登入系統
* @returns {boolean}
*/
private hasToken() : boolean {
return !!localStorage.getItem('token');
}

/**
* 登入使用者,並通知所有訂閱者
*/
login() : void {
localStorage.setItem('token', 'JWT');
this.isLoginSubject.next(true);
}

/**
* 登出使用者,並通知所有訂閱者
*/
logout() : void {
localStorage.removeItem('token');
this.isLoginSubject.next(false);
}

/**
*
* @returns {Observable<T>}
*/
isLoggedIn() : Observable<boolean> {
return this.isLoginSubject.asObservable();
}
}

Component 的使用方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import { Component, OnInit } from '@angular/core';
import { AuthService } from "../auth.service";
import { Observable } from "rxjs";

@Component({
selector: 'app-main-nav',
template: `
<ul>
<li *ngIf="!(isLoggedIn | async)" (click)="authService.login()>
<a>Login</a>
</li>
<li *ngIf="(isLoggedIn | async)" (click)="authService.logout()">
<a>Logout</a>
</li>
</ul>
`
})
export class MainNavComponent implements OnInit {
isLoggedIn : Observable<boolean>;

constructor( public userService : UserService ) {
this.isLoggedIn = userService.isLoggedIn();
}
}

這樣子就完成了一個陽春型的使用者登入狀態管理 service。



參考資料

2021年3月21日 星期日

No pipe found with name 'translate'

 Error message:

error NG8004: No pipe found with name 'translate'.



page module 要作如下配置:

import { TranslateModule } from '@ngx-translate/core';


@NgModule({

  imports: [

TranslateModule

  ],

  exports: [

TranslateModule

  ]

})


If 'ion-title' is an Angular component, then verify that it is part of this module.

 Error message:

1. If 'ion-title' is an Angular component, then verify that it is part of this module.

2. If 'ion-title' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.


page ts 要加 entryComponents:

const tmpModule = NgModule({

         declarations: [tmpCmp],

         imports:[IonicModule],

         entryComponents: [tmpCmp]

    })(class {});


2021年3月20日 星期六

ionic buile error: No provider for LocalNotifications

Error message:

core.js:6140 ERROR NullInjectorError: R3InjectorError(AppModule)[cls_localnotifications -> LocalNotifications -> LocalNotifications -> LocalNotifications]: 

  NullInjectorError: No provider for LocalNotifications!


Soluction:

app.module.ts  add:

import { LocalNotifications } from '@ionic-native/local-notifications/ngx';

providers: [

    LocalNotifications,

]


         

2021年3月16日 星期二

No targets devices/emulators available. 使用模擬器出現異常,無法使用

指令:ionic cordova emulate android 

異常訊息:

[native-run] ERR_NO_TARGET: No targets devices/emulators available. Cannot create AVD because there is no suitable API installation. Use --sdk-info to reveal missing packages and other issues.


avdmanager list avd    --列出所有系統中所有的AVD    

(環境變數中要有 %ANDROID_HOME%\tools\bin 才可以執行)


avdmanager list target --列出目標的AVD


C:\Users\morse>avdmanager list target

Available Android targets:==============] 100% Fetch remote repository...

----------

id: 1 or "android-19"

Name: Android API 19

Type: Platform

API level: 19

Revision: 4

----------

id: 2 or "android-28"

Name: Android API 28

Type: Platform

API level: 28

Revision: 6

----------

id: 3 or "android-29"

Name: Android API 29

Type: Platform

API level: 29

Revision: 4

ionic指定模擬器:

手機

ionic cordova emulate android --target=Nexus_5X_API_26_x86

ionic cordova emulate android --target=Nexus_5X_API_26_x86 --verbose

ionic cordova emulate android --target=Nexus_5X_API_26_x86 --warning-mode all

平板

ionic cordova emulate android --target=Nexus_9_API_27


SDK 管理工具

sdkmanager --install "system-images;android-29;default;x86"


ionic admob enabling test ads

 在開發過程中啟用測試廣告很重要,這樣您就可以在不向Google廣告客戶收費的情況下點擊它們。如果您在未處於測試模式的情況下點擊了太多廣告,則可能會將您的帳戶標記為無效活動。


以下是示例廣告單元,它們針對每種格式指向特定的測試廣告素材:

廣告格式樣本廣告單元ID
應用程式開啟ca-app-pub-3940256099942544/3419835294
橫幅ca-app-pub-3940256099942544/6300978111
插頁式ca-app-pub-3940256099942544/1033173712
插頁式視頻ca-app-pub-3940256099942544/8691691433
獎勵ca-app-pub-3940256099942544/5224354917
獎勵插頁式廣告ca-app-pub-3940256099942544/5354046379
本機高級ca-app-pub-3940256099942544/2247696110
原生高級視頻ca-app-pub-3940256099942544/1044960115




2021年3月15日 星期一

ionic cordova build example

Examples

ionic cordova build android
ionic cordova build android --buildConfig=build.json
ionic cordova build android --prod --release -- -- --gradleArg=-PcdvBuildMultipleApks=true
ionic cordova build android --prod --release -- -- --keystore=filename.keystore --alias=myalias
ionic cordova build android --prod --release -- -- --minSdkVersion=21
ionic cordova build android --prod --release -- -- --versionCode=55
ionic cordova build android --prod --release --buildConfig=build.json
ionic cordova build ios
ionic cordova build ios --buildConfig=build.json
ionic cordova build ios --prod --release
ionic cordova build ios --prod --release -- --developmentTeam="ABCD" --codeSignIdentity="iPhone Developer" --packageType="app-store"
ionic cordova build ios --prod --release --buildConfig=build.json

Execution failed for task ':app:stripDebugDebugSymbols'.

ionic cordova build android 


錯誤訊息:

Execution failed for task ':app:stripDebugDebugSymbols'.

> No version of NDK matched the requested version 21.0.6113669. Versions available locally: 21.3.6528147



解決:

下載對應版本NDK




ionic cordova 改為 AndroidX

修改    \platforms\android\gradle.properties


android.useAndroidX=true
android.enableJetifier=true


Build:

    ionic cordova build android


錯誤訊息:

該項目使用AndroidX依賴項,但未啟用'android.useAndroidX'屬性。在gradle.properties文件中將此屬性設置為true,然後重試。

檢測到以下AndroidX依賴項:

...


解決:

# add plugin to enable AndroidX in the project

cordova plugin add cordova-plugin-androidx


# add plugin to patch existing plugin source that uses the Android Support Library to use AndroidX

cordova plugin add cordova-plugin-androidx-adapter


2021年3月10日 星期三

如何在 ionic 中安裝 capacitor

安裝指令如下: 


npm install @capacitor/android@latest

ionic 的權限設置是記錄在哪?

在Android中,您的應用所需的權限通常在標記的AndroidManifest.xml內部(<manifest>通常在文件底部)定義

例如,這是添加網絡權限的樣子:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.getcapacitor.myapp">
    <activity>
      <!-- other stuff -->
    </activity>

    <!-- More stuff -->

    <!-- Your permissions -->

    <!-- Network API -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>

通常,您選擇使用的插件會要求您設置權限。將其添加到此文件中。

如何手動變更 ionic app 名稱

你可以在專案目錄下找到 config.xml, 將它打開找到名稱的位置, 就可以完成應用程式名稱的修改了。


    <name>myAppt</name>


另一種作法是在 android 目錄下找到檔案 \android\app\src\main\res\values\strings.xml 並開啟它,就可以修改應用程式名稱了。



<?xml version='1.0' encoding='utf-8'?>
<resources>
    <string name="app_name">myApp</string>
    <string name="title_activity_main">myApp</string>
    <string name="package_name">io.ionic.starter</string>
    <string name="custom_url_scheme">io.ionic.starter</string>
</resources>

2021年3月8日 星期一

Example: Ionic 5/Angular Admob

 In this tutorial we are going to see how to implement Google AdMob Ads In Ionic 5 to be able to monetize your apps using ads.

We are going to cover how to add three types of Ads:

  • Banner Ads,
  • Interstitial Ads,
  • Reward Video Ads.

Create a New Ionic 5/Angular Project

Let's start our tutorial by creating a new Ionic 5/Angular project from scratch (Optional) based on the blank template using the Ionic CLI 5:

ionic start AdmobAdsExample blank 

Next, navigate inside your Ionic 5 project folder:

cd AdmobAdsExample 

Next, install the Cordova Admob plugin and its Ionic Native 5 wrapper as follows:

ionic cordova plugin add --save cordova-plugin-admob-free        

npm install --save @ionic-native/admob-free

Next, open the src/app/app.module.ts file and import AdMobFree then add it to the list of providers:

import { AdMobFree } from '@ionic-native/admob-free';    

@NgModule({
declarations: [
    MyApp,
    HomePage   
],
imports: [
    BrowserModule,
    IonicModule.forRoot(MyApp)
],
bootstrap: [IonicApp],
entryComponents: [
    MyApp,
    HomePage
],
providers: [
    StatusBar,
    SplashScreen,
    AdMobFree,
    {provide: ErrorHandler, useClass: IonicErrorHandler}
]
})
export class AppModule {}

Showing Banner Ads in your Ionic 5 App

Next, open the src/app/app.component.ts file and add the following code:

import { Component } from '@angular/core';
import { Platform } from 'ionic-angular';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
import { AdMobFree, AdMobFreeBannerConfig } from '@ionic-native/admob-free';

import { HomePage } from '../pages/home/home';
@Component({
templateUrl: 'app.html'
})
export class MyApp {
rootPage:any = HomePage;

constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen , private admobFree : AdMobFree ) {
    platform.ready().then(() => {
    // Okay, so the platform is ready and our plugins are available.
    // Here you can do any higher level native things you might need.
    statusBar.styleDefault();
    splashScreen.hide();
    this.showAdmobBannerAds();
    });
}
showAdmobBannerAds(){
    const bannerConfig: AdMobFreeBannerConfig = {
        isTesting: true,
        autoShow: true
    };
    this.admobFree.banner.config(bannerConfig);

    this.admobFree.banner.prepare()
    .then(() => {
        // banner Ad is ready
        // if we set autoShow to false, then we will need to call the show method here
    })
    .catch(e => console.log(e));    
    }      

}

We have injected AdMobFree and created the showAdmobBannerAds() method to show banner ads when Cordova is ready.

We have passed two configuration options:

  • isTesting : true, which tells Admob plugin to use only test ads which is the recommended option when you are still developing your app to avoid accidental clcks that may cause problems with your Google Admob account.
  • autoShow : true, which shows banner ads immediately after creating them without using the show() method.

After developing your Ionic 5 app you need to create real ads, go to AdMob portal, click "Monetize a new app" button to create a new ad unit.

Next grab your ad pubisher id and add it to configuration options as follows:

    const bannerConfig: AdMobFreeBannerConfig = {
        id: 'ca-app-pub-xxx/xxx', 
        isTesting: false,
        autoShow: true
    };

If you set autoShow to false then you need to call the show() method after preparing the banner:

    this.admobFree.banner.prepare()
    .then(() => {

        this.admobFree.banner.show()
    })
    .catch(e => console.log(e));    
    }  

You can also hide the banner using:

    this.admobFree.banner.hide()

Or you can completely remove it using:

    this.admobFree.banner.remove()        

Showing Interstitial Ads in your Ionic 5 App

You can also show Admob Interstitial ads using the following method:

showInterstitialAds(){
    const bannerConfig: AdMobFreeBannerConfig = {
    id: 'ca-app-pub-xxx/xxx',
    isTesting: false,
    autoShow: false
    };
    this.admobFree.interstitial.config(bannerConfig);

    this.admobFree.interstitial.prepare()
    .then(() => {
        this.admobFree.interstitial.show()
    })
    .catch(e => console.log(e));    
    }  

You can use the same configuration options and methods to add Interstitial Ads.

Showing Reward Video Ads in your Ionic 5 App

If you choose to display Reward Video Ads in your Ionic 5 mobile app, you can add and call the following method:

showRewardVideoAds(){
    const bannerConfig: AdMobFreeBannerConfig = {
    id: 'ca-app-pub-xxx/xxx',
    isTesting: false,
    autoShow: false
    };
    this.admobFree.rewardvideo.config(bannerConfig);

    this.admobFree.rewardvideo.prepare()
    .then(() => {
        this.admobFree.rewardvideo.show()
    })
    .catch(e => console.log(e));    
    }

如何在Ionic 5使用AdMob 中實現Google廣告

 在本教程中,看到如何在AdMob Ionic 5中實現Google廣告,以便能夠利用廣告賺錢。

介紹如何添加三種類型的廣告:

  • 橫幅廣告
  • 插頁廣告
  • 視頻廣告
  • 創建一個新的Ionic 5/ Angular項目

    讓我們通過使用Ionic CLI 5基於空白模板從頭開始創建一個新的Ionic 5/Angular項目(可選)來開始本教程:

    ionic start AdmobAdsExample blank  

    接下來,在Ionic 5項目文件夾中導航:

    cd  AdmobAdsExample

    接下來,安裝Cordova Admob插件及它Ionic Native 5包裝器,如下所示:

    ionic cordova plugin add --save cordova-plugin-admob-free 
    npm install --save @ionic-native/admob-free

    接下來,打開src/app/app.module.ts文件,並導入AdMobFree,然後將它添加到提供程序列表中:


    import { AdMobFree } from '@ionic-native/admob-free'; 

    @NgModule({
    declarations: [
     MyApp,
     HomePage 
    ],
    imports: [
     BrowserModule,
     IonicModule.forRoot(MyApp)
    ],
    bootstrap: [IonicApp],
    entryComponents: [
     MyApp,
     HomePage
    ],
    providers: [
     StatusBar,
     SplashScreen,
     AdMobFree,
     {provide: ErrorHandler, useClass: IonicErrorHandler}
    ]
    })
    export class AppModule {}    




    在Ionic 5應用程序中顯示橫幅廣告

    接下來,打開src/app/app.component.ts文件,並添加以下代碼:

    import { Component } from '@angular/core';
    import { Platform } from 'ionic-angular';
    import { StatusBar } from '@ionic-native/status-bar';
    import { SplashScreen } from '@ionic-native/splash-screen';
    import { AdMobFree, AdMobFreeBannerConfig } from '@ionic-native/admob-free';

    import { HomePage } from '../pages/home/home';
    @Component({
    templateUrl: 'app.html'
    })
    export class MyApp {
    rootPage:any = HomePage;

    constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen , private admobFree : AdMobFree ) {
     platform.ready().then(() => {
     // Okay, so the platform is ready and our plugins are available.
     // Here you can do any higher level native things you might need.
     statusBar.styleDefault();
     splashScreen.hide();
     this.showAdmobBannerAds();
     });
    }
    showAdmobBannerAds(){
     const bannerConfig: AdMobFreeBannerConfig = {
     isTesting: true,
     autoShow: true
     };
     this.admobFree.banner.config(bannerConfig);

     this.admobFree.banner.prepare()
     .then(() => {
     // banner Ad is ready
     // if we set autoShow to false, then we will need to call the show method here
     })
     .catch(e => console.log(e)); 
     } 


    我們注入了AdMobFree,並創建了showAdmobBannerAds()方法,以便在Cordova準備好時顯示橫幅廣告。

    我們傳遞了兩個配置選項:

  • isTesting:true,它告訴Admob plugin只使用測試廣告,這是你仍然開發應用程序以避免意外時的推薦選項,
  • autoShow:true,在創建標題廣告之後,立即顯示標題廣告,而不使用show()方法,
  • 開發完Ionic 5應用後,您需要製作真實的廣告,請轉到AdMob門戶,單擊"通過新應用獲利"按鈕以創建新的廣告單元。

    接下來獲取你的廣告pubisher id並將它添加到配置選項中,如下所示:

     const bannerConfig: AdMobFreeBannerConfig = {

    id: 'ca-app-pub-xxx/xxx', 

    isTesting: false,

    autoShow: true

     };


    如果將autoShow設置為false,就在準備標題後需要調用show()方法:

      this.admobFree.banner.prepare()
     .then(() => {
     this.admobFree.banner.show()
     })
     .catch(e => console.log(e)); 
     } 

    你還可以使用:

    this.admobFree.banner.hide()


    或者你可以使用:

        this.admobFree.banner.remove() 


    在您的Ionic 5應用中顯示插頁式廣告


    showInterstitialAds(){
     const bannerConfig: AdMobFreeBannerConfig = {
     id: 'ca-app-pub-xxx/xxx',
     isTesting: false,
     autoShow: false
     };
     this.admobFree.interstitial.config(bannerConfig);

     this.admobFree.interstitial.prepare()
     .then(() => {
     this.admobFree.interstitial.show()
     })
     .catch(e => console.log(e)); 


    在Ionic 5應用程序中顯示視頻廣告




    showRewardVideoAds(){
     const bannerConfig: AdMobFreeBannerConfig = {
     id: 'ca-app-pub-xxx/xxx',
     isTesting: false,
     autoShow: false
     };
     this.admobFree.rewardvideo.config(bannerConfig);

     this.admobFree.rewardvideo.prepare()
     .then(() => {
     this.admobFree.rewardvideo.show()
     })
     .catch(e => console.log(e)); 
     }




    [Q&A] Send image from ionic to asp.net core (IFormFile) web api

     [Q] We are looking to upload image from ionic to .net core web api. To achieve this we are using file transfer plugin. So, far we understoo...