flutter iOS端實(shí)現(xiàn)在系統(tǒng)分享列表中加入自己的應(yīng)用

最近開發(fā)的Flutter APP iOS端需要用到一個(gè)從其他應(yīng)用分享上傳附件的功能筋量,這里記錄一下實(shí)現(xiàn)的過程

配置

要讓系統(tǒng)分享的列表里出現(xiàn)我們自己的APP盈厘,首先是需要小小的配置一下。打開項(xiàng)目/ios/Runner/Info.plist文件

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
             <key>CFBundleTypeName</key>
             <string>Text</string>
             <key>LSHandlerRank</key>
             <string>Alternate</string>
             <key>LSItemContentTypes</key>
             <array>
                 <string>public.text</string>
                 <string>public.plain-text</string>
                 <string>public.utf8-plain-text</string>
                 <string>public.utf16-external-plain-text</string>
                 <string>public.utf16-plain-text</string>
                 <string>com.apple.traditional-mac-plain-text</string>
             </array>
         </dict>
         <dict>
             <key>CFBundleTypeName</key>
             <string>PDF</string>
             <key>LSHandlerRank</key>
             <string>Owner</string>
             <key>LSItemContentTypes</key>
             <array>
                 <string>com.adobe.pdf</string>
             </array>
         </dict>
         <dict>
             <key>CFBundleTypeName</key>
             <string>Microsoft Word</string>
             <key>LSHandlerRank</key>
             <string>Alternate</string>
             <key>LSItemContentTypes</key>
             <array>
                 <string>com.microsoft.word.docx</string>
                 <string>com.microsoft.word.doc</string>
                 <string>com.microsoft.word.wordml</string>
                 <string>org.openxmlformats.wordprocessingml.document</string>
            </array>
        </dict>
</array>

這樣的話就配置完成了剧蚣。順便解釋下每個(gè)字段的意思

CFBundleDocumentTypes:指的是可以接收文件的類型鸭巴,比如圖片、文檔立轧、壓縮包等等

LSItemContentTypes: 指的是具體可以接收的類型,比如txtjpg氛改、doc帐萎、pdf等,這個(gè)key對應(yīng)的是一個(gè)Array胜卤,Array中是支持字段的類型疆导。支持的字段類型參考這里

應(yīng)用內(nèi)處理

分享過來的文件會存儲在沙盒文件夾Documents/Inbox下,所以我們這邊需要在AppDelegate中重寫openURL方法瑰艘。

swift

我們在項(xiàng)目目錄ios/下是鬼,雙擊Runner.xcworkspace文件,就會在xcode中打開工程目錄紫新,我們編輯AppDelegate.swift文件。
如下

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
   // new add
   // 文件沙盒路徑 
    var lastFilePath = String.init("");
  
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
  
    // new add
    let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
    let yizhipinToolsChannel = FlutterMethodChannel.init(name: "zrong.life/tools", binaryMessenger: controller as! FlutterBinaryMessenger)
  
    yizhipinToolsChannel.setMethodCallHandler({
        (call: FlutterMethodCall, result: FlutterResult) -> Void in
        if (call.method == "getLastShareFilePath") {
            self.getLastShareFilePath(result: result)
        } else if (call.method == "clearLastShareFilePath") {
            self.clearLastShareFilePath(result: result)
        }
    })
  
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
  
    // new add
    override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        if url.scheme == "file" {
            let path = url.absoluteString
            lastFilePath = path
            return true
        }
        return super.application(app, open: url, options: options)
    }
  
    // new add
    private func getLastShareFilePath(result: FlutterResult) {
        result(lastFilePath)
    }
  
   // new add
    private func clearLastShareFilePath(result: FlutterResult) {
        lastFilePath = ""
        result(true)
    }
}

在上面李剖,我們重寫了openURL的方法芒率,并且創(chuàng)建了一個(gè)FlutterMethodChannel,并且創(chuàng)建了兩個(gè)方法getLastShareFilePath篙顺、clearLastShareFilePath偶芍。這兩個(gè)方法的作用是:獲取最后分享文件的路徑,清除最后分享文件的路徑德玫。

Flutter處理

在上面我們實(shí)現(xiàn)了FlutterMethodChannel匪蟀。這樣還不夠,我們需要在flutter中來建一個(gè)通道來調(diào)用宰僧。

我們新建一個(gè)文件tools.dart

import 'package:flutter/services.dart';

class Tools {
  static const MethodChannel _channel = MethodChannel('yzp.cn/tools');

  Future<String> get lastShareFilePath async {
    String path = await _channel.invokeMethod('getLastShareFilePath');
    return path;
  }

  Future<bool> get clearLastShareFilePath async {
    bool status = await _channel.invokeMethod('clearLastShareFilePath');
    return status;
  }
}

然后材彪,我們就能在項(xiàng)目中使用這個(gè)方法了
main.dart

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  @override
  void initState() {
    super.initState();

    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.resumed) {
      // 當(dāng)APP打開時(shí)我們?nèi)カ@取分享文件的鏈接
      getLastShareFilePath();
    }
  }
  
  getLastShareFilePath () async {
    String path = await Tools().getLastShareFilePath;
    print(path);
  
    // 這里記得將最后一次分享的文件鏈接清空
    await Tools().clearLastShareFilePath;
  }
}

這樣的話,我們就可以實(shí)現(xiàn)在ios系統(tǒng)分享中加上自己的應(yīng)用啦琴儿。并且可以在Flutter中操作這樣文件啦

結(jié)尾

如果在使用途中遇到什么問題或者BUG段化,請?jiān)谙路搅粞苑答?/p>

原文地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市造成,隨后出現(xiàn)的幾起案子显熏,更是在濱河造成了極大的恐慌,老刑警劉巖晒屎,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喘蟆,死亡現(xiàn)場離奇詭異,居然都是意外死亡鼓鲁,警方通過查閱死者的電腦和手機(jī)蕴轨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坐桩,“玉大人尺棋,你說我怎么就攤上這事。” “怎么了膘螟?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵成福,是天一觀的道長。 經(jīng)常有香客問我荆残,道長奴艾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任内斯,我火速辦了婚禮蕴潦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俘闯。我一直安慰自己潭苞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布真朗。 她就那樣靜靜地躺著此疹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遮婶。 梳的紋絲不亂的頭發(fā)上蝗碎,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機(jī)與錄音旗扑,去河邊找鬼蹦骑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛臀防,可吹牛的內(nèi)容都是我干的眠菇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼清钥,長吁一口氣:“原來是場噩夢啊……” “哼琼锋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起祟昭,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤缕坎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后篡悟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谜叹,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年搬葬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荷腊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡急凰,死狀恐怖女仰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤疾忍,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布乔外,位于F島的核電站,受9級特大地震影響一罩,放射性物質(zhì)發(fā)生泄漏杨幼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一聂渊、第九天 我趴在偏房一處隱蔽的房頂上張望差购。 院中可真熱鬧,春花似錦汉嗽、人聲如沸欲逃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暖夭。三九已至,卻和暖如春撵孤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背竭望。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工邪码, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咬清。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓闭专,卻偏偏與公主長得像,于是被迫代替她去往敵國和親旧烧。 傳聞我的和親對象是個(gè)殘疾皇子影钉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容