国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

React Native 跳轉(zhuǎn)到 APP 推送頁面并獲取推送狀態(tài)

DrizzleX / 2185人閱讀

摘要:產(chǎn)品為了提高推送送達(dá)率,提了一個(gè)需求在推送關(guān)閉的情況下顯示一個(gè)小,點(diǎn)擊跳轉(zhuǎn)到消息設(shè)置界面。第一步獲取推送狀態(tài)這里我主要參考極光推送。然后我們?cè)趥?cè)做一些兼容處理跳轉(zhuǎn)到消息設(shè)置頁面需要跳轉(zhuǎn)時(shí),我們直接用這個(gè)函數(shù)就行了。

產(chǎn)品為了提高推送送達(dá)率,提了一個(gè)需求:在 APP 推送關(guān)閉的情況下顯示一個(gè)小 TIP,點(diǎn)擊 TIP 跳轉(zhuǎn)到 APP 消息設(shè)置界面

我們的 APP 是基于 React Native 開發(fā)的,這些功能 Facebook 官方?jīng)]有提供,需要我們開發(fā)對(duì)應(yīng)的原生模塊。

因?yàn)殚_發(fā)原生模塊屬于比較深入的內(nèi)容了,寫這篇文章時(shí)我就默認(rèn)閱讀者已經(jīng)具有一定的 Objective-CJava 開發(fā)能力,下面就直接貼代碼說思路了。

開發(fā)一個(gè)原生模塊的基礎(chǔ)知識(shí)可以直接看官方文檔,寫的很詳細(xì),我這里就不多重復(fù)了。

React Native 開發(fā) Android 原生模塊

React Native 開發(fā) iOS 原生模塊

下面開始分析實(shí)現(xiàn)。

第一步:獲取 APP 推送狀態(tài)

這里我主要參考極光推送。因?yàn)楣緝?nèi)部有統(tǒng)一的推送 SDK(主要整合了市面上多家推送服務(wù)公司和手機(jī)廠商的推送服務(wù)),一些極光推送很方便的功能暫時(shí)用不了,只能自己參考實(shí)現(xiàn)。


在我的實(shí)現(xiàn)里,獲取 APP 推送狀態(tài)主要做了兩件事:

兼容多個(gè)系統(tǒng)版本(這部分都是極光推送開發(fā)者的功勞);

Promise 的形式進(jìn)行封裝(極光推送是基于 callback 的)

getSystemNoticeStatus() 這個(gè)函數(shù),在 APP 推送開啟的情況下返回 true,未開啟情況返回 false

iOS 代碼如下:

參考鏈接:https://github.com/jpush/jpus...

RCT_EXPORT_METHOD( getSystemNoticeStatus: (RCTPromiseResolveBlock) resolve
rejecter: (RCTPromiseRejectBlock) reject )
{
    dispatch_async( dispatch_get_main_queue(), ^{
                float systemVersion = [[UIDevice currentDevice].systemVersion floatValue];


                if ( systemVersion >= 8.0 )
                {
                    UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings];
                    UIUserNotificationType type = settings.types;
                    if ( type == UIUserNotificationTypeNone )
                    {
                        return(resolve (@NO) );
                    }else  {
                        return(resolve (@YES) );
                    }
                }else if ( systemVersion >= 10.0 )
                {
                    [[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler: ^ (UNNotificationSettings * _Nonnull settings) {
                         switch ( settings.authorizationStatus )
                         {
                         case UNAuthorizationStatusDenied:
                         case UNAuthorizationStatusNotDetermined:
                             return(resolve (@NO) );
                             break;
                         case UNAuthorizationStatusAuthorized:
                             return(resolve (@YES) );
                             break;
                         }
                     }];
                }
            } );
}


Android 代碼如下:

參考鏈接:

https://github.com/jpush/jpus...

/**
 *  獲取 APP 系統(tǒng)通知狀態(tài)
 *
 *
 */
@ReactMethod
public void getSystemNoticeStatus(Promise promise) {
    promise.resolve(hasPermission("OP_POST_NOTIFICATION"));
}

private boolean hasPermission(String appOpsServiceId) {

    Context context = getReactApplicationContext();
    if (Build.VERSION.SDK_INT >= 24) {
        NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(
                Context.NOTIFICATION_SERVICE);
        return mNotificationManager.areNotificationsEnabled();
    }else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
        AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
        ApplicationInfo appInfo = context.getApplicationInfo();

        String pkg = context.getPackageName();
        int uid = appInfo.uid;
        Class appOpsClazz;

        try {
            appOpsClazz = Class.forName(AppOpsManager.class.getName());
            Method checkOpNoThrowMethod = appOpsClazz.getMethod("checkOpNoThrow", Integer.TYPE, Integer.TYPE,
                    String.class);
            Field opValue = appOpsClazz.getDeclaredField(appOpsServiceId);
            int value = opValue.getInt(Integer.class);
            Object result = checkOpNoThrowMethod.invoke(mAppOps, value, uid, pkg);
            return Integer.parseInt(result.toString()) == AppOpsManager.MODE_ALLOWED;
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    return false;
}

然后我們?cè)?JavaScript側(cè)直接引用就可

