Airbnb đang rời bỏ react native vì sao

Tôi đang cố gắng xuất bản một ứng dụng lần đầu tiên lên Cửa hàng Google Play. Tôi đã chọn tham gia Google Play Signing. Tôi biết thực tế là tôi đang ký Android App Bundle bằng khóa phù hợp vì khi tôi tải lên bằng khóa khác, Bảng điều khiển sẽ yêu cầu tôi tải lên bằng khóa khác với mã nhận dạng SHA1 cụ thể. Tuy nhiên, khi tôi tải lên bằng khóa chính xác, tôi gặp lỗi này:

Bạn đã tải lên APK hoặc Android App Bundle có thông tin ký không hợp lệ hoặc bị thiếu cho một số tệp của nó.

Tôi đang xây dựng ứng dụng bằng Android Studio như sau: Xây dựng> Tạo gói đã ký / APK> Android App Bundle> Chọn kho khóa của tôi và nhập mật khẩu> phát hành> Hoàn tất

Ứng dụng này là một ứng dụng React Native được xây dựng với Expo / ExpoKit tách rời. Tải lên Apple App Store hoạt động tốt, tôi chỉ gặp vấn đề với Play Store. Tôi đang thiếu cái gì?

Cập nhật 1 : Bây giờ tôi đã xóa hoàn toàn ứng dụng khỏi Google Play và tạo một ứng dụng mới. Đã không lựa chọn trong kế cho Google Play Ký lần này và tải lên một APK được ký. Vẫn lỗi như cũ.

Cập nhật 2 : Đã thử với kho khóa và khóa hoàn toàn mới. Vẫn giống nhau.

Dưới đây là tổng quan về thiết lập dự án nếu điều này bằng cách nào đó quan trọng:

Airbnb đang rời bỏ react native vì sao

Và đây là android/app/build.gradle:

