Closed18

Flutterでアプリを作ってみる

しょうた🍊なつみかんしょうた🍊なつみかん

Flutterでアプリを作る
RNで作ってきたから慣れてるけど、あえての挑戦。

気になる点(RN(Expo)ならできるけど、Flutterは???)

  • CIでビルドできるのか
  • ビルド後にストアにアップロードまでいけるのか?(行けなくてもいいけど、できたら楽)
しょうた🍊なつみかんしょうた🍊なつみかん

これ追加してってかいてあった。

import UIKit
import Flutter
+ import Firebase

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
+     FirebaseApp.configure()
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

下記で紹介されてたから、追加
https://qiita.com/okhrt/items/c662bdeead49008105d1

とおもったら、使えないのでFirebase.apps.isEmptyで判定をする

import UIKit
import Flutter
import Firebase

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
+    if (Firebase.apps.isEmpty) {
        FirebaseApp.configure()
+    }
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}
しょうた🍊なつみかんしょうた🍊なつみかん

デバッグモード(iOSのシュミレーターや実機)でGoogleのsign inをすると、アプリがクラッシュする問題の解決方法は
下記をinfo.plistに追記するだけ

<?xml version="1.0" encoding="UTF-8"?>
...
<dict>
...
<key>CFBundleURLTypes</key>
<array>
	<dict>
		<key>CFBundleTypeRole</key>
		<string>Editor</string>
		<key>CFBundleURLSchemes</key>
		<array>
			<string>{GoogleService-Info.plist の REVERSED_CLIENT_IDを入れる}</string>
		</array>
	</dict>
</array>
...
</dict>
</plist>
しょうた🍊なつみかんしょうた🍊なつみかん

routesで管理してみた。

main.dart
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  if (Firebase.apps.isEmpty) {
    await Firebase.initializeApp(
      options: DefaultFirebaseOptions.currentPlatform,
    );
  }
  runApp(const App());
}
app.dart
Widget build(BuildContext context) {
  return MaterialApp(
...
    initialRoute:
        FirebaseAuth.instance.currentUser == null ? '/sign-in' : '/',
    routes: {
      '/sign-in': (context) => SignInScreen(
            actions: [
              AuthStateChangeAction<SignedIn>((context, _) {
                Navigator.of(context).pushReplacementNamed('/');
              }),
            ],
            providerConfigs: providerConfigs,
          ),
      '/': (context) => const Tabs()
    },
...
} 

これだと、下記エラーが発生する。
initializeAppを2回するなってエラー
FirebaseException ([core/duplicate-app] A Firebase App named "[DEFAULT]" already exists)

だいたい掴めているのは、ログイン後に発生している。
Firebase.apps.isEmptytrueである

全然関係なかった
nameつけたら解決

main.dart
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  if (Firebase.apps.isEmpty) {
    await Firebase.initializeApp(
      name: 'Hoge',
      options: DefaultFirebaseOptions.currentPlatform,
    );
  }
  runApp(const App());
}
しょうた🍊なつみかんしょうた🍊なつみかん

実機確認してみる
flutter runでの確認ではなく、ちゃんとインストールして確認

flutter build ios

デバイスの確認

flutter devices

対象のデバイスにインストール

flutter install -d [ここ頭文字]
しょうた🍊なつみかんしょうた🍊なつみかん

アプリのアイコン設定

flutter_launcher_icons を使用

✓ Successfully generated launcher icons
Unhandled exception:
FormatException: Invalid number (at character 1)

^

#0      int._handleFormatError (dart:core-patch/integers_patch.dart:129:7)
...

こんなエラーが出たから、下記に書き直してrunしたら動いた

  flutter_launcher_icons:
    git:
      url: https://github.com/Davenchy/flutter_launcher_icons.git
      ref: fixMinSdkParseFlutter2.8

https://github.com/fluttercommunity/flutter_launcher_icons/issues/316

  ════════════════════════════════════════════
     FLUTTER LAUNCHER ICONS (v0.9.1)                               
  ════════════════════════════════════════════
  
• Creating default icons Android
• Adding a new Android launcher icon
• Overwriting default iOS launcher icon with new icon

✓ Successfully generated launcher icons
しょうた🍊なつみかんしょうた🍊なつみかん

リリース準備に取り掛かってる

flutter cleanflutter build ios をする
XcodeでArchiveをする
終わったらDistribute Appを実行

App申請の時に電話番号でエラーが出たら
080の0をとった80から入力するか
+81をつけるといける

しょうた🍊なつみかんしょうた🍊なつみかん

リジェクトされた!!!!

Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage


We noticed that your app requires users to register or log in to access features that are not account based.

Apps may not require users to enter personal information to function, except when directly relevant to the core functionality of the app or required by law. For example, an e-commerce app should let users browse store offerings and other features that are not account based before being asked to register, or a restaurant app should allow users to explore the menu before placing an order. Registration must then only be required for account-specific features, such as saving items for future reference or placing an order.

Next Steps

To resolve this issue, please revise your app to let users freely access your app’s features that are not account based. 

Resources 

See guideline 5.1.1(v) - Account Sign-In to learn more about our requirements for apps with account-based content and features.

おそらく、必要な理由をつければいけそうだけど、
Firebaseの匿名ログインで対応する。
匿名ログイン後、アカウント紐付けができなければ却下

await FirebaseAuth.instance.signInAnonymously();

Firebaseのログイン プロバイダで匿名を選択する必要がある

FirebaseAuthException ([firebase_auth/admin-restricted-operation] ADMIN_ONLY_OPERATION)
このスクラップは2022/01/01にクローズされました