import {
    Platform,
    NativeModules,
} from "react-native";

function getSystemNoticeStatus() {
    NativeModules.appName.getSystemNoticeStatus().then((isOpen) => {
        console.log("getSystemNotice", isOpen) // 
    }).catch((e) => {
        console.log("getSystemNoticeStatus error", e)
    });
}

第二步:跳轉(zhuǎn)到 APP 設(shè)置界面

跳轉(zhuǎn)到 APP 設(shè)置界面也要考慮不同系統(tǒng)版本的兼容。比如說 iOS11+ 現(xiàn)在只允許跳轉(zhuǎn)到系統(tǒng)設(shè)置首頁/該應(yīng)用的設(shè)置界面,Android 還要考慮不同廠商對(duì) APP 設(shè)置頁面的魔改,很是頭疼。

首先 iOS 適配,我們直接跳轉(zhuǎn)到該應(yīng)用的設(shè)置首頁,就是下圖:

這個(gè)開發(fā)比較簡(jiǎn)單,直接在 React Native 中引用 Linking.openURL("app-settings:") 就行;

Android 就要多些一些代碼了,具體的適配可以看注釋:

/**
 *
 *  跳轉(zhuǎn)到系統(tǒng)通知設(shè)置界面
 *  this.appContext 表示文件/應(yīng)用的上下文環(huán)境
 *
 */
@ReactMethod
public void openSystemNoticeView(){
    try {
        // 跳轉(zhuǎn)到通知設(shè)置界面
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS);

        //這種方案適用于 API 26, 即8.0(含8.0)以上可以用
        intent.putExtra(EXTRA_APP_PACKAGE, this.appContext.getPackageName());
        intent.putExtra(EXTRA_CHANNEL_ID, this.appContext.getApplicationInfo().uid);

        //這種方案適用于 API21——25,即 5.0——7.1 之間的版本可以使用
        intent.putExtra("app_package", this.appContext.getPackageName());
        intent.putExtra("app_uid", this.appContext.getApplicationInfo().uid);

        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        this.appContext.startActivity(intent);
    } catch (Exception e) {
        e.printStackTrace();
        // 出現(xiàn)異常則跳轉(zhuǎn)到應(yīng)用設(shè)置界面:錘子
        Intent intent = new Intent();

        //下面這種方案是直接跳轉(zhuǎn)到當(dāng)前應(yīng)用的設(shè)置界面。
        //https://blog.csdn.net/ysy950803/article/details/71910806
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", this.appContext.getPackageName(), null);
        intent.setData(uri);

        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        this.appContext.startActivity(intent);
    }
}

然后我們?cè)?JavaScript 側(cè)做一些兼容處理:

import {
    Linking,
    Platform,
} from "react-native";

/**
 *  跳轉(zhuǎn)到 APP 消息設(shè)置頁面
 *
 */
export function openSystemNoticeSetting() {
    if (Platform.OS === "android") {
        NativeModules.appName.openSystemNoticeView();
    } else {
        Linking.openURL("app-settings:")
            .catch(err => console.log("openSystemSetting error", err));
    }
}


需要跳轉(zhuǎn)時(shí),我們直接用openSystemNoticeSetting() 這個(gè)函數(shù)就行了。

上面就是開發(fā)中遇到的兩個(gè)難點(diǎn),如果此篇文章你認(rèn)為對(duì)你有用,可以點(diǎn)個(gè)贊表示對(duì)我的鼓勵(lì),謝謝。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/109355.html

相關(guān)文章

  • React Native 轉(zhuǎn)到 APP 推送頁面獲取推送狀態(tài)

    摘要:產(chǎn)品為了提高推送送達(dá)率,提了一個(gè)需求在推送關(guān)閉的情況下顯示一個(gè)小,點(diǎn)擊跳轉(zhuǎn)到消息設(shè)置界面。第一步獲取推送狀態(tài)這里我主要參考極光推送。然后我們?cè)趥?cè)做一些兼容處理跳轉(zhuǎn)到消息設(shè)置頁面需要跳轉(zhuǎn)時(shí),我們直接用這個(gè)函數(shù)就行了。 產(chǎn)品為了提高推送送達(dá)率,提了一個(gè)需求:在 APP 推送關(guān)閉的情況下顯示一個(gè)小 TIP,點(diǎn)擊 TIP 跳轉(zhuǎn)到 APP 消息設(shè)置界面。 我們的 APP 是基于 React N...

    tinyq 評(píng)論0 收藏0
  • React Native 更新實(shí)踐(非熱更新)

    摘要:前言這周完成了公司更新非熱更新功能,在這里總結(jié)一下。即需要更新的代碼和資源時(shí),需要有這個(gè)更新的功能。這樣的話,用戶可以通過進(jìn)入的下載頁,來進(jìn)行的更新。具體代碼實(shí)現(xiàn)用到了中的。 前言 這周完成了公司 React Native app 更新(非熱更新)功能,在這里總結(jié)一下。 1.首先,提出一個(gè)問題 我們的 app(基于RN)已經(jīng)有 熱更新 功能了,為什么還要一個(gè)更新的功能? 因?yàn)闊岣轮粫?huì)...

    QiShare 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<