buildscript { repositories { google() maven { url 'https://maven.fabric.io/public' } } dependencies { classpath 'io.fabric.tools:gradle:1.26.1' } } apply plugin: 'com.android.application' apply plugin: 'io.fabric' apply plugin: 'devicefarm' repositories { maven { url 'https://maven.fabric.io/public' } } def safeExtGet(prop, fallback) { rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback } android { compileSdkVersion safeExtGet("compileSdkVersion", 28) compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } defaultConfig { applicationId 'de.***.android' minSdkVersion safeExtGet("minSdkVersion", 21) targetSdkVersion safeExtGet("targetSdkVersion", 28) versionCode 1 versionName '1.0.2' ndk { abiFilters 'armeabi-v7a', 'x86' } multiDexEnabled true testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" // Deprecated. Used by net.openid:appauth manifestPlaceholders = [ 'appAuthRedirectScheme': 'host.exp.exponent' ] } dexOptions { javaMaxHeapSize System.getenv("DISABLE_DEX_MAX_HEAP") ? null : "8g" } signingConfigs { debug { storeFile file('../debug.keystore') } release { storeFile file(System.getenv("ANDROID_KEYSTORE_PATH") ?: "release-key.jks") storePassword System.getenv("ANDROID_KEYSTORE_PASSWORD") keyAlias System.getenv("ANDROID_KEY_ALIAS") keyPassword System.getenv("ANDROID_KEY_PASSWORD") } } buildTypes { debug { debuggable true ext.enableCrashlytics = false } release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } } lintOptions { abortOnError false } packagingOptions { pickFirst "**" } } devicefarm { projectName System.getenv("DEVICEFARM_PROJECT_NAME") devicePool System.getenv("DEVICEFARM_DEVICE_POOL") executionTimeoutMinutes 40 authentication { accessKey System.getenv("AWS_ACCESS_KEY_ID") secretKey System.getenv("AWS_SECRET_ACCESS_KEY") } } configurations.all { resolutionStrategy { force 'org.webkit:android-jsc:r245459' } } // WHEN_PREPARING_SHELL_REMOVE_FROM_HERE apply from: 'expo.gradle' // WHEN_PREPARING_SHELL_REMOVE_TO_HERE apply from: "../../node_modules/react-native-unimodules/gradle.groovy" dependencies { implementation project(':react-native-torch') implementation project(':react-native-twilio-video-webrtc') implementation project(':react-native-exit-app') implementation project(':react-native-fs') implementation project(':react-native-document-picker') implementation project(':rn-fetch-blob') implementation project(':react-native-onesignal') implementation project(':react-native-vector-icons') implementation project(':react-native-randombytes') implementation fileTree(dir: 'libs', include: ['*.jar']) compile project(':tipsi-stripe') implementation 'com.android.support:multidex:1.0.1' // Our dependencies implementation "com.android.support:appcompat-v7:$supportLibVersion" // Our dependencies from ExpoView // DON'T ADD ANYTHING HERE THAT ISN'T IN EXPOVIEW. ONLY COPY THINGS FROM EXPOVIEW TO HERE. implementation "com.android.support:appcompat-v7:$supportLibVersion" implementation 'com.facebook.android:facebook-android-sdk:5.0.1' implementation('com.facebook.android:audience-network-sdk:5.1.1') { exclude module: 'play-services-ads' } compileOnly 'org.glassfish:javax.annotation:3.1.1' implementation 'com.jakewharton:butterknife:9.0.0' implementation 'de.greenrobot:eventbus:2.4.0' implementation 'com.squareup.picasso:picasso:2.5.2' implementation 'com.google.android.gms:play-services-gcm:15.0.1' implementation 'com.google.android.gms:play-services-analytics:16.0.1' implementation 'com.google.android.gms:play-services-maps:15.0.1' implementation 'com.google.android.gms:play-services-auth:15.0.1' implementation 'com.google.android.gms:play-services-location:15.0.1' implementation 'com.google.android.gms:play-services-ads:15.0.1' //annotationProcessor 'com.raizlabs.android:DBFlow-Compiler:2.2.1' //implementation "com.raizlabs.android:DBFlow-Core:2.2.1" //implementation "com.raizlabs.android:DBFlow:2.2.1" implementation "com.madgag.spongycastle:core:1.53.0.0" implementation "com.madgag.spongycastle:prov:1.53.0.0" debugImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1' // debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.4-beta1' releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1' implementation 'com.facebook.device.yearclass:yearclass:2.1.0' implementation 'commons-io:commons-io:1.4' implementation 'me.leolin:ShortcutBadger:1.1.4@aar' implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0' implementation 'commons-codec:commons-codec:1.10' implementation 'com.segment.analytics.android:analytics:4.3.0' implementation 'com.google.zxing:core:3.3.3' implementation 'net.openid:appauth:0.4.1' implementation 'com.airbnb.android:lottie:2.5.6' implementation('io.nlopez.smartlocation:library:3.2.11') { transitive = false } implementation "com.android.support:exifinterface:${safeExtGet("supportLibVersion", "28.0.0")}" implementation 'com.squareup.okio:okio:1.9.0' implementation 'com.facebook.soloader:soloader:0.6.0' // expo-file-system implementation 'com.squareup.okhttp3:okhttp:3.10.0' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.10.0' // Testing androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' // We use a modified build of com.android.support.test:runner:1.0.1. Explanation in maven-test/README androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation "com.android.support:support-annotations:${safeExtGet("supportLibVersion", "28.0.0")}" androidTestImplementation 'com.google.code.findbugs:jsr305:3.0.0' androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1' androidTestImplementation 'com.azimolabs.conditionwatcher:conditionwatcher:0.2' testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:1.10.19' testImplementation 'org.robolectric:robolectric:3.8' testImplementation 'com.android.support.test:runner:1.0.2-alpha1' testImplementation 'com.android.support.test:rules:1.0.2-alpha1' implementation('host.exp.exponent:expoview:35.0.0@aar') { transitive = true exclude group: 'com.squareup.okhttp3', module: 'okhttp' exclude group: 'com.squareup.okhttp3', module: 'okhttp-urlconnection' } api 'org.webkit:android-jsc:r245459' // needs to be before react-native api 'com.facebook.react:react-native:35.0.0' addUnimodulesDependencies([ modulesPaths : [ '../../node_modules' ], configuration: 'api', target : 'react-native', exclude : [ // You can exclude unneeded modules here. // By default we exclude FaceDetector // and Stripe payments APIs. 'unimodules-face-detector-interface', 'expo-face-detector', 'expo-payments-stripe' // Adding a name here will also remove the package // from auto-generated BasePackageList.java ] ]) } // This has to be down here for some reason apply plugin: 'com.google.gms.google-services' googleServices { disableVersionCheck = true }

Cập nhật 3 : Tôi đã tạo APK đã ký ngay bây giờ và cố gắng xác thực chữ ký của nó bằng cách sử dụng jarigner:

jarsigner -verify -verbose -certs /***/app-release.apk

Lệnh này tạo ra lỗi sau:

jarsigner: java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

Đối với tôi, có vẻ như đây có thể là một phần quan trọng của câu đố. Tuy nhiên, tôi không thể tìm thấy bất kỳ thông tin hữu ích nào liên quan đến lỗi này cho đến nay.

Airbnb đang rời bỏ react native vì sao

Thế giới của web development luôn thay đổi và đó là một thách thức để theo dõi chặt chẽ mọi thứ đang diễn ra. Những frameworks nào vẫn sẽ có liên quan trong năm nay? Và ngôn ngữ lập trình nào phù hợp nhất cho web application của bạn? Hãy cùng thảo luận về 6 công nghệ thú vị để phát triển web.

Trong bài viết này, chúng tôi phân biệt giữa front-end và back-end. Chúng ta sẽ bắt đầu với 3 front-end development frameworks và 3 back-end development frameworks.

Front-end Frameworks

Với React.js, các developers có thể xây dựng các thành phần có thể tái sử dụng, mỗi thành phần có một "state" riêng. Nếu một thành phần phải cập nhật trên trang (ví dụ: người dùng nhấn vào nút like), chỉ 1 phần đó được sửa đổi bởi React mà không phải làm mới trang hoàn chỉnh.

React sử dụng "virtual DOM" cho việc này. Đây là một representation (đại diện) của một giao diện người dùng được lưu trữ trong bộ nhớ và được đồng bộ hóa liên tục với "real" DOM. Không quan trọng việc bạn sử dụng trình duyệt nào, virtual DOM của React sẽ luôn hiển thị nhanh hơn vì nó hoạt động theo cách hiệu quả hơn.

Các công ty lớn như Airbnb và Netflix đã sử dụng React.js trong một số năm nay và chúng tôi thấy rằng công nghệ này đang được ngày càng nhiều công ty chấp nhận. Sự quan tâm đến React giữa các developers là rất lớn và điều đó khiến nó trở thành một công nghệ sẽ trở lên phổ biến trong những năm tới.

Ngoài React còn có React Native, một framework cho phép phát triển ứng dụng di động cho cả IOS và Android chỉ với một bộ source code. Framework này có cơ sở kỹ thuật tương tự như React và cùng với đó, việc các web developers phát triển ứng dụng di động dễ dàng hơn nhiều so với các trang web và ứng dụng web, đây là một sự phát triển thú vị cho các công ty.

Vue.js

Một thành viên mới quan trọng khác trong front-end development là Vue.js, javascript framework với sự phát triển nhanh nhất và có lẽ là cộng đồng các nhà phát triển nhiệt tình nhất vào lúc này. Với tài liệu rất chi tiết, Vue.js là một lựa chọn phù hợp khi bạn muốn thử nghiệm một framework mới với tư cách như một developer.

Do sự tương đồng với React và Angular về mặt kiến trúc, nó là một sự chuyển đổi dễ dàng từ các frameworks khác. Được yêu thích vì kích thước nhở (chỉ 20KB), tốc độ và tính linh hoạt, Vue.js mang lại hiệu năng thậm chí còn tốt hơn so với các frontend frameworks khác.

Vue.js hiện vẫn có thị phần khá nhỏ so với React hay Angular. Do đó, việc tìm kiếm các developers có kinh nghiệm về Vue.js có thể khó khăn một chút. Dù Vue.js sẽ trở nên phổ biến như React hay Angular, chúng ta sẽ phải chờ xem, nhưng do ý kiến tích cực từ cộng đồng nhà phát triển và sự phát triển trong việc sử dụng Vue, có vẻ như Vue.js sẽ tiếp tục được phát triển hơn nữa.

jQuery

Vậy còn jQuery thì sao? Chà, có vẻ như cộng đồng các nhà phát triển đang dần rời khỏi thư viện JavaScript nổi tiếng nhất. Một trong những lý do có thể là jQuery không hoạt động tốt với các thư viện mới hơn như React. Các trình duyệt hiện đại ngày nay cũng hỗ trợ nhiều hàm giống jQuery, trong nhiều trường hợp làm cho jQuery trở nên thừa. Vì lý do đó, chúng tôi thấy rằng việc sử dụng JavaScript thuần túy hơn rất nhiều. Ví dụ, GitHub gần đây đã thông báo rằng nó đã thay thế tất cả jQuery bằng JavaScript thuần .

jQuery có thể không phải luôn là lựa chọn đầu tiên khi bắt đầu một dự án mới, với 300.000 lượt tải xuống mỗi ngày, nó vẫn đạt được mức tăng trưởng tốt 300% so với đầu năm 2017. Có lẽ còn đáng ngạc nhiên hơn: 90% trong số 500.000 trang web hàng đầu vẫn sử dụng jQuery! Điều này cho thấy rằng một thư viện không nhất thiết phải mới và cool để duy trì. Sự lựa chọn sử dụng một thư viện cụ thể phụ thuộc hoàn toàn vào loại dự án mà bạn muốn sử dụng nó cho.

Mỗi frameworks/libraries có một triết lý khác nhau và mỗi loại có một thế mạnh riêng, nhưng một điều chúng ta có thể chắc chắn là JavaScript là nền tảng của tất cả các phát triển này. Do đó, một nhóm phát triển có kiến thức và kinh nghiệm mạnh mẽ với JavaScript là điều cần thiết để xây dựng các trang web và ứng dụng web hiện đại.

Backend-Frameworks

Một ngôn ngữ lập trình đã trở nên rất phổ biến trong những năm gần đây là Kotlin. Nó là một giải pháp thay thế hiện đại cho Java rất dễ học. Ngôn ngữ nguồn mở bắt đầu phát triển đặc biệt vào năm ngoái khi Google tuyên bố rằng đây là ngôn ngữ được hỗ trợ chính thức cho Android. Nhiều công ty bắt đầu viết các ứng dụng Android của họ bằng Kotlin, chẳng hạn như Slack và Netflix.

Thật thú vị khi thấy, như một nghiên cứu của Pizer đã chỉ ra rằng, Kotlin được sử dụng chủ yếu bởi các nhà phát triển có kinh nghiệm trong những năm đầu tiên (kể từ năm 2011), nhưng kể từ khi Google công bố, đó là các nhà phát triển trẻ, đặc biệt là sinh viên, những người gây ra sự khổng lồ sự phát triển. Ngoài ra, không có gì đáng ngạc nhiên khi hầu hết các nhà phát triển hiện nay đều sử dụng Kotlin để xây dựng các ứng dụng Android, mặc dù nó cũng có thể được sử dụng để phát triển các ứng dụng phía sau hoặc phía máy chủ.

Elixir and Phoenix

Phoenix, được xây dựng bằng ngôn ngữ lập trình chức năng Elixir, là một framework tương đối mới đang ngày càng được nói đến trong cộng đồng nhà phát triển. Một trong những lý do khiến các nhà phát triển rất quan tâm đến Phoenix là vì nó được biết đến với hiệu suất nhanh. Ví dụ: xử lý một yêu cầu JSON lớn, mất khoảng 1,5 giây trong Rails, chỉ tốn 400ms ở Phoenix.

Điều quan trọng là phải kiểm tra xem một công nghệ có phù hợp với loại dự án mà bạn muốn áp dụng nó hay không. Ví dụ, Elixir và Phoenix rất mạnh trong các ứng dụng thời gian thực, trong đó nhiều kết nối phải được xử lý đồng thời (ví dụ: ứng dụng trò chuyện). Nhưng đối với các ứng dụng đòi hỏi nhiều sức mạnh tính toán, Elixir có thể ít phù hợp hơn.

Số lượng nhà phát triển Elixir hiện tại khá hạn chế. Elixir và Phoenix tương đối mới và không có nhiều công ty hoạt động công khai với khuôn khổ này. Điều này chắc chắn có thể thay đổi trong tương lai và đó là lý do tại sao bạn nên theo dõi chặt chẽ về Elixir và Phoenix.

GraphQL

Bạn có thể đã nghe nói về GraphQL, một ngôn ngữ truy vấn nguồn mở do Facebook phát triển và là một trong những cách hiện đại nhất để xây dựng API. Sự phổ biến của GraphQL đang tăng nhanh và các công ty lớn như Twitter, Shopify và Amazon đã bắt đầu làm việc với công nghệ này.

GraphQL cung cấp giải pháp cho một số vấn đề rất thực tế mà các nhà phát triển phải vật lộn rất nhiều vì nó giúp việc tải và xử lý dữ liệu dễ dàng hơn nhiều. Một trong những khác biệt quan trọng giữa API REST và GraphQL, đó là GraphQL cung cấp khả năng chỉ định chính xác dữ liệu nào bạn muốn lấy lại từ API. Nó đảm bảo rằng phần mềm gọi API nhận tất cả dữ liệu cần thiết trong một yêu cầu.

Điều này có ích khi ứng dụng chứa nhiều nested models và associations. Ví dụ, GraphQL giúp phát triển ứng dụng di động, chỉ tải dữ liệu liên quan và do đó giảm tải cho mạng di động. GraphQL đảm nhiệm rất nhiều overhead (chi phí) mà API REST có và điều đó mang lại lợi ích cho cả backend và frontend.

Conclusion

Là một nhà phát triển, điều quan trọng là luôn cập nhật với sự phát triển công nghệ hiện tại càng nhiều càng tốt. Bạn nên xem xét các cơ hội, nhưng cũng xem xét các rủi ro có thể có mà công nghệ mới gây ra. Thử nghiệm thường xuyên với các frameworks khác nhau giúp trải nghiệm những lợi ích tiềm năng, nhưng cũng có những hạn chế.

Công việc của một nhà phát triển bao gồm chủ yếu là giải quyết các thách thức kỹ thuật và đó là lý do tại sao việc làm việc với công nghệ đã được chứng minh là rất quan trọng, có hiệu quả để làm việc và có một cộng đồng lớn đằng sau nó.

Tham khảo

https://medium.freecodecamp.org/trending-web-technologies-to-follow-in-2019-fc382b09